Quelle classe de technologie ouvrir pour un tag donné ?
La plus haute qui fasse le travail : Ndef pour lire et écrire un message, IsoDep pour des APDU, une classe brute comme NfcA ou NfcV pour des commandes propres à la puce. Le tag annonce lui même les classes ouvrables, trois d'entre elles sont facultatives, et une seule se connecte à la fois.
Ce que getTechList annonce
Tout tag découvert arrive avec un objet Tag, dont getTechList() nomme les classes que votre code peut ouvrir dessus. Un tag en annonce en général plusieurs à la fois : la référence de MifareUltralight note que NfcA est énumérée à côté d'elle dans tous les cas, puisqu'un tel tag est aussi un tag NFC-A.
| Classe | Ce qu'elle donne à votre code | Obligatoire sur tout téléphone |
|---|---|---|
Ndef | Lecture et écriture NDEF sur les types NFC Forum 1 à 4 | Oui |
NdefFormatable | Formater un tag vierge et y écrire un premier message | Seulement pour les tags que le téléphone sait formater |
NfcA, NfcB, NfcF, NfcV | Commandes brutes au niveau radio de chaque technologie | Oui |
IsoDep | APDU par ISO/IEC 14443-4 | Oui |
MifareClassic | Accès aux secteurs après authentification par clé | Non |
MifareUltralight | Lecture et écriture de pages | Non |
NfcBarcode | Tags qui ne portent qu'un code barres | Non |
La liste est figée à la découverte. La référence de TagTechnology partage chaque classe entre des accesseurs en cache, qui décrivent le tag tel qu'il était en entrant dans le champ et ne se mettent jamais à jour, et des opérations d'entrée sortie, qui parlent au tag et peuvent bloquer.
Le plus haut niveau qui fasse le travail
Ndef masque les différences entre types de tag : les mêmes appels lisent et écrivent un autocollant de type 2 et une carte de type 4. Un code écrit contre elle continue de marcher quand le fournisseur change de puce.
Les classes brutes retirent cette protection. NfcA.transceive() envoie vos octets tels quels, le contrôleur n'ajoutant que le CRC : le jeu de commandes et la carte mémoire deviennent votre affaire, et tous deux changent d'une puce à l'autre. Ils sont définis dans la fiche technique de chaque puce, que ce site laisse à wakdev.com.
IsoDep se place entre les deux. Elle porte des APDU vers des cartes et vers des tags de type 4, et la référence d'IsoDep indique qu'elle fragmente et réassemble elle même les longs échanges, de sorte que votre code envoie des commandes entières.
NdefFormatable ne sert qu'à un moment de la vie d'un tag. Sa référence reconnaît que les procédures de formatage ne sont pas spécifiées par le NFC Forum et ne sont pas connues en général, ce qui explique que la classe n'apparaisse que sur les tags qu'un téléphone donné sait formater.
Une connexion à la fois
Un tag n'accepte qu'une classe ouverte à la fois. La référence le dit sans détour, et un second connect() échoue par IOException : un code qui ouvre Ndef pour lire puis NfcA pour interroger la puce doit fermer la première avant d'ouvrir la seconde.
Tout appel qui touche la radio bloque et doit rester hors du fil principal. close() est la sortie d'un appel bloqué : lancé depuis un autre fil, il annule l'opération en cours par IOException.
Un objet Tag est également lié à une seule apparition. La référence de Tag indique qu'un nouvel objet est créé chaque fois que le tag entre à portée, même pour le même tag physique, et que seul le plus récent peut ouvrir une classe. Employer un objet plus ancien après le départ de son tag lève SecurityException.
Les classes qu'un téléphone peut ne pas offrir
Trois classes sont facultatives, et leur absence est silencieuse. Un téléphone qui n'implémente pas MifareClassic ne la liste jamais : la même carte annonce donc la classe sur un téléphone et pas sur un autre, et un code qui la supposait n'échoue que sur le terrain.
Ndef elle même n'est garantie que sur les types NFC Forum 1 à 4. La référence de Ndef traite les formats propriétaires, NDEF stocké sur MIFARE Classic compris, comme un effort au mieux, et recommande pour cette raison les types NFC Forum pour tout nouveau déploiement.
Testez donc la classe, et non le modèle de téléphone. La liste annoncée par le tag que vous tenez est la seule réponse qui tienne encore sur le téléphone suivant.
Questions fréquentes
Puis-je ouvrir Ndef et NfcA sur le même tag en même temps ?
Non. Une seule classe peut être connectée à un tag à la fois : fermez la première avant de connecter la seconde.
Pourquoi NdefFormatable manque-t-elle sur un tag vierge ?
Le téléphone ne sait pas formater ce tag. La référence précise que la classe n'est énumérée que pour les tags que l'appareil sait formater, et aucun jeu de tags n'est obligatoire.
Pourquoi getCachedNdefMessage montre-t-il encore l'ancien contenu après une écriture ?
Il rend le message lu à l'entrée du tag dans le champ et ne se met jamais à jour. Lisez le contenu courant avec getNdefMessage, qui parle au tag.
Faut-il employer MifareClassic dans un code neuf ?
Seulement pour lire des cartes MIFARE Classic existantes, et avec un repli pour les téléphones qui en sont dépourvus. La classe est facultative, et la référence de Ndef recommande les types NFC Forum pour un déploiement neuf.