Come si invia un comando grezzo a un tag?
Tramite la classe o il protocollo che corrisponde al livello radio del tag: NfcA, NfcV o IsoDep su Android, NFCMiFareTag, NFCISO15693Tag o NFCISO7816Tag in una sessione di tag iOS. Il codice costruisce i byte del comando, la piattaforma aggiunge l'incorniciatura, e la risposta torna come byte che solo il codice sa giudicare. Web NFC non ne invia nessuno.
Scegli il canale dal livello radio
Su Android, le classi di tecnologia che inviano i byte così come sono espongono tutte transceive(). NfcA raggiunge i tag NFC-A, fra cui ogni tag di tipo 2; NfcV raggiunge i tag ISO/IEC 15693; IsoDep porta le APDU ai tag e alle schede ISO/IEC 14443-4. MifareUltralight.transceive() equivale, secondo il suo riferimento, a connettersi tramite NfcA e chiamare il suo metodo.
Su iOS, i comandi grezzi vogliono una sessione di tag, dato che una sessione NDEF non consegna alcun canale di comando, come spiega la pagina delle sessioni. Il tag rilevato arriva come uno dei protocolli che Core NFC definisce: NFCMiFareTag, il cui sendMiFareCommand serve i tag MIFARE Ultralight, Plus e DESFire ma non il protocollo Crypto1 di MIFARE Classic; NFCISO15693Tag, con un metodo per ciascun comando normalizzato; NFCISO7816Tag, il cui sendCommand(apdu:) invia le APDU; e NFCFeliCaTag per FeliCa.
Una pagina web non ha alcun canale. Web NFC si ferma al NDEF di proposito, come descrive la pagina della scrittura con Web NFC, quindi un progetto che ha bisogno di comandi grezzi ha bisogno di un'applicazione.
Che cosa contengono i tuoi byte
La piattaforma incornicia quello che il codice invia, e ciascun riferimento dice dove quell'incorniciatura si ferma. NfcA.transceive() prende byte completi e aggiunge da sé il CRC: il riferimento di NfcA dice alle applicazioni di non accodarlo, ed esclude i comandi usati per il sondaggio. NfcV.transceive() si aspetta il byte dei contrassegni, il codice del comando e i suoi parametri, e aggiunge anch'esso il CRC. IsoDep.transceive() prende la sola APDU, senza indicatori di trama, e spezza da sé quelle lunghe.
Core NFC non traccia la linea nello stesso punto. Il riferimento di sendMiFareCommand di Apple chiede all'applicazione di calcolare i due byte di CRC di un comando della famiglia MIFARE Ultralight e di accodarli, il contrario della regola di Android, quindi un comando copiato da codice Android arriva senza di essi. I metodi ISO 15693 costruiscono tutta la richiesta, e per impostazione predefinita la indirizzano all'identificatore del tag.
Qualunque sia la piattaforma, un comando che nessun tipo di tag definisce appartiene a un chip. Il suo codice e i suoi parametri vengono dalla scheda tecnica di quel chip, che questo sito lascia alle schede dei chip su wakdev.com.
Leggere la risposta
Una chiamata che torna ha consegnato dei byte, ed è tutto quello che la piattaforma ha verificato. Se il tag abbia accettato il comando è scritto dentro quei byte, in un formato che appartiene al protocollo.
Un tag ISO 15693 apre la sua risposta con un byte di contrassegni il cui bit più basso segnala un errore, seguito da un codice di errore, secondo le definizioni della pila NFC libera di Android. Core NFC trasforma una risposta del genere in un errore le cui informazioni portano NFCISO15693TagResponseErrorKey, con il codice della norma.
Un'APDU finisce con due byte di stato, 90 00 quando il comando è andato a termine. Il riferimento di sendCommand di Apple li rende come sw1 e sw2, sempre validi, e tiene il suo errore per i problemi di comunicazione: una scheda che rifiuta un comando risponde normalmente, con il rifiuto nei byte di stato. La pagina delle APDU elenca i valori più comuni.
Due generi di guasto
Un guasto di trasporto vuol dire che non è arrivata alcuna risposta utilizzabile. Su Android, la chiamata solleva TagLostException quando il tag ha lasciato il campo e IOException per gli altri guasti. Su iOS, i codici di errore comprendono readerTransceiveErrorTagConnectionLost, readerTransceiveErrorPacketTooLong per un comando più lungo di quanto il tag accetti, e readerTransceiveErrorTagResponseError quando il tag ha risposto con un errore.
Una scrittura che finisce in un guasto di trasporto ha un esito sconosciuto. Il comando può aver raggiunto il tag prima che la sua risposta si perdesse, quindi rileggi la memoria prima di inviare altro, e scrivi in un ordine che non lasci mai un messaggio mezzo valido, l'argomento della pagina delle scritture interrotte.
I limiti valgono prima di tutto questo. Quanti byte può portare una chiamata sola, e quanto aspetta, cambiano da un telefono Android all'altro, come spiega la pagina dei limiti del controller: un comando che funziona sul telefono di prova può fallire su un altro prima ancora di raggiungere il tag.
Domande frequenti
Una pagina web può inviare un comando grezzo a un tag?
No. Web NFC legge e scrive solo NDEF, quindi i comandi grezzi vogliono un'applicazione Android o iOS.
Il mio codice aggiunge il CRC?
Non su Android, dove NfcA e NfcV lo aggiungono. Il riferimento di Apple lo chiede per i comandi della famiglia MIFARE Ultralight inviati con sendMiFareCommand.
Perché un comando torna senza fare nulla?
La piattaforma segnala una risposta consegnata, non un comando accettato. Leggi il contrassegno di errore di una risposta ISO 15693, o i byte di stato di un'APDU, prima di fidarti del risultato.
Da dove vengono i comandi di un chip preciso?
Dalla scheda tecnica di quel chip. Questa rubrica copre i comandi che i tipi di tag del NFC Forum definiscono, e le schede dei chip su wakdev.com coprono il resto.