• 概述

近场通信(Near-field communication,简称NFC)技术可以提供短距离无线连接,实现电子设备间的双向交互通信。NFC技术由RFID(非接触式射频识别)演变而来,但NFC有特定的标准集,确保具有NFC功能的设备的互操作性。

NFC采用电磁耦合感应技术,电磁场频率是13.56MHz,该载波频段是全球无需许可证的波段。发起设备用13.56MHz信号激励天线,产生磁场。通过近场耦合,将能量传递给目标。目标对磁场进行调制,将数据返回给发起设备完成通信。

 

                                         

NFC 数据 发送和接收 nfc数据传输原理_数据

 

  • 工作模式

 

被动模式

在被动模式下,仅有一个NFC设备产生射频场(比如读卡器与无源电子标签)。根据天线尺寸与场调制幅度不同,其工作距离可以达到10cm,数据速率支持106kbit/s到848kbit/s。

 

主动模式

在主动模式下,两个NFC设备均可以产生射频场。相比于被动模式,工作距离可以达到20cm。如果使用PSK(相移键控)调制方式,数据速率可达到6.78Mbit/s。

  1. 通信模式

 

NFC支持三种通信模式:

 

读写模式(NFC reader/writer)

在读写模式下,系统执行非接触式读写功能。该设备读取数据或写入数据到标签或设备中。例如,靠近NFC标签的手机会推送一个信息或检索一个URL并链接到网站在手机中打开。该模式下数据传输不安全。

 

卡仿真模式(NFC card emulation)

在卡仿真模式下,NFC设备工作类似于标准的非接触式智能卡。仿真智能卡的NFC设备通常处于被动NFC模式,此时的数据传输是安全的。

此种方式下,有一个极大的优点,那就是卡片通过非接触读卡器的 RF 域来供电,即便是寄主设备(如手机)没电也可以工作。

 

点对点模式(NFC pear to pear)

在点对点模式下,两个内置NFC设备之间可以进行双向数据传输。该模式下数据交换相比其他模式更快,因此可以交换更多的数据。

————————————————

 

                                                     

NFC 数据 发送和接收 nfc数据传输原理_android_02

 

  • 标签类型

NFC论坛定义了如下几种标签:

NFC 数据 发送和接收 nfc数据传输原理_nfc_03


具体详细内容可以购买标准协议进行查看。

  • 协议框架

 

NFC 数据 发送和接收 nfc数据传输原理_android_04


 

1,设置权限
  <uses-permission android:name="android.permission.NFC" />

2,限制Android版本
  <uses-sdk android:minSdkVersion="14"/>

3,限制安装的设备 如果不支持nfc不安装
  <uses-feature android:name="android.hardware.nfc" android:required="true" />

4,定义可接收nfc 数据的Activity 


 

 

  • 一个完整的android例子

关键代码

http://gitlab.gbcom.com.cn/mps/androidnfc.git

 

NFC 数据 发送和接收 nfc数据传输原理_android_05

 

NFC 数据 发送和接收 nfc数据传输原理_nfc_06

 

可购买实验物料:

https://item.jd.com/69035769073.html

 

 

  • NFC数据解析

 

https://gitee.com/xiaobug/nfcreadandwritedemo

 

 

  • NFC文本格式解析

编写解析NDEF格式数据的类

不管什么格式的数据本质上都是由一些字节组成的。对于NDEF文本格式来说。这些数据的第1个字节描述了数据的状态,然后若干个字节描述文本的语言编码,最后剩余字节表示文本数据。这些数据格式由NFC Forum的相关规范定义,可以从下面的地址下载相关的规范。

 

http://www.nfc-forum.org/specs/spec_dashboard

  1. NDEF文本数据格式

 

NFC 数据 发送和接收 nfc数据传输原理_NFC 数据 发送和接收_07

状态字节编码格式

NFC 数据 发送和接收 nfc数据传输原理_nfc_08

 

  1. 判断数据是否为NDEF格式

获取NFC标签中的数据要通过NdefRecord.getPayload方法完成。当然,在处理这些数据之前,最好判断一下NdefRecord对象中存储的是不是NDEF文本格式数据。

判断的标准有如下两个

 

TNF(类型名格式,Type Name Format)必须是NdefRecord.TNF_WELL_KNOWN。

可变的长度类型必须是NdefRecord.RTD_TEXT。

  1. 项目实践
  1. 获取唯一标识

EXTRA_ID = "android.nfc.extra.ID"

 

byte[] bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);

String tagID = bytesToHexString(bytesId);

log("readNFC_ID: " + tagID);

 

  1. 写入APP包名

Com.gbcom.mps

 这样,将碰到NFC后,先跳到这个 APP;

点击打卡。

nfcHelper.writeNFC_RunApp