2016-05-03 19 views
1

Gibt es eine Möglichkeit, eine NTAG213 von einem MF0ICU2 Tag auf der Grundlage seiner UID, ATQA oder SAK-Werte zu unterscheiden? Da ich die Tags anders programmieren muss (PWD/PACK für NTAG213 oder 3DES für MF0ICU2), muss es möglich sein, die eine oder andere Methode aufzurufen.Unterscheiden NTAG213 von MF0ICU2

Leider sagt mir das Android-Framework, dass beide Tags MifareUltralight mit dem Typ TYPE_ULTRALIGHT_C sind. Die ATQA (0x0044) und SAK (0x00) sind ebenfalls identisch.

Andere Anwendungen wie NFC TagInfo by NXP können mir den genauen Typ eines Tags sagen, also weiß ich, dass es einen Weg geben muss.

Antwort

4

Sobald Sie wissen, dass der Tag ist ein Tag NXP (UID beginnt mit 0x04), würden Sie

  1. zuerst einen get_version Befehl senden. Wenn dieser Befehl erfolgreich ist, wissen Sie, dass das Tag EV1 oder höher ist (MIFARE Ultralight EV1, NTAG21x). Andernfalls können Sie davon ausgehen, dass es sich um ein Etikett der ersten Generation (MIFARE Ultralight, Ultralight C, NTAG203) handelt.

  2. Wenn das Tag ein EV1-Tag ist, können Sie fortfahren, indem Sie die Resonanz des Befehls GET_VERSION analysieren. Dies wird die Produktart (NTAG oder Ultra EV1) sowie Produkt-Subtyp, Produktversion und Speichergröße zeigen (die Sie den genauen Chiptyp bestimmen können:

     
    +------------+------+---------+-----------+--------------+ 
    | Chip  | Type | Subtype | Version | Storage size | 
    +------------+------+---------+-----------+--------------+ 
    | NTAG210 | 0x04 | 0x01 | 0x01 0x00 | 0x0B   | 
    | NTAG212 | 0x04 | 0x01 | 0x01 0x00 | 0x0E   | 
    | NTAG213 | 0x04 | 0x02 | 0x01 0x00 | 0x0F   | 
    | NTAG213F | 0x04 | 0x04 | 0x01 0x00 | 0x0F   | 
    | NTAG215 | 0x04 | 0x02 | 0x01 0x00 | 0x11   | 
    | NTAG216 | 0x04 | 0x02 | 0x01 0x00 | 0x13   | 
    | NTAG216F | 0x04 | 0x04 | 0x01 0x00 | 0x13   | 
    +------------+------+---------+-----------+--------------+ 
    | NT3H1101 | 0x04 | 0x02 | 0x01 0x01 | 0x13   | 
    | NT3H1101W0 | 0x04 | 0x05 | 0x02 0x01 | 0x13   | 
    | NT3H2111W0 | 0x04 | 0x05 | 0x02 0x02 | 0x13   | 
    | NT3H2101 | 0x04 | 0x02 | 0x01 0x01 | 0x15   | 
    | NT3H1201W0 | 0x04 | 0x05 | 0x02 0x01 | 0x15   | 
    | NT3H2211W0 | 0x04 | 0x05 | 0x02 0x02 | 0x15   | 
    +------------+------+---------+-----------+--------------+ 
    | MF0UL1101 | 0x03 | 0x01 | 0x01 0x00 | 0x0B   | 
    | MF0ULH1101 | 0x03 | 0x02 | 0x01 0x00 | 0x0B   | 
    | MF0UL2101 | 0x03 | 0x01 | 0x01 0x00 | 0x0E   | 
    | MF0ULH2101 | 0x03 | 0x02 | 0x01 0x00 | 0x0E   | 
    +------------+------+---------+-----------+--------------+ 
    
  3. Wenn der Tag keinen EV1-Tag Sie können einen Befehl AUTHENTICATE (Teil 1) senden.Wenn dieser Befehl erfolgreich ausgeführt wird, wissen Sie, dass das Tag MIFARE Ultralight C ist. Andernfalls können Sie davon ausgehen, dass das Tag entweder Ultralight oder NTAG203 ist

  4. Um zu unterscheiden zwischen MIFARE Ultralight und NTAG203 können Sie versuchen, Seiten zu lesen, die auf Ultralight nicht vorhanden sind (z. B. Seite 41 lesen.)

Sie können die NfcA oder MifareUltralight (wenn auch verfügbar für den Tag) Tag-Technologien unter Verwendung von Befehlen mit dem Tag senden:

boolean testCommand(NfcA nfcA, byte[] command) throws IOException { 
    final boolean leaveConnected = nfcA.isConnected(); 

    boolean commandAvailable = false; 

    if (!leaveConnected) { 
     nfcA.connect(); 
    } 

    try { 
     byte[] result = nfcA.transceive(command); 
     if ((result != null) && 
      (result.length > 0) && 
      !((result.length == 1) && ((result[0] & 0x00A) == 0x000))) { 
      // some response received and response is not a NACK response 
      commandAvailable = true; 

      // You might also want to check if you received a response 
      // that is plausible for the specific command before you 
      // assume that the command is actualy available and what 
      // you expected... 
     } 
    } catch (IOException e) { 
     // IOException (including TagLostException) could indicate that 
     // either the tag is no longer in range or that the command is 
     // not supported by the tag 
    } 

    try { 
     nfcA.close(); 
    } catch (Exception e) {} 

    if (leaveConnected) { 
     nfcA.connect(); 
    } 

    return commandAvailable; 
} 

Beachten Sie, dass einiger NFC-Stacks ein IOException erzeugen (in der Regel ein TagLostException), wenn Ein Befehl wird vom Tag nicht unterstützt. Unabhängig davon, ob Sie eine NACK-Antwort oder IOException für einen nicht unterstützten Befehl empfangen, sollten Sie die Verbindung trennen und erneut herstellen, um den Zustand des Tags zurückzusetzen, bevor Sie weitere Befehle senden.

+0

Leider lief ich immer in eine 'android.nfc.TagLostException: Tag war verloren.', wenn ich einen Befehl übertrage, den das NFC-Tag nicht versteht. Wenn ich also den Befehl GET_VERSION an ein MIFARE Ultralight C übertrage, verliere ich sofort die Verbindung und kann keine weiteren Befehle mehr senden. Weißt du wie ich das lösen kann? – Greeny

+0

@Greeny Sicher, Sie können dies lösen, indem Sie erneut die Verbindung zum Tag ('tag.close()' gefolgt von 'tag.connect()') herstellen, wenn Sie die Ausnahme erhalten. Im Allgemeinen ist es eine gute Idee, nach einem Fehler im Zusammenhang mit Typ-2-Tags immer wieder eine Verbindung herzustellen (selbst nach dem expliziten Empfang einer NACK-Antwort). –