一、什么是NFC
NFC 是 Near Field Communication (近场通信)的缩写,是一种短距离的无线通信技术,在4cm以内才能建立连接。与蓝牙、WiFi相比,NFC的通信距离更短,数据传输速度更快。NFC允许在NFC标签与Android设备或Android设备之间传输数据。NFC主要有三种通信模式:读写模式、P2P模式、卡模拟模式。
读写模式:允许带NFC功能的设备读写NFC 标签。(例如手机便可以充当NFC标签的读卡器或写卡器)
P2P模式:允许NFC设备与其他NFC设备(如带NFC功能的Android手机之间)交换数据,这种操作模式在Android Beam中被使用。
卡模式模式:允许NFC设备将自己模拟成一张NFC卡。而这张模拟出来的NFC卡可以供其他NFC reader 读取信息。
二、NFC的使用场景
NFC前景光明,已经成为时下讨论的一个热点,与蓝牙、WiFi在通信方面形成鼎立之势,越来越多手机也开始支持NFC,NFC 在生活中的应用场景越来越广泛。
- NFC手机变身公交卡、门禁卡…
- NFC支付与充值
- 耳机、打印机、镜头以及各种智能穿戴设备可以利用NFC快速配对连接
- 预先写入功能的NFC贴片让手机快速进行场景切换。
- NFC交换名片
- …………..
三、NFC 数据交换格式
虽然NFC标签所含储存的数据可为任何形式,但许多Android Frameword API 基于NFC 论坛标准的一种数据格式 NDEF(NFC Data Exchange Format).
NFC 通过 NDEF Message (NDEF消息)传输数据,而NDEF Message 由多条 NDEF Record(NDEF记录)组成。
NDEF Record 的格式如下:
其中第一个byte记录的信息含义如下:
名称 | 大小 | 描述 |
---|---|---|
MB(Message Begin) | 1 bit | 1/true表示该记录是首记录,0/false表示该记录非首记录 |
ME(Message End) | 1 bit | 1/true表示该记录是尾记录,0/false表示该记录后还有记录 |
CF(Chunk Flag) | 1 bit | 0表示该记录未被切换,1表示该记录被切块 |
SR(Short Record) | 1 bit | 0表示该记录是长记录,PAYLOAD LENGTH占4 Byte;1表示该记录是短记录,PAYLOAD LENGTH占1 Byte |
IL(ID_LENGTH) | 1 bit | 0表示该记录没有ID_LENGTH和ID域,1表示该记录有ID_LENGTH和ID域 |
TNF (Type Name Format) | 3 bit | 用于描述记录中数据(Payload)的类型,如0x01(即二进制001)表示well-known type |
四、TNF 和 RTD
- Empty:该Record 中没有数据,即相当于一个空的NFC Record
- NFC Forum Well-Known Type :由NFC Forum 定义的一些常见的数据类型,包括 URI 、TEXT等,其格式遵循NFC Forum RTD (Record Type Definition)规范。
- MIME:Multipurpose Internet Mail Extensions的缩写,遵循RFC2046规范。
- Absolute URI:绝对URI
- NFC Forum External Type : 为第三方组织定义的类型
- Unknown:表示Payload中的数据类型未知。
- Unchanged:这种类型的数据用于NFC Record分片。例如一个大的数据需要 通过多个NFC Record来承载,除第一个NFC Record分片外,该数据对应的其他NFC Record分片都必须设置TNF为Unchanged。
在TNF七大类型中,NFC Forum通过RTD规范定义了其中的WKT(Well-Known Type)和External Type两种类型。
WKT就是NFC Forum自己定义的一些常用数据类型,目前常用类型如下:
URI Record Type:用于存储URI数据,Record中Type取值为 “U”
Text Record Type:用于存储文本数据,Record中Type取值为 “T”
Signature Record Type:用于存储数字签名数据,Record中Type取值为”Sig”
Smart Poster Record Type:智能海報,用于存储与海报相关的一些咨询信息,如图片、相关介紹等,Record中Type取值为”Sp”。
Generic Control Record Type:用于传递控制信息,Record中Type取值 为”Ge”
External Type:为第三方组织定义的类型,目前NFC Forum沒有定义相关的数据类型
五、Well-Known Type (TNF=ox01)
RTD_TEXT
文本记录类型,NDEF Record中Type取值为 “T”,Payload的组成结构如下:
Name | Offset(bytes) | Length(bytes) | Content |
---|---|---|---|
Status | 0 | 1 | 这个byte最高位(第7位)为0,表示实际的文本内容采用UTF-8编码,为1表示采用UTF-16码表,第6位固定为0,第0至5位表示Language Code的长度 |
Language Code | 1 | < n > | 语言码,文本使用的语言。例如”en-US”、”jp”等,这个字段的信息使用US-ASCII编码 |
Text | n+1 | < m > | 实际的文本内容,编码方式由Status字段最高位决定 |
RTD_TEXT 实例分析
NDEF数据: D1 01 0F 54 02 65 6E 68 65 6C 6C 6F 2C 77 6F 72 6C 64 21
Hex值 | 解析 |
---|---|
D1=11010001 B | 1、该NDEF只有1个Record 2、该NDEF为短记录,且无ID和ID_Length 3、NFC Forum well-known type |
01 | Type_Length =1 |
0F | Payload_Length=15 |
54 | Type=54=”T”,Type为文本记录类型 |
02 | 语言码长度为2 |
65 6E | 65 6E = “en”, 表示文本是英语 |
68 65 6C 6C 6F 2C 77 6F 72 6C 64 21 | hello,world! |
解析结果: hello,world!
RTD_URI
URI 记录类型,NDEF Record中Type取值为 “U”,Payload的组成结构如下:
Name | Offset | Size | Value | Description |
---|---|---|---|---|
Identifier code | 0 | 1 | URI identifier code | URI identifier code,对应下表 |
URI Field | 1 | N | UTF-8编码的字符串 | URI的剩下的值或完整值(当 identifier code 为 0x00) |
URI Identifier Code 对应表
Decimal | Hex | Protocol |
---|---|---|
0 | 0x00 | 无前缀,URI Field 是包含完整的URI |
1 | 0x01 | http://www. |
2 | 0x02 | https://www. |
3 | 0x03 | http:// |
4 | 0x04 | https:// |
5 | 0x05 | tel: |
6 | 0x06 | mailto: |
7 | 0x07 | ftp://anonymous:anonymous@ |
8 | 0x08 | ftp://ftp. |
9 | 0x09 | ftps:// |
RTD_URI 实例分析
NDEF数据: D1 01 0A 55 01 62 61 69 64 75 2E 63 6F 6D
Hex值 | 解析 |
---|---|
D1=11010001 B | 1、该NDEF只有1个Record 2、该NDEF为短记录,且无ID和ID_Length 3、NFC Forum well-known type |
01 | Type_Length =1 |
0A | Payload_Length=10 |
55 | Type=55=”U”,Type为URI记录类型 |
01 | identifier code 对应 http://www. |
62 61 69 64 75 2E 63 6F 6D | baidu.com |
解析结果: http://www.baidu.com
对NFC协议知识的理解和掌握,是开发Android NFC 应用的必备基础。后续将会整理 Android NFC 开发中的三种模式:读写模式、点对点模式、卡模拟模式。