2013-05-29 12 views
13

Sono novizio in Android API NFC.Lettura dati dal tag NFC (IsoDep)

Attualmente, ho un tag NFC, sto facendo un'app per Android per leggere i dati da esso. La mia semplice app viene avviata quando il mio telefono si avvicina abbastanza al tag NFC. Ma non ho idea di come leggere i dati all'interno del tag NFC. Il tag utilizza la tecnologia IsoDep.

mio codice corrente:

@Override 
protected void onResume(){ 
    super.onResume(); 

    Intent intent = getIntent(); 
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 

    IsoDep isoDep = IsoDep.get(tag); 

    // How to read data from IsoDep instance? 

Ho cercato su google su internet, ho notato la gente sono l'invio di comandi per IsoDep di ottenere risposta da Tag NFC, suppongo dalla risposta, siamo in grado di analizzare i dati nel tag, ho visto gente che fa questo:

//What is the 'command' ? How to define the command? 
//e.g.: 
byte command = (byte) 0x6A 
isoDep.transceive(command) 

Ma, il comando è solo un byte, come un principiante, è troppo difficile da capire cosa sta succedendo. Non ho idea di come definire il comando per leggere i dati? Qualcuno può spiegarmi? o c'è un documento che posso imparare sul comando?

In generale, ho bisogno di alcune indicazioni su come definire i comandi & come analizzare i dati di risposta, vorrei leggere i dati memorizzati nel tag & mostrare i dati in formato stringa in UI elemento (ad esempio TextView).

* E ***

Non ho alcun problema con le configurazioni (ad esempio AnroidManifest.xml), per favore non mi guida su come configurare :)

risposta

14

IsoDep consente per comunicare tramite una connessione ISO-14443-4 con l'operazione transceive. Su questo protocollo vengono scambiate le unità dati applicative (APDU). Il formato è specificato, si trova una descrizione su Wikipedia.

Per esempio, per selezionare un'applicazione su una smart card con un particolare identificatore di applicazione (AID) si eseguirà il seguente comando APDU. Il risultato indica semplicemente ok (9000) o un errore.

byte[] SELECT = { 
     (byte) 0x00, // CLA Class   
     (byte) 0xA4, // INS Instruction  
     (byte) 0x04, // P1 Parameter 1 
     (byte) 0x00, // P2 Parameter 2 
     (byte) 0x0A, // Length 
     0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31 // AID 
    }; 

    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    IsoDep tag = IsoDep.get(tagFromIntent); 

    tag.connect(); 
    byte[] result = tag.transceive(SELECT); 
    if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00)) 
     throw new IOException("could not select applet"); 

Dopo aver selezionato l'applicazione, è possibile eseguire comandi specifici dell'applicazione. I programmi sono in genere scritti in JavaCard che segue le specifiche GlobalPlatorm. L'esempio seguente esegue sull'applicazione selezionata sopra il metodo 4 (0x04) che restituisce un array di byte con un massimo di 11 byte. Questo risultato viene quindi convertito in una stringa.

byte[] GET_STRING = { 
     (byte) 0x80, // CLA Class   
     0x04, // INS Instruction 
     0x00, // P1 Parameter 1 
     0x00, // P2 Parameter 2 
     0x10 // LE maximal number of bytes expected in result 
    }; 

    result = tag.transceive(GET_STRING); 
    int len = result.length; 
    if (!(result[len-2]==(byte)0x90&&result[len-1]==(byte) 0x00)) 
     throw new RuntimeException("could not retrieve msisdn"); 

    byte[] data = new byte[len-2]; 
    System.arraycopy(result, 0, data, 0, len-2); 
    String str = new String(data).trim(); 

    tag.close(); 
+0

perché "len-2"? Come è strutturata la risposta, c'è qualche intestazione? Non importa, trovato attraverso il link di Wikipedia. 2 byte di stato alla fine –

+0

Il risultato di un messaggio [APDU] (https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit) contiene i dati di risposta (specifici dell'applicazione) seguiti dal rimorchio di risposta SW1-SW2 che codifica il comando risultato dell'elaborazione, ad es per esempio. 0x9000 per il successo. Qualsiasi strutturazione dei dati di risposta è specifica dell'applicazione (tipicamente viene utilizzata una codifica [TLV] (https://en.wikipedia.org/wiki/Type-length-value)). – Dominik

+0

Ehi Dominik, perché hai scelto "metodo 4" Potrebbe essere un qualsiasi byte? –

Problemi correlati