如何解读 Mifare Classic 1K 上的 NDEF 内容

How to interpret NDEF content on Mifare Classic 1K

我使用 Android 设备上的 NFC 工具应用程序(通过内置 NFC reader)将文本写入 Mifare Classic 1K 标签。这段文字是"moretto"(我的姓氏)。

然后,我尝试使用 NFC reader ACR1255U 和 ACS 提供的库来读取此文本(NDEF 格式)。

我可以获得以下信息:

读取块 4:FF B0 00 04 10 响应:0000030ED1010A5402656E6D6F726574 9000

读取块 5:FF B0 00 05 10 响应:746FFE00000000000000000000000000 9000

我知道FE表示内容结束,6D6F726574746F是我的正文。但是我如何确定文本从哪里开始呢?我很难理解 NXP 文档中描述的 TLV 格式。

首先,恩智浦专有的MIFARE Classic标签的NDEF映射在这两个应用笔记中有详细说明:

如您所见 (), the NDEF data is stored in the data blocks of certain sectors (the NDEF sectors, marked as such by means of the )。因此,与 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:
    +----------+
    | TAG      |
    | (1 byte) |
    +----------+
    
  • 数据字段长度为 0 到 254 字节的 TLV:
    +----------+----------+-----------+
    | TAG      | LENGHT n | DATA      |
    | (1 byte) | (1 byte) | (n bytes) |
    +----------+----------+-----------+
    
  • 数据字段长度为 255 到 65534 字节的 TLV:
    +----------+----------+-----------+-----------+
    | TAG      | 0xFF     | LENGHT n  | DATA      |
    | (1 byte) | (1 byte) | (2 bytes) | (n bytes) |
    +----------+----------+-----------+-----------+
    

您的具体案例中有趣的标签是:

  • NULL TLV:标记 = 0x00,无长度字段,无数据字段
  • 终结者 TLV:标记 = 0xFE,无长度字段,无数据字段
  • NDEF 消息 TLV:标签 = 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)