Android开发 NFC技术开发(一)

##概述
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调用窗口
NdefMessageandNdefRecordNDEF是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对象:

  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,界面可见时
     */
    @Override
    protected void onStart() {
        super.onStart();
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        //一旦截获NFC消息,就会通过PendingIntent调用窗口
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);
    }

    /**
     * 获得焦点,按钮可以点击
     */
    @Override
    public void onResume() {
        super.onResume();
        //设置处理优于所有其他NFC的处理
        if (mNfcAdapter != null)
            mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
    }

    /**
     * 暂停Activity,界面获取焦点,按钮可以点击
     */
    @Override
    public void onPause() {
        super.onPause();
        //恢复默认状态
        if (mNfcAdapter != null)
            mNfcAdapter.disableForegroundDispatch(this);
    }
	@Override
    public 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);

    }
[源码](https://github.com/XHiStone/NFCDemo)

猜你喜欢

转载自blog.csdn.net/xhf_123/article/details/53640418