以支持NFC功能的智能终端为例,NFC R/W运行模式所包含的组件如图8-4[6]所示:
:-: ![](http://img.blog.csdn.net/20140322214559296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图8-4 R/W运行模式组件
图8-4展示了一个包含NFC芯片的智能终端与NFC Tag交互所涉及到的组件,其中:
* 先看最左边的智能终端,它扮演NFC Reader角色。位于其内部的NFC芯片包含NFC Controller(NFC控制器,它可和Device Host或Secure Element安全单元交互)、Antenna(天线)和Contactless Front-End(非接触式前端,简称CLF,负责射频信号的调制解调等工作)三个部分。注意,图中所示的SWP等内容将留待8.2.4节再介绍。
* 在R/W模式中,交互操作的发起方只能是NFC Reader,故它也被称为Initiator或Active Device。
* 再来看最右边的NFC Tag,由于它需要NFC Reader通过电磁感应为其提供电能,所以在R/W模式中,NFC Tag只能作为交互操作的Target(也被称为Passive Device)。NFC Forum定义了四种类型的Tag,分别为Type 1、Type 2、Type 3和Type 4。这四种类型NFC Tag的区别在于存储空间大小,数据传输率以及底层使用的协议上。下文的表8-1列举了它们的不同点。
NFC Forum定义了两个通用的数据结构用于在NFC Device之间(包括R/W模式中的NFC Reader和NFC Tag)传递数据。这两个通用数据结构分别是NFC Data Exchange Format(简写为NDEF)以及NFC Record。
我们先来看NFC 4种不同Type的Tag有何区别,如表8-1[7]所示:
:-: 表8-1 NFC Tag Type说明
| 参数 | Type 1 | Type 2 | Type 3| Type 4 |
| --- | --- | --- | --- | --- |
| 对应规范 | ISO 14443 Type A | ISO 14443 Type A | Felica | ISO 14443 Type A,Type B |
| 常见芯片名 | Topaz | MIFARE | Felica | MIFARE-DESFire |
| 存储容量 | 最大1KB | 最大2KB | 最大1MB | 最大64KB |
| 读写速率 | 106kbps | 106kbps | 212kbps | 106-424kbps |
| 价格 | 低 | 低 | 高 | 中等/高 |
| 安全性 | 数字签名保护 | 不安全 | 数字签名保护 | 可选 |
| 说明 | Topaz由Innovision公司推出 | MIFARE由NXP公司推出 |由Sony公司推出,价格比较贵 | 这类芯片在出厂时就被配置好是否只读或可读写 |
>[info] 注意:这里需要特别指出的一点是:虽然NFC Froum只有四种Type的Tag,但由于NFC本身源自RFID技术,二者在一些底层协议上也相互兼容,所以很多RFID Tag也能被NFC Reader识别和操作。为了书写方便,除非特别说明,本章所指的NFC Tag也包括那些和NFC相关规范兼容的RFID Tag。
虽然NFC Tag有四种不同类型(由上文可知,实际上能被NFC Reader读写的RFID Tag还远不止四种),但为了保证最大得兼容性,NFC Forum建议NFC设备之间尽量使用通用数据结构NDEF和NFC Record来交换信息。
NFC R/W模式涉及到的规范比较多,包括:
NFC Reader如何与不同Type的Tag交互,这部分内容涉及到非常底层的一些协议。
NDEF和一些常用数据类型定义。
出于篇幅和实用性考虑,笔者拟仅介绍NDEF和相关的数据类型,感兴趣的读者可自行研究NFC Reader和Tag之间的交互协议。
**1、NDEF和NFC Record介绍**
**①、NDEF和NFC Record[8][9]之间的关系**
根据NFC Forum的定义,R/W模式下,NFC设备之间每一次交互的数据都会封装在一个NDEF Message中,而一个NDEF Message可以包含多个NFC Record,真正的数据则封装在NFC Record中。图8-5展示了NDEF Message和NFC Record之间的关系。
:-: ![](http://img.blog.csdn.net/20140322214619171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图8-5 NDEF Message和NFC Record的关系
由图8-5可知:一个NDEF Message可包含一个或多个NFC Record。在一个NDEF Message中,第一个NFC Record需设置其MB位(Message Begin)为1,表示它是该消息中第一个NFC Record,最后一个NFC Record需设置ME位(Message End)位为1,表示它是此消息中最后一个NFC Record。
NFC Record本身的组织结构则如图8-6所示:
:-: ![](http://img.blog.csdn.net/20140322214704890?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图8-6 NFC Record组织结构
由图8-6可知:NFC Record分为NFC Record Header(头部信息)和Payload(数据载荷)两大部分。
Record Header中最重要的是其第一个字节。该字节有6个标志信息,它们分别是
* MB(Message Begin标志)
* ME(Message End标志)
* CF(Chunk Flag标志,表示该Record是否为分片Record)
* SR(Short Record标志。如果该标志被设置,则图8-6中的4个PayLoad Length字段仅需一个,这表明PayLoad数据长度将限制在255个字节以内)
* IL(ID_LENGTH标志,它用于指明Header中是否包含ID Length和ID这两个字段)
* TNF(Type Name Format标志,用于指明PayLoad的类型,NFC Forum定义了一些常用的PayLoad类型,详情见下文分析)。
* Type Length指明Record Header中Type字段的长度。
* PayLoad Length 3到PayLoad Length 0这4个字段共同指明PayLoad字段的长度。如果SR标志被设置,则Record Header仅包含一个PayLoad Length字段。
* ID Length指明ID字段的长度。如图IL标志未设置,则ID Length和ID字段都不存在。
* Type字段表明PayLoad的类型,NFC Forum定义了诸如URI、MIME等类型的Type,其目的是为了方便不同的应用来处理不同Type的数据,例如URI类型的数据就交给浏览器来处理。
* ID:ID需要配合URI类型的PayLoad一起使用,它使得一个NFC Record能通过ID来指向另外一个NFC Record。
NFC Record中,常令初学者感到困惑的是TNF字段,其作用是什么?来看下文。
**②、TNF和RTD**
TNF用于描述一个NFC Record中数据(Payload)的类型,为了方便应用程序能正确解析NFC Record中的数据,NFC Forum规定了一些常用的数据类型,如表8-2所示。
:-: ![](https://box.kancloud.cn/5023b2e77ed86c30fe5e6412dd201c88_1256x247.jpg)
表8-2TNF取值
目前NFC支持七种数据类型。
* 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规范。例如,当TNF取值为MIME时,其Type字段取值可为"text/plain"或"image/png"等。
* Absolute URI:绝对URI,遵循RFC 3986规范。例如某文件的绝对URI为"http://android.com/robots.txt" ,而其相对URI则为"robots.txt"。
* NFC Forum External Type:也由NFC Forum的RTD规范定义,下文将介绍它。
* Unknown:代表Payload中的数据类型未知,它和MIME类型"application/octet-stream"有些类似,这种类型的数据由相应的应用程序来解析。
* Unchanged:这种类型的数据用于NFC Record分片。例如一个大的数据需要通过多个NFC Record来承载,除第一个NFC Record分片外,该数据对应的其他NFC Record分片都必须设置TNF为Unchanged。关于这部分内容,读者可参考NDEF规范的2.3.3节"Record Chunks"。
在TNF七大类型中,NFC Forum通过RTD规范定义了其中的WKT(Well-Known Type)和External Type两种类型。虽然RTD规范全长只有20来页,但阅读起来比较枯燥,在此,笔者总结其核心内容。
简单点说,WKT就是NFC Forum自己定义的一些常用数据类型,目前常用类型如下。
* URI Record Type:用于存储URI数据,对应Type字段取值为"U"。
* Text Record Type:用于存储文本数据,对应Type字段取值为"T"。
* Signature Record Type:用于存储数字签名数据,对应Type字段取值为"Sig"。
* Smart Poster Record Type:智能海报,用于存储与该海报相关的一些资讯信息,如图片、相关介绍等,对应Type字段取值为"Sp"。
* Generic Control Record Type:用于传递控制信息,对应Type字段取值为"Gc"。
* External Type:为第三方组织定义的类型,目前NFC Forum没有定义相关的数据类型。
>[info] 提示 NFC Forum目前定义的所有WKT类型列表可参考http://www.nfcforum.org/specs/nfc_forum_assigned_numbers_register。
掌握了上述理论知识后,下面将通过两个实例来看看NFC Record各个字段到底该如何设置。
**2、NFC Record实例[10][11]**
本节这两个实例分别来自URI Record Type规范和TEXT Record Type规范。先来看URI Record Type实例。
**①、URI Record Type实例**
URI Record Type属于NFC Forum Well-known Type的一种,其对应的Type字段取值为"U"。对于这种类型的NFC Record,其Payload组织结构如表8-3所示。
:-: ![](https://box.kancloud.cn/3dea5c1a03489cf711578410477e5cf0_1256x190.jpg)
表8-3 URI Record Payload组织结构
在URI Record Payload中,第一个字节指明URI的ID码,表8-4为NFC Forum定义的几种ID码。
:-: ![](https://box.kancloud.cn/9a2fa0d10bb3891c1699ee9f8947aca6_1267x320.jpg)
表8-4 ID Code示意
了解上述信息后,我们来看"http://www.nfc.com" 这样的信息该如何封装为一个NDEF消息,图8-7所示为NDEF消息各字段的取值情况。
:-: ![](https://box.kancloud.cn/1f48092e3ec368f24406b10cab6eb098_1111x394.jpg)
图8-7 URI Record实例
由于该NDEF消息只包含一个NFC Record,所以这个唯一的NFC Record将设置MB和ME标志位为1。另外,由于数据量小于255字节,所以SR标志位为1。最后,该Record携带的数据属于URI类型,它为Well-Known Type的一种,所以TNF取值为0x01。
Type Length字段取值为0x01,对应的Type字段取值为"U",代表URI Record Type。
根据本节对URI Record的介绍,这种类型Record的Payload包含ID Code和data两个部分。IDCode取值为0x01占据1字节(代表"http://www" ),而data为"nfc.com"占据7字节,所以整个Payload长度为8字节,故Payload length字段取值为0x08。
当应用程序获取Payload信息后,将根据ID Code和Data的取值最终计算出对应的URI为"http://www.nfc.com" 。
相信本节所述的URI Record实例能帮助读者更加直观得了解NDEF和NRC Record,下面再来看一个实例。
**②、Text Record Type实例**
Text Record Type和URI Record Type类似,其Payload组织结构如表8-5所示。
:-: ![](https://box.kancloud.cn/978af9da3caa3776e70004e36f55c38f_1260x305.jpg)
表8-5 Text Record Payload组织结构
:-: ![](https://box.kancloud.cn/641feeb4fb7555f69d4b3715f1ee15ad_1302x536.jpg)
图8-8 TEXT Record实例
图8-8所示为携带"Hello World"字符串信息的NDEF消息各字段的取值情况。
实例比较简单,请读者根据本节对TEXT Record知识的介绍来自行解释图8-8各个字段的取值。
至此,NFC R/W运行模式介绍完毕。在R/W模式下,对应用程序而言最重要的工作就是解析NDEF消息。NFC Forum定义了七种数据类型,其中内容比较丰富的属于NFC Forum WellKnown Type。本节介绍了WKT中最简单的URI Record和TEXT Record。读者可在本节基础上自行研究其他几种数据类型。
- 前言
- 第1章 准备工作
- 1.1 Android系统架构
- 1.2 工具使用
- 1.2.1 Source Insight的使用
- 1.2.2 Eclipse的使用
- 1.2.3 BusyBox的使用
- 1.3 本书资源下载说明
- 第2章 深入理解Netd
- 2.1 概述
- 2.2 Netd工作流程
- 2.2.1 main函数分析
- 2.2.2 NetlinkManager分析
- 2.2.3 CommandListener分析
- 2.2.4 DnsProxyListener分析
- 2.2.5 MDnsSdListener分析
- 2.3 CommandListener中的命令
- 2.3.1 iptables、tc和ip命令
- 2.3.2 CommandListener构造函数和测试工具ndc
- 2.3.3 InterfaceCmd命令
- 2.3.4 IpFwd和FirewallCmd命令
- 2.3.5 ListTtysCmd和PppdCmd命令
- 2.3.6 BandwidthControlCmd和IdletimerControlCmd命令
- 2.3.7 NatCmd命令
- 2.3.8 TetherCmd和SoftapCmd命令
- 2.3.9 ResolverCmd命令
- 2.4 NetworkManagementService介绍
- 2.4.1 create函数详解
- 2.4.2 systemReady函数详解
- 2.5 本章总结和参考资料说明
- 2.5.1 本章总结
- 2.5.2 参考资料说明
- 第3章 Wi-Fi基础知识
- 3.1 概述
- 3.2 无线电频谱和802.11协议的发展历程
- 3.2.1 无线电频谱知识
- 3.2.2 IEEE 802.11发展历程
- 3.3 802.11无线网络技术
- 3.3.1 OSI基本参考模型及相关基本概念
- 3.3.2 802.11知识点导读
- 3.3.3 802.11组件
- 3.3.4 802.11 Service介绍
- 3.3.5 802.11 MAC服务和帧
- 3.3.6 802.11 MAC管理实体
- 3.3.7 无线网络安全技术知识点
- 3.4 Linux Wi-Fi编程API介绍
- 3.4.1 Linux Wireless Extensions介绍
- 3.4.2 nl80211介绍
- 3.5 本章总结和参考资料说明
- 3.5.1 本章总结
- 3.5.2 参考资料说明
- 第4章 深入理解wpa_supplicant
- 4.1 概述
- 4.2 初识wpa_supplicant
- 4.2.1 wpa_supplicant架构
- 4.2.2 wpa_supplicant编译配置
- 4.2.3 wpa_supplicant命令和控制API
- 4.2.4 git的使用
- 4.3 wpa_supplicant初始化流程
- 4.3.1 main函数分析
- 4.3.2 wpa_supplicant_init函数分析
- 4.3.3 wpa_supplicant_add_iface函数分析
- 4.3.4 wpa_supplicant_init_iface函数分析
- 4.4 EAP和EAPOL模块
- 4.4.1 EAP模块分析
- 4.4.2 EAPOL模块分析
- 4.5 wpa_supplicant连接无线网络分析
- 4.5.1 ADD_NETWORK命令处理
- 4.5.2 SET_NETWORK命令处理
- 4.5.3 ENABLE_NETWORK命令处理
- 4.6 本章总结和参考资料说明
- 4.6.1 本章总结
- 4.6.2 参考资料说明
- 第5章 深入理解WifiService
- 5.1 概述
- 5.2 WifiService的创建及初始化
- 5.2.1 HSM和AsyncChannel介绍
- 5.2.2 WifiService构造函数分析
- 5.2.3 WifiStateMachine介绍
- 5.3 加入无线网络分析
- 5.3.1 Settings操作Wi-Fi分析
- 5.3.2 WifiService操作Wi-Fi分析
- 5.4 WifiWatchdogStateMachine介绍
- 5.5 Captive Portal Check介绍
- 5.6 本章总结和参考资料说明
- 5.6.1 本章总结
- 5.6.2 参考资料说明
- 第6章 深入理解Wi-Fi Simple Configuration
- 6.1 概述
- 6.2 WSC基础知识
- 6.2.1 WSC应用场景
- 6.2.2 WSC核心组件及接口
- 6.3 Registration Protocol详解
- 6.3.1 WSC IE和Attribute介绍
- 6.3.2 802.11管理帧WSC IE设置
- 6.3.3 EAP-WSC介绍
- 6.4 WSC代码分析
- 6.4.1 Settings中的WSC处理
- 6.4.2 WifiStateMachine的处理
- 6.4.3 wpa_supplicant中的WSC处理
- 6.4.4 EAP-WSC处理流程分析
- 6.5 本章总结和参考资料说明
- 6.5.1 本章总结
- 6.5.2 参考资料说明
- 第7章 深入理解Wi-Fi P2P
- 7.1 概述
- 7.2 P2P基础知识
- 7.2.1 P2P架构
- 7.2.2 P2P Discovery技术
- 7.2.3 P2P工作流程
- 7.3 WifiP2pSettings和WifiP2pService介绍
- 7.3.1 WifiP2pSettings工作流程
- 7.3.2 WifiP2pService工作流程
- 7.4 wpa_supplicant中的P2P
- 7.4.1 P2P模块初始化
- 7.4.2 P2P Device Discovery流程分析
- 7.4.3 Provision Discovery流程分析
- 7.4.4 GO Negotiation流程分析
- 7.5 本章总结和参考资料说明
- 7.5.1 本章总结
- 7.5.2 参考资料说明
- 第8章 深入理解NFC
- 8.1 概述
- 8.2 NFC基础知识
- 8.2.1 NFC概述
- 8.2.2 NFC R/W运行模式
- 8.2.3 NFC P2P运行模式
- 8.2.4 NFC CE运行模式
- 8.2.5 NCI原理
- 8.2.6 NFC相关规范
- 8.3 Android中的NFC
- 8.3.1 NFC应用示例
- 8.3.2 NFC系统模块
- 8.4 NFC HAL层讨论
- 8.5 本章总结和参考资料说明
- 8.5.1 本章总结
- 8.5.2 参考资料说明
- 第9章 深入理解GPS
- 9.1 概述
- 9.2 GPS基础知识
- 9.2.1 卫星导航基本原理
- 9.2.2 GPS系统组成及原理
- 9.2.3 OMA-SUPL协议
- 9.3 Android中的位置管理
- 9.3.1 LocationManager架构
- 9.3.2 LocationManager应用示例
- 9.3.3 LocationManager系统模块
- 9.4 本章总结和参考资料说明
- 9.4.1 本章总结
- 9.4.2 参考资料说明
- 附录