6

我使用 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 格式。

4

1 回答 1

16

首先,恩智浦针对 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 中)
于 2016-05-14T07:54:46.790 回答