安卓NFC通信

1 引言

  NFC是近场通信(near field communication)的缩写。NFC技术是一种新兴的技术,使用了NFC技术的设备(比如手机)可以在彼此靠近的情况下(一般小于10cm)进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。

2 NFC技术

2.1 工作模式

NFC根据业务模式不同大概分为三种模式。
(1)读卡器模式
  数据在NFC芯片中,可以简单理解成“刷标签”。本质上就是通过支持NFC的手机或其它电子设备从带有NFC芯片的标签、贴纸、名片等媒介中读写信息。通常NFC标签是不需要外部供电的。当支持NFC的外设向NFC读写数据时,它会发送某种磁场,而这个磁场会自动的向NFC标签供电。
(2)仿真卡模式
  数据在支持NFC的手机或其它电子设备中,可以简单理解成“刷手机”。本质上就是将支持NFC的手机或其它电子设备当成借记卡、公交卡、门禁卡等IC卡使用。基本原理是将相应IC卡中的信息凭证封装成数据包存储在支持NFC的外设中 。
在使用时还需要一个NFC射频器(相当于刷卡器)。将手机靠近NFC射频器,手机就会接收到NFC射频器发过来的信号,在通过一系列复杂的验证后,将IC卡的相应信息传入NFC射频器,最后这些IC卡数据会传入NFC射频器连接的电脑,并进行相应的处理(如电子转帐、开门等操作)。
(3)点对点模式
  该模式与蓝牙、红外差不多,用于不同NFC设备之间进行数据交换,不过这个模式已经没有有“刷”的感觉了。其有效距离一般不能超过4厘米,但传输建立速度要比红外和蓝牙技术快很多,传输速度比红外块得多,如过双方都使用Android4.2,NFC会直接利用蓝牙传输。这种技术被称为Android Beam。所以使用Android Beam传输数据的两部设备不再限于4厘米之内。
  点对点模式的典型应用是两部支持NFC的手机或平板电脑实现数据的点对点传输,例如,交换图片或同步设备联系人。因此,通过NFC,多个设备如数字相机,计算机,手机之间,都可以快速连接,并交换资料或者服务。

2.2 重要参数

(1)有效传输范围<=10cm
(2)传输速度有三种:106kbps; 212kbps; 424kbps
(3)建立连接时间<1s
(4)NFC工作频率为13.65兆赫兹

3 开发流程

3.1 添加NFC权限

  首先,在AndroidManifests.xml中声明NFC和添加相应的权限。

<uses-feature  android:name="android.hardware.nfc"  
        android:required="true" />  
<uses-permission android:name="android.permission.NFC" />

3.2 添加识别NFC标签

  当android设备扫描到一个NFC标签时,会自动寻找最适合的Activity来处理这个Tag。在Activity中添加intent-filter标签,当扫描到NFC设备时系统会打开此Activity。配置Activity的launchMode的属性为singleTop,并添加 类型支持信息。

<activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/filter_nfc"></meta-data>

 </activity>

filter_nfc.xml文件

<?xml version="1.0" encoding="utf-8" ?>
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech-list> --------------------------------A组
        <tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech>      
        <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech>
        </tech-list>
        <tech-list>-----------------------------------------B组
        <tech>android.nfc.tech.NfcV</tech> <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
        </tech-list>
  </resources>

3.3 初始化适配器

  NFC开发需要使用安卓系统提供的NfcAdapter对象,使用该对象管理NFC设备。

 //获取NfcAdapter对象,此方法与获取蓝牙适配器对象类似
 mNfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());
        if (mNfcAdapter == null) {
            Toast.makeText(this, "该设备不支持nfc", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        if (!mNfcAdapter.isEnabled()) {
            startActivity(new Intent("android.settings.NFC_SETTINGS"));
            Toast.makeText(this, "设备未开启nfc", Toast.LENGTH_SHORT).show();
        }

3.4 启用NFC前台调度

  在Activity的onResume方法中打开前台调度。
```

top Created with Sketch.