我使用Android设备上的NFC Tools应用程序(通过内置NFC阅读器)将文本写入Mifare Classic 1K标签。这段文字是" moretto" (我的姓)。
然后,我尝试使用NFC读卡器ACR1255U和ACS提供的库来阅读本文(NDEF格式)。
我能够得到以下信息:
阅读第4块:std::make_tuple
回复:FF B0 00 04 10
阅读第5块:0000030ED1010A5402656E6D6F726574 9000
回复:FF B0 00 05 10
我知道746FFE00000000000000000000000000 9000
表示内容已结束,FE
表示我的文字。但是如何识别文本的开始位置?我很难理解恩智浦文档中描述的TLV格式。
答案 0 :(得分:7)
首先,恩智浦针对MIFARE Classic标签的专有NDEF映射在这两个应用笔记中有详细说明:
正如您已经找到的那样(Unable to authenticate to a MIFARE Classic tag used as NDEF tag),NDEF数据存储在某些扇区的数据块中(NDEF扇区,通过MIFARE Application Directory标记)。因此,与NDEF相关的数据是来自这些块的所有数据的组合。
E.g。如果您的NDEF扇区是扇区1和2,则需要读取块4,5,6(=扇区1的块0..2)和块8,9,10(=扇区2的块0..2)聚合NDEF标签的数据。
在您的情况下,来自块4和5的数据似乎已足够(因为标记数据的结尾在块5中标记,正如您自己正确找到的那样)。您的案例中的相关标签数据是
0000030E D1010A54 02656E6D 6F726574 746FFE00 00000000 00000000 00000000
标签数据本身被打包到TLV(标签长度值)结构中。 TLV块由强制标记字节,条件长度字段和可选数据字段组成:
+----------+ | TAG | | (1 byte) | +----------+
+----------+----------+-----------+ | TAG | LENGHT n | DATA | | (1 byte) | (1 byte) | (n bytes) | +----------+----------+-----------+
+----------+----------+-----------+-----------+ | TAG | 0xFF | LENGHT n | DATA | | (1 byte) | (1 byte) | (2 bytes) | (n bytes) | +----------+----------+-----------+-----------+
您特定情况下的有趣标签是:
0x00
,没有长度字段,没有数据字段0xFE
,没有长度字段,没有数据字段0x03
,有字段,有数据字段(虽然可能有零长度)因此,在您的情况下,数据解码为:
00 NULL TLV (ignore, process next byte) 00 NULL TLV (ignore, process next byte) 03 NDEF Message TLV (contains your NDEF message) 0E Lenght = 14 bytes D1010A5402656E6D6F726574746F Data = NDEF Message FE Terminator TLV (stop processing the data)
NDEF消息可以包含0个,1个或更多NDEF记录。在您的情况下,NDEF消息解码为以下内容:
D1 Record header (of first and only record) Bit 7 = MB = 1: first record of NDEF message Bit 6 = ME = 1: last record of NDEF message Bit 5 = CF = 0: last or only record of chain Bit 4 = SR = 1: short record length field Bit 3 = IL = 0: no ID/ID length fields Bit 2..0 = TNF = 0x1: Type field represents an NFC Forum well-known type name 01 Type Length = 1 byte 0A Payload length = 10 bytes 54 Type field (decoded according to the setting of TNF) "T" (in US-ASCII) = binary form of type name urn:nfc:wkt:T 02656E6D6F726574746F Payload field (decoded according to the value of the Type field)
因此,您的NDEF消息包含一个文本记录(NFC FOrum众所周知的类型,数据有效负载02656E6D6F726574746F
。此记录有效负载解码为:
02 Status byte Bit 7 = 0: Text is UTF-8 encoded Bit 6 = 0: Not used Bit 5..0 = 0x02: Length of IANA language code field 656E IANA language code field "en" (in US-ASCII) = Text is in English 6D6F726574746F Text "moretto" (in UTF-8)