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

最佳答案

首先,在以下两个应用笔记中指定了恩智浦针对MIFARE Classic标签的专有NDEF映射:

  • NFC Type MIFARE Classic Tag Operation
  • MIFARE Classic as NFC Type MIFARE Classic Tag

  • 如您所知(Unable to authenticate to a MIFARE Classic tag used as NDEF tag),NDEF数据存储在某些扇区(NDEF扇区,已通过MIFARE Application Directory进行标记)的数据块中。因此,与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个字节)|
    + ---------- +
  • TLV,其中数据字段的长度为0到254个字节:

    + ---------- + ---------- + ----------- +
    | TAG |长度n |数据|
    | (1个字节)| (1个字节)| (n个字节)|
    + ---------- + ---------- + ----------- +
  • TLV,其中数据字段的长度为255到65534字节:

    + ---------- + ---------- + ----------- + ----------- +
    | TAG | 0xFF |长度n |数据|
    | (1个字节)| (1个字节)| (2个字节)| (n个字节)|
    + ---------- + ---------- + ----------- + ----------- +

  • 在您的特定情况下,有趣的标签是:
  • NULL TLV:标记= 0x00,没有长度字段,没有数据字段
  • 终结者TLV:标记= 0xFE,没有长度字段,没有数据字段
  • NDEF消息TLV:标记= 0x03,具有字段,具有数据字段(尽管长度可能为零)

  • 因此,在您的情况下,数据解码为:

    00 NULL TLV(忽略,处理下一个字节)
    00 NULL TLV(忽略,处理下一个字节)
    03 NDEF消息TLV(包含您的NDEF消息)
    0E长度= 14字节
    D1010A5402656E6D6F726574746F数据= NDEF消息
    FE终结器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有效载荷字段(根据“类型”字段的值进行解码)

    因此,您的NDEF消息包含一个Text记录(NFC FOrum众所周知的类型,其数据有效载荷02656E6D6F726574746F。该记录的有效载荷解码为:

    02状态字节
    位7 = 0:文本采用UTF-8编码
    位6 = 0:未使用
    位5..0 = 0x02:IANA语言代码字段的长度
    656E IANA语言代码字段
    “en”(以US-ASCII表示)=文本为英文
    6D6F726574746F文字
    “moretto”(在UTF-8中)

    关于android - 如何在Mifare Classic 1K上解释NDEF内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37220910/

    10-10 10:35