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

问题描述 投票:0回答:2

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

android nfc mifare ndef tlv
2个回答
20
投票

首先,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 块由强制标记字节、条件长度字段和可选数据字段组成:

  • 没有长度和数据字段的 TLV:
+----------+
|标签 |
| (1 字节)|
+----------+
  • 数据字段长度为 0 到 254 字节的 TLV:
+----------+----------+------------+
|标签 |长度 n |数据|
| (1 字节)| (1 字节)| (n 字节)|
+----------+----------+------------+
  • 数据字段长度为 255 到 65534 字节的 TLV:
+----------+----------+------------+------------+
|标签 | 0xFF | 0xFF长度 n |数据|
| (1 字节)| (1 字节)| (2 个字节)| (n 字节)|
+----------+----------+------------+------------+

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

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

0
投票

有一些很好的应用程序可以管理 NDEF 记录,例如 NXP TagWriter,但您必须先准备 Mifare Classic。以下是有关如何调整 Mifare Classic 以便将其用作 NDEF 卡的说明:https://sol6.eu/tech/Mifare_Classic_-_NDEF/

© www.soinside.com 2019 - 2024. All rights reserved.