首先,恩智浦针对 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 块由一个强制标记字节、一个条件长度字段和一个可选数据字段组成:
- 没有长度和数据字段的 TLV:
+----------+
| 标签 |
| (1 字节) |
+----------+
- 数据字段长度为 0 到 254 字节的 TLV:
+----------+----------+------------+
| 标签 | 长度 n | 数据 |
| (1 字节) | (1 字节) | (n 字节) |
+----------+----------+------------+
- 数据字段长度为 255 到 65534 字节的 TLV:
+----------+----------+------------+-----------+
| 标签 | 0xFF | 长度 n | 数据 |
| (1 字节) | (1 字节) | (2 字节) | (n 字节) |
+----------+----------+------------+-----------+
在您的具体情况下,有趣的标签是:
- NULL TLV:标签 =
0x00
,无长度字段,无数据字段
- 终结符 TLV:标签 =
0xFE
,无长度字段,无数据字段
- NDEF 消息 TLV: Tag =
0x03
, has field, has data field (虽然可能有零长度)
因此,在您的情况下,数据解码为:
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 中)