2016-05-13 224 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) 
相關問題