2016-05-13 27 views
3

Ich schreibe einen Text in ein Mifare Classic 1K-Tag mithilfe der NFC Tools-App auf meinem Android-Gerät (über den integrierten NFC-Leser). Dieser Text ist "moretto" (mein Nachname).So interpretieren Sie NDEF-Inhalte auf Mifare Classic 1K

Dann versuche ich diesen Text (NDEF-Format) mit dem NFC-Leser ACR1255U mit der Bibliothek von ACS zu lesen.

Ich bin folgende erhalten können:

lesen Block 4: FF B0 00 04 10 Antwort: 0000030ED1010A5402656E6D6F726574 9000

lesen Block 5: FF B0 00 05 10 Antwort: 746FFE00000000000000000000000000 9000

Ich weiß, dass FE zeigt das Ende des Inhalts und 6D6F726574746F ist mein Text. Aber wie identifiziere ich, wo der Text beginnt? Ich habe Schwierigkeiten, das in der NXP-Dokumentation beschriebene TLV-Format zu verstehen.

Antwort

6

Zunächst einmal NXP proprietär NDEF Mapping für MIFARE Classic-Tags wird in diesen beiden Anwendungshinweisen angegeben:

Wie Sie bereits gefunden (Unable to authenticate to a MIFARE Classic tag used as NDEF tag), das NDEF-Daten werden in den Datenblöcken bestimmter Sektoren gespeichert (die NDEF-Sektoren, die als solche mit der MIFARE Application Directory markiert sind). Daher sind die für NDEF relevanten Daten die Kombination aller Daten aus diesen Blöcken.

z. Wenn Ihre NDEF-Sektoren Sektor 1 und 2 sind, müssten Sie die Blöcke 4, 5, 6 (= Blöcke 0..2 des Sektors 1) und die Blöcke 8, 9, 10 (= Blöcke 0..2 des Sektors 2) lesen. um die Daten des NDEF-Tags zu aggregieren.

In Ihrem Fall scheinen die Daten aus den Blöcken 4 und 5 ausreichend zu sein (da das Ende der Tag-Daten in Block 5 markiert ist, wie Sie selbst richtig gefunden haben). Die entsprechenden Tag-Daten in Ihrem Fall sind

 
0000030E D1010A54 02656E6D 6F726574 
746FFE00 00000000 00000000 00000000 

Die Tag-Daten selbst in TLV verpackt (Tag-Länge-Wert) Strukturen.Ein TLV-Block besteht aus einem obligatorischen Tag Byte, ein bedingten Längenfeld und ein optionalen Datenfeld:

  • TLVs, die Länge und keine Daten Felder hat:
     
    +----------+ 
    | TAG  | 
    | (1 byte) | 
    +----------+ 
    
  • TLVs, wo das Datenfeld eine Länge von 0 bis 254 Bytes:
     
    +----------+----------+-----------+ 
    | TAG  | LENGHT n | DATA  | 
    | (1 byte) | (1 byte) | (n bytes) | 
    +----------+----------+-----------+ 
    
  • TLVs wobei das Datenfeld eine Länge von 255 bis 65.534 Bytes hat:
     
    +----------+----------+-----------+-----------+ 
    | TAG  | 0xFF  | LENGHT n | DATA  | 
    | (1 byte) | (1 byte) | (2 bytes) | (n bytes) | 
    +----------+----------+-----------+-----------+ 
    

Die interessanten Tags in Ihrem speziellen Fall sind:

  • NULL TLV: Tag = 0x00, kein Längenfeld, kein Datenfeld
  • Terminator TLV: Tag = 0xFE, kein Längenfeld, kein Datenfeld
  • NDEF Nachricht TLV: Tag = 0x03, hat Feld, hat Datenfeld (kann jedoch die Länge Null haben)

in Ihrem Fall Folglich decodiert die Daten auf:

 
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) 

Eine NDEF-Nachricht kann aus 0, 1 oder mehr NDEF-Datensätzen bestehen. In Ihrem Fall decodiert die NDEF Nachricht an folgenden:.

 
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) 

Daher Ihre NDEF Nachricht von einem Text Datensatz besteht (NFC Fórum bekannten Typ mit der Datennutzlast 02656E6D6F726574746F Diese Rekord-Nutzlast decodiert:

 
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)