2016-05-13 94 views
3

我使用我的Android设备上的NFC工具应用程序(通过内置的NFC阅读器)向Mifare Classic 1K标签写入文本。这段文字是“moretto”(我的姓氏)。如何解读Mifare Classic上的NDEF内容1K

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

我能够得到如下:

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

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

我知道FE指示的内容和6D6F726574746F结束是我的文字。但是,我如何确定文本的起始位置?我很难理解恩智浦文档中描述的TLV格式。

回答

6

首先,恩智浦的MIFARE经典标签专有NDEF映射在这两个应用笔记指定:

正如你已经发现(Unable to authenticate to a MIFARE Classic tag used as NDEF tag)时, NDEF数据存储在某些扇区(NDEF扇区,通过MIFARE Application Directory标记)的数据块中。因此,与NDEF相关的数据是来自这些块的所有数据的组合。

E.g.如果您的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) | 
    +----------+ 
    
  • 的TLV,其中数据场具有从0到254字节的长度:
     
    +----------+----------+-----------+ 
    | TAG  | LENGHT n | DATA  | 
    | (1 byte) | (1 byte) | (n bytes) | 
    +----------+----------+-----------+ 
    
  • 的TLV,其中数据字段具有从255到65534字节的长度:
     
    +----------+----------+-----------+-----------+ 
    | 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论坛公知的类型与数据有效载荷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) 
相关问题