Android开发系列——实战篇14:NFC开发(理论篇)

一、NFC简介

1.NFC概览

NFC,全称是Near Field Communication,中为近场通信,也叫做近距离无线通信技术。该技术最早由Philips和Sony两家公司于2002年末联合推出。2004年,Nokia、Philips、Sony等公司还共同组建了一个名为NFC Forum的非盈利性组织来推广和发展NFC技术。NFC Forum的职责和Wi-Fi Alliance类似,它制定NFC相关的技术标准,同时还通过NFC认证测试来保证各厂家的NFC产品符合NFC规范。

  • NFC与蓝牙、红外通信的区别
    在这里插入图片描述

2.NFC工作模式

  • 主动模式

NFC设备要向另一台设备发送数据时,发起设备和目标设备都需要产生射频场,以便进行通信。

发起设备指最先发起沟通的一方(自带供电),目标设备则为回应一方。

主动模式下,NFC发起设备通过“发送前侦听” 协议来发起半双工发送连接,防止冲突。

  • 被动模式

启动NFC通信的设备(NFC发起设备,主设备),在整个通信过程中提供RF场,目标设备不必产生RF场。

NFC发起设备负责选择传输速度,然后将数据发送到目标设备。目标设备使用负载调制(load modulation)技术,以相同的速度将数据传回发起设备。

移动设备通过采用被动模式进行通信,大幅降低功耗,并延长电池寿命。

3.NFC通信模式

支持 NFC 的 Android 设备同时支持以下三种主要通信模式:

  • 读取器/写入器模式:支持 NFC 设备读取和/或写入被动 NFC 标签和贴纸。

  • 点对点模式:支持 NFC 设备与其他 NFC 对等设备交换数据;Android Beam 使用的就是此操作模式。

  • 卡模拟模式:支持 NFC 设备本身充当 NFC 卡。可以通过外部 NFC 读取器,访问模拟 NFC 卡。

二、NFC标签调度系统

在设置中打开NFC功能后,Android 设备通常会在屏幕解锁后查找 NFC 标签,在 Android 设备发现 NFC 标签后,期望的行为就是让最合适的 Activity 来处理该 Intent。但是怎么才能根据NFC标签的负载类型去自动找到最适合处理它的Activity,而不是弹窗询问用户该用哪个应用处理这个NFC标签呢?Android 提供了一个特殊的标签调度系统,用于分析扫描到的 NFC 标签、解析它们并尝试找到对扫描到的数据感兴趣的应用。这个标签调度系统通过以下操作来实现这些目的:

  1. 解析 NFC 标签并确定 MIME 类型(文本/图片/音乐)或 URI(后者用于标识标签中的数据负载)。
  2. 将 MIME 类型或 URI 与负载一起封装到 Intent 中。
  3. 根据 Intent 启动 Activity。

首先需要理解一下,整个NFC系统的大致架构,这个架构的理解对初学者来说非常重要:
在这里插入图片描述
从下到上分别是RF Layer ISO(底层协议层)、Mode Switch层、NFC Protocol层、Application(应用层)。

从左到右则是点对点模式、读写模式、卡模拟模式的相关协议内容,重点就是中间的读写模式,可以看到标签的类型Tag Type有4种,数据格式有两种:NDEF格式和RTD格式。

首先从底层的NFC协议标准来说,常见的有那么几种协议:

  • ISO 14443(A/B)
  • NFCIP-1
  • MIFARE
  • Felica

至于这些协议标准的具体区别可以在NFC Forum上进行查阅,每一种协议的具体适用场景有所区别。

1. NFC Tag(标签类型)

这里主要介绍NFC Forum定义的4种标签类型:
在这里插入图片描述
这些Tag Type在传输频率和速率等参数上有所区别,具体参考NFC Forum的文档。实际更关注到底是哪种类型的Tag Type。

2 NDEF协议(重点)

NDEF:NFC Data Exchange Format(NFC数据交换格式)是NFC Forum定义的一种在NFC设备之间交换数据的协议标准。NDEF具有以下特点:

  • NFC消息封装格式
  • 二进制的形式
  • 由一系列的Record组成。

NDEF Message和NDEF Record

根据NFC Forum的定义,R/W模式下,NFC设备之间每一次交互的数据都会封装在一个NDEF Message中,而一个NDEF Message可以包含多个NFC Record,真正的数据则封装在NFC Record中。(就类似于数据包,在两个设备之间传送)。Android 还支持其他类型的不包含 NDEF 数据的标签,可以使用 android.nfc.tech 软件包中的类处理这些标签。但是我们这里需要的还是NDEF协议下的文本数据。

NDEF的数据结构
NDEF的数据格式非常重要,本质上就和电子设计中某个寄存器的不同位控制不同的功能类似,NFC Record分为NFC Record Header(头部信息)和Payload(数据载荷)两大部分。NDEF协议的结构大致的示意图如下:

为了更精确的了解每一位对应的控制与选择功能,还需要对NDEF数据格式的Record这个消息进行更细致的分析。这里可以去参考一下NDEF数据交换格式的数据手册,这个数据手册是可以百度或者通过其他博客的资源进行下载的。这个是开发NFC一定需要了解的数据协议规范。
某个下载资源链接:
https://download.csdn.net/download/eagle_on_the_peak/9231919?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162303596716780264065080%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162303596716780264065080&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2allfirst_rank_v2~rank_v29-2-9231919.first_rank_v2_pc_rank_v29&utm_term=NDEF%E4%BA%A4%E6%8D%A2%E6%89%8B%E5%86%8C&spm=1018.2226.3001.4187

NDEF的数据格式
在了解了NDEF的数据结构后,需要对每个Record内部详细的位控制功能有所了解,这里还是需要多看NDEF数据交换规范的那个官方数据手册或者其他资料来仔细了解每一位对应的功能选择,才能完成数据由高级语言到机器语言的转换模式设置。
这是官方给出的一个NDEF Record数据里的结构:

一个NDEF Record结构里存在了这么一些字节,这些字节以堆栈的形式存储,从上到下对每一字节里的每一位对应的功能模式做一些了解:

- 第一个字节是对整个NDEF Record数据格式做一些约定:

TNF=1:Type类型是NFC RTD类型。
IL=1:说明没有ID Length和ID域这两个字节。
SR=1:说明这是短记录。
CF=0:说明该记录未被切块。
ME=1:说明这是末记录。
MB=1:说明这是首记录。
如果ME和MB同时=1,那说明这个NDEF Message有且只有一个Record。

剩下的几个字节表示的功能模式大致如下:

  • 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字节需要配合URI类型的Payload一起使用,它使得一个NFC Record能通过ID来指向另外一个NFC Record。

3. TNF数据类型

TNF用于描述一个NFC Record中数据(Payload)的类型,为了方便应用程序能正确解析NFC Record中的数据,NFC Forum规定了一些常用的数据类型,如下表所示。

这里只介绍我们需要用的最常见的NFC Forum Well-Known Type。其余的Type类型的资料参见:https://blog.csdn.net/top5419/article/details/89365484

NFC Forum Well-Known Type:由NFC Forum定义的一些较为常用的数据类型,包括URI、TEXT等,其格式遵循NFC Forum RTD(Record Type Definition)规范。
RTD规范就是NFC Forum自己定义的一些常用数据类型,目前常用类型如下:

  • URI Record Type:用于存储URI数据,对应Type字段取值为"U"。
  • Text Record Type:用于存储文本数据,对应Type字段取值为"T"。
  • Signature Record Type:用于存储数字签名数据,对应Type字段取值为"Sig"。
  • Smart Poster RecordType:智能海报,用于存储与该海报相关的一些资讯信息,如图片、相关介绍等,对应Type字段取值为"Sp" 。
  • Generic Control Record Type:用于传递控制信息,对应Type字段取值为"Gc" 。
  • External Type:为第三方组织定义的类型,目前NFC Forum没有定义相关的数据 类型。

每一个的数据类型又有更加细致的划分,这个在实际开发过程中需要用到哪种类型就可以自己去查询数据手册里相关的格式规范。

三、NDEF文本数据规范下的处理

在熟悉了基本的NDEF Record协议规范后,就是来了解数据由机器语言转化为文本的流程了,这里最好去看一下相关的操作实例,这个实例非常有价值,看完后会对整个流程有更深入的了解。
https://blog.csdn.net/m0_37905055/article/details/108727633?spm=1001.2014.3001.5506

逐步分析一下数据解析的流程步骤。

  1. 首先我们是通过手机的NFC功能获取到一个NFC Tag。然后对这个Tag的数据类型进行判断,因为我们这边要使用的NDEF协议的数据,所以就默认这个Tag里的数据是NDEF规范的。那此时它就是一个NDEF Message。
  2. 这个NDEF Message本质上是一串Hex字符串。然后我们判断这个NDEF Message里到底有几个NDEF Record,这是通过上述的结构中的位判断来确认的。
  3. 然后我们判断Type字节里存放的字母判断出这一串数据是什么类型的,是文本还是图片还是网址之类的数据。这里我们使用的最简单的文本数据。那Type字节就是“T”。
  4. 通过Payload Length的字节来判断Payload的数据长度。因为一段Hex字符串中真正的数据是放在Payload字段中的,所以要通过数据长度进行定位,明白到底第几个数据开始才是真正的Payload字段。、
  5. 确认好哪些Hex字符串是真正的Payload字段中的数据,就完成到了最重要的一步,然后就是通过解码协议进行解码了。最后通过UTF-8规范把字符串转化为中文。

四、小结

到此,NFC开发的理论篇就结束了,整个过程对于初学者来说还是比较繁杂的,最好是多通过看官方的开发者指南,和NFC官网的数据手册来对一些细节部分有更加深入细致的了解。最重要的就是确定标签类型和数据类型,然后提取到Payload字段里的数据,需要自己在实际操作的过程中进行实践。


版权声明:本文为Maverlous原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。