NDEF及NFC Record
1. NDEF和NFC Record之间的关系
根据NFC Forum的定义,R/W模式下,NFC设备之间每一次交互的数据都会封装在一个NDEF Message中,而一个NDEF Message可以包含多个NFC Record,真正的数据则封装在NFC Record中。图8-5展示了NDEF Message和NFC Record之间的关系。
由上图可知,一个NDEF Message可包含一个或多个NFC Record。在一个NDEFMessage中,第一个NFC Record需设置其MB位(Message Begin)为1,表示它是该消息中第一个NFC Record,最后一个NFC Record需设置ME位(Message End)位为1,表示它是此消息中最后一个NFC Record。
NFC Record本身的组织结构如图所示。NFC Record分为NFC Record Header(头部信息)和Payload(数据载荷)两大部分。Record Header中最重要的是其第一字节。该字节有6个标志信息,分别如下。
-
Record Header第一字节
·MB(Message Begin标志)
·ME(Message End标志)
·CF(Chunk Flag标志,表示该Record是否为分片Record)
·SR(Short Record标志。如果该标志被设置,则图中的4个Payload Length字段仅需一个,这表明Payload数据长度将限制在255字节以内)
·IL(ID_LENGTH标志,它用于指明Header中是否包含ID Length和ID这两个字段)
·TNF(Type Name Format标志,用于指明Payload的类型,NFC Forum定义了一些常用的Payload类型,详情见下文分析) -
Record Header其他字节如下
·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。
NFC Record中,常令初学者感到困惑的是TNF字段,其作用是什么?来看下文。 -
TNF和RTD
TNF用于描述一个NFC Record中数据(Payload)的类型,为了方便应用程序能正确解析NFC Record中的数据,NFC Forum规定了一些常用的数据类型,如下表所示。
目前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-KnownType)和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没有定义相关的数据
类型。
NFC Record实例
URI Record Type实例
URI Record Type属于NFC Forum Well-known Type的一种,其对应的Type字段取值为"U"。对于这种类型的NFC Record,其Payload组织结构如表所示。
在URI Record Payload中,第一个字节指明URI的ID码,表8-4为NFC Forum定义的几种ID码。
了解上述信息后,我们来看"http:/ www.nfc.com"这样的信息该如何封装为一个NDEF消息,图8-7所示为NDEF消息各字段的取值情况。
由于该NDEF消息只包含一个NFC Record,所以这个唯一的NFC Record将设置MB和ME标志位为1。另外,由于数据量小于255字节,所以SR标志位为1。最后,该Record携带的数据属于URI类型,它为Well-Known Type的一种,所以TNF取值为0x01。
Type Length字段取值为0x01,对应的Type字段取值为"U",代表URI RecordType。
根据本节对URI Record的介绍,这种类型Record的Payload包含ID Code和data两个
部分。ID Code取值为0x01占据1字节(代表"http:/ www"),而data为"nfc.com"占据7字节,所以整个Payload长度为8字节,故Payload length字段取值为0x08。
当应用程序获取Payload信息后,将根据ID Code和Data的取值最终计算出对应的URI为"http:/ www.nfc.com"
Text Record Type实例
Text Record Type和URI Record Type类似,其Payload组织结构如表8-5所示。
图8-8所示为携带"Hello World"字符串信息的NDEF消息各字段的取值情况。可参考 URI Record进行解析。