Android开发 NFC技术开发(一)

来源:互联网 发布:钢琴调律软件 编辑:程序博客网 时间:2024/05/17 22:26

概述

NFC是一套短距离的无线通信,通常距离是4厘米或更短。NFC工作频率是13.56M Hz,传输速率是106kbit/s 到848kbit/s. NFC总是在一个发起者和一个被动目标之间发生。发起者发出近场无线电波,这个近场可以给被动目标供电。这些被动的目标包括不需要电源的标签,卡,也可以是有电源的设备。与其他无线通信技术比较, 例如蓝牙和WiFi,NFC提供更低带宽和距离,并且低成本,不需要供电,不需要实现匹配,整个通信过程仅仅是短短的靠近一秒就能完成。一个带有NFC支持的android设备通常是一个发起者。也可以作为NFC的读写设备。他将检测NFC tags并且打开一个Activity来处理,从Android 2.3.3起支持有限的P2P传输,NFC会直接利用蓝牙传输,这种技术被称为Android Beam,Android Beam传输数据的两部设备不再限于4厘米之内。
NfcManager一个NFC adapter的管理器,可以列出所有此android设备支持的NFC adapter.只不过大部分android 设备只有一个NFC adapter,所以你大部分情况下可以直接用静态方法getDefaultAdapter(context)来取适配器。
NfcAdapter表示本设备的NFC adapter,可以定义Intent来请求将系统检测到tags的提醒发送到你的Activity.并提供方法去注册前台tag提醒发布和前台NDEF推送。 前台NDEF推送是当前android版本唯一支持的p2p NFC通信方式。
PendingIntent通知Activity,一旦截获NFC消息,就会通过PendingIntent调用窗口
**NdefMessage**and**NdefRecord**NDEF是NFC论坛定义的数据结构,用来有效的存数据到NFC tags.比如文本,URL,和其他MIME类型。一个NdefMessage扮演一个容器,这个容器存哪些发送和读到的数据。一个NdefMessage对象包含0或多个NdefRecord,每个NDEF record有一个类型,比如文本,URL,智慧型海报/广告,或其他MIME数据。在NDEFMessage里的第一个NfcRecord的类型用来发送tag到一个android设备上的activity.
Tag标识一个被动的NFC目标,比如tag,card,钥匙挂扣,甚至是一个电话模拟的的NFC卡.当一个tag被检测到,一个tag对象将被创建并且封装到一个Intent里,然后NFC 发布系统将这个Intent用startActivity发送到注册了接受这种Intent的activity里。你可以用getTechList()方法来得到这个tag支持的技术细节和创建一个android.nfc.tech提供的相应的TagTechnology对象.
NFC协议标准,tag支持的不同TagTechnology对象:
1. NfcA,支持ISO 14443-3A 标准的操作。Provides access to NFC-A (ISO 14443-3A) properties and I/O operations.
2. NfcB,Provides access to NFC-B (ISO 14443-3B) properties and I/O operations.
3. NfcF,Provides access to NFC-F (JIS 6319-4) properties and I/O operations.
4. NfcV,Provides access to NFC-V (ISO 15693) properties and I/O operations.
5. IsoDep,Provides access to ISO-DEP (ISO 14443-4) properties and I/O operations.
6. Ndef,提供对那些被格式化为NDEF的tag的数据的访问和其他操作。 Provides access to NDEF data and operations on NFC tags that have been formatted as NDEF.

其中北京市政交通卡2008以前发行的卡显示类型为 MifareClassic + NfcA,08年以后的卡显示为 IsoDep,二代身份证的类型是 NfcB,Android 文件分享用的是Ndef格式传输数据也就是Android Beam传输的数据。
如果你的数据类是NDEF格式数据,有两个类:
1)NdefMessage:描述NDEF格式的信息,实际上我们写入NFC标签的就是NdefMessage对象。
2)NdefRecord:描述NDEF信息的一个信息段,一个NdefMessage可能包含一个或者多个NdefRecord。

下面是以IsoDep数据类型北京市政一卡通为例

private NfcAdapter mNfcAdapter;private PendingIntent mPendingIntent;/** * 启动Activity,界面可见时 */@Overrideprotected void onStart() {    super.onStart();    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);    //一旦截获NFC消息,就会通过PendingIntent调用窗口    mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);}/** * 获得焦点,按钮可以点击 */@Overridepublic void onResume() {    super.onResume();    //设置处理优于所有其他NFC的处理    if (mNfcAdapter != null)        mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);}/** * 暂停Activity,界面获取焦点,按钮可以点击 */@Overridepublic void onPause() {    super.onPause();    //恢复默认状态    if (mNfcAdapter != null)        mNfcAdapter.disableForegroundDispatch(this);}@Overridepublic void onNewIntent(Intent intent) {    String idm = null;    StringBuffer idmByte = new StringBuffer();    byte[] rawIdm = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);    Log.i("tag","-------"+Arrays.toString(rawIdm));    if (rawIdm != null) {        for (int i = 0; i < rawIdm.length; i++) {            idmByte.append(Integer.toHexString(rawIdm[i] & 0xff));        }        idm = idmByte.toString();    }    mNfcText.setText("数据:" + idm);}

源码

1 0
原创粉丝点击