Come si scrive un tag perché una scrittura interrotta non passi per valida?
Metti prima a zero la lunghezza del messaggio, scrivi il messaggio, e scrivi per ultima la lunghezza vera. Un'interruzione prima dell'ultimo passo lascia un tag che si legge come vuoto invece di una lunghezza che annuncia byte mai arrivati. La pila NFC libera di Android scrive il NDEF in questo ordine sui tag di tipo 2, 4 e 5.
Una scrittura è tanti comandi
Un tag di tipo 2 prende quattro byte per comando. Il riferimento di MifareUltralight documenta writePage() come scrittura di una pagina e dice che il protocollo scrive sempre una pagina alla volta, quindi un messaggio di cento byte prende una venticinquina di comandi. Un tag che se ne va fra due di essi tiene le pagine già scritte accanto alle pagine che portava prima.
Quello che decide il risultato è il campo della lunghezza. Scritto per primo con il suo valore nuovo, annuncia il messaggio nuovo mentre le pagine successive portano ancora quello vecchio, e un lettore analizza la mescolanza come un messaggio: la pagina della scrittura a metà descrive il tag che poi si legge come corrotto o si ferma per strada. Scritto per ultimo, non dà a un lettore niente da analizzare finché il messaggio non è completo.
L'ordine, tipo per tipo
La pila NFC libera di Android applica gli stessi tre passi a ciascun tipo, e il suo sorgente li mostra:
| Tipo | Campo della lunghezza | Passi nella pila |
|---|---|---|
| Tipo 2 | La lunghezza del blocco TLV NDEF | Scrive il blocco che la porta con una lunghezza pari a zero, poi il messaggio, poi di nuovo il blocco con la lunghezza vera, in rw_t2t_ndef.cc |
| Tipo 4 | NLEN, all'inizio del file NDEF | Mette NLEN a 0000, scrive il messaggio dopo di esso, poi scrive NLEN, in rw_t4t.cc |
| Tipo 5 | La lunghezza del blocco TLV NDEF | Mette la lunghezza a zero, scrive il messaggio e il blocco Terminator, poi mette la lunghezza, in rw_i93.cc |
Un'interruzione dopo il primo passo lascia un messaggio NDEF di lunghezza zero. I lettori segnalano un tag vuoto, e l'applicazione che lo ha scritto sa che la sua scrittura non è andata in fondo.
L'ordine protegge il messaggio, non la pagina che si stava scrivendo quando arriva l'interruzione. Quello che un chip porta in una pagina la cui scrittura è stata tagliata è una proprietà del chip, e l'ordine restringe quel rischio alla scrittura finale, quella che mette la lunghezza.
Quando è la piattaforma a scrivere per te
Su Android, Ndef.writeNdefMessage() consegna il messaggio alla pila NFC, che lo scrive nell'ordine qui sopra, e il codice che la usa non ha niente da aggiungere se non una rilettura. Un costruttore di telefoni può consegnare una pila modificata, quindi la rilettura è la verifica che tiene su ogni telefono.
Su iOS, il riferimento di Apple per writeNDEF non descrive l'ordine che il suo scrittore usa. Un'applicazione viene a sapere di un aggiornamento fallito tramite ndefReaderSessionErrorTagUpdateFailure o una connessione persa, come spiega la pagina della scrittura su iOS, e rilegge il tag per sapere che cosa porta ora.
Quando è il tuo codice a scrivere le pagine
Il codice che scrive pagine grezze, per scrivere un tag protetto dopo essersi autenticato o per conservare dati che non sono NDEF, prende il posto della pila. Per il NDEF, segue la tabella: lunghezza a zero, scrivi il messaggio, scrivi la lunghezza. La pagina che porta la lunghezza porta di solito anche i primi byte del messaggio, quindi l'ultima scrittura riscrive quella pagina con tutti e due, come fa la pila di Android.
Per dati che non sono NDEF, la stessa idea vuole un campo proprio dell'applicazione, una lunghezza, una versione o una somma di controllo scritta dopo i dati, che il codice che legge verifica prima di fidarsi di qualcosa. Senza, una scrittura interrotta sembra esattamente dei dati.
Poi rileggi e confronta. Una scrittura il cui ultimo comando è finito in un'eccezione ha un esito sconosciuto, e la pagina della scrittura a metà spiega perché la lettura viene prima di ogni secondo tentativo.
Domande frequenti
Ndef.writeNdefMessage scrive già in questo ordine?
Nella pila NFC libera di Android sì, sui tag di tipo 2, 4 e 5. Rileggi comunque il tag, dato che un costruttore di telefoni può modificare la pila.
Che cosa vede un lettore dopo una scrittura interrotta?
Un messaggio NDEF di lunghezza zero, quando l'interruzione è arrivata fra il primo e l'ultimo passo. Le applicazioni lo segnalano come un tag vuoto.
La scrittura finale della lunghezza si può interrompere a sua volta?
Sì, e nessun ordine protegge quel comando. L'ordine restringe il rischio a una sola scrittura, e quello che porta una pagina tagliata durante la propria scrittura dipende dal chip.
iOS scrive il NDEF nello stesso ordine?
Il riferimento di Apple non lo dice. Verifica il risultato rileggendo il tag dopo aver scritto.