我使用 Android 设备上的 NFC 工具应用程序(通过内置 NFC 读取器)向 Mifare Classic 1K 标签写入文本。这段文字是“moretto”(我的姓氏)。
然后,我尝试使用 NFC 读取器 ACR1255U 和 ACS 提供的库来读取此文本(NDEF 格式)。
我能够得到以下信息:
阅读第 4 块:
FF B0 00 04 10
回复:0000030ED1010A5402656E6D6F726574 9000
阅读第 5 块:
FF B0 00 05 10
回复:746FFE00000000000000000000000000 9000
我知道
FE
表示内容结束,6D6F726574746F
是我的文本。但是我如何确定文本从哪里开始呢?我很难理解 NXP 文档中描述的 TLV 格式。
首先,NXP 针对 MIFARE Classic 标签的专有 NDEF 映射在这两个应用笔记中指定:
正如您已经发现的(无法验证用作 NDEF 标签的 MIFARE Classic 标签),NDEF 数据存储在某些扇区的数据块中(NDEF 扇区,通过 MIFARE 应用程序目录进行标记) )。因此,与 NDEF 相关的数据是这些块中所有数据的组合。
例如如果您的 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 块由强制标记字节、条件长度字段和可选数据字段组成:
+----------+ |标签 | | (1 字节)| +----------+
+----------+----------+------------+ |标签 |长度 n |数据| | (1 字节)| (1 字节)| (n 字节)| +----------+----------+------------+
+----------+----------+------------+------------+ |标签 | 0xFF | 0xFF长度 n |数据| | (1 字节)| (1 字节)| (2 个字节)| (n 字节)| +----------+----------+------------+------------+
您的具体案例中有趣的标签是:
0x00
,无长度字段,无数据字段0xFE
,无长度字段,无数据字段0x03
,有字段,有数据字段(但长度可能为零)因此,在您的情况下,数据解码为:
00 NULL TLV(忽略,处理下一个字节) 00 NULL TLV(忽略,处理下一个字节) 03 NDEF 消息 TLV(包含您的 NDEF 消息) 0E 长度 = 14 字节 D1010A5402656E6D6F726574746F 数据 = NDEF 消息 FE Terminator TLV(停止处理数据)
NDEF 消息可以包含 0、1 或更多 NDEF 记录。在您的情况下,NDEF 消息解码为以下内容:
D1 记录头(第一个也是唯一一个记录) 位 7 = MB = 1:NDEF 消息的第一条记录 位 6 = ME = 1:NDEF 消息的最后一条记录 位 5 = CF = 0:链的最后或唯一记录 位 4 = SR = 1:短记录长度字段 位 3 = IL = 0:无 ID/ID 长度字段 位 2..0 = TNF = 0x1:类型字段代表 NFC 论坛 众所周知的类型名称 01 类型长度 = 1 字节 0A 有效负载长度 = 10 字节 54 类型字段(根据TNF的设置解码) “T”(US-ASCII)= 类型名称的二进制形式 urn:nfc:wkt:T 02656E6D6F726574746F Payload字段(根据Type字段的值解码)
因此,您的 NDEF 消息包含一个文本记录(NFC FOrum 众所周知的类型,带有数据负载
02656E6D6F726574746F
。此记录负载解码为:
02 状态字节 位 7 = 0:文本采用 UTF-8 编码 位 6 = 0:未使用 位 5..0 = 0x02:IANA 语言代码字段的长度 656E IANA 语言代码字段 “en”(US-ASCII)= 文本为英文 6D6F726574746F 文本 “moretto”(UTF-8 格式)
有一些很好的应用程序可以管理 NDEF 记录,例如 NXP TagWriter,但您必须先准备 Mifare Classic。以下是有关如何调整 Mifare Classic 以便将其用作 NDEF 卡的说明:https://sol6.eu/tech/Mifare_Classic_-_NDEF/