Comment lire et écrire du NFC depuis votre propre code ?
Par l'API de la plateforme sur laquelle tourne le code : le cadre NFC sur Android, Core NFC sur iPhone, Web NFC dans Chrome pour Android, et PC/SC pour un lecteur branché à un ordinateur. Chacune décide de ce qu'un programme peut envoyer à un tag, du moment où il a le droit d'écouter, et de ce qu'il doit déclarer avant.
Quatre portes d'entrée, quatre jeux de règles
Sur Android, le cadre NFC remet un tag découvert à une activité, qui peut lire et écrire du NDEF, envoyer des commandes brutes au tag, ou répondre à un lecteur par émulation de carte par l'hôte.
Sur iPhone, Core NFC laisse une application lire à l'intérieur d'une session que le système affiche et termine, le modèle que ce site décrit sur la page de la feuille de lecture.
Dans un navigateur, Web NFC lit et écrit du NDEF depuis une page web. Chrome le documente comme disponible sur Android à partir de Chrome 89, et le limite au NDEF volontairement : pas de commande brute, pas d'émulation de carte.
Sur un ordinateur, un lecteur USB s'atteint par PC/SC, la spécification que les ordinateurs emploient pour parler aux lecteurs de cartes à puce, et le programme parle au tag à travers le lecteur plutôt qu'à travers un téléphone.
Elles diffèrent par ce qu'elles peuvent envoyer à un tag, et davantage encore par le moment où elles ont le droit d'écouter. C'est cette seconde différence qu'un portage d'une plateforme à l'autre manque.
Ce que le code doit déclarer
Aucune n'atteint la radio sans s'annoncer. Une application Android demande android.permission.NFC, que la référence des permissions classe comme normale : elle est donc accordée à l'installation, sans invite.
Depuis Android 17, une application qui vise un SDK plus récent doit en outre protéger chaque activité recevant des tags par android.permission.DISPATCH_NFC_MESSAGE, selon le guide des bases du NFC, pour que seul le service NFC puisse la lancer.
Une application iPhone déclare la capacité de lecture de tags et un texte d'usage avant que Core NFC n'ouvre une session, et une session de tags qui lit des tags ISO 7816 énumère aussi les identifiants d'application qu'elle sélectionnera. La page des déclarations couvre les trois.
Une page web a besoin d'une origine sécurisée, d'un cadre de premier niveau et d'un geste du visiteur, un appui sur un bouton par exemple, avant que Chrome ne demande la permission nfc.
Ce que le champ fait au code
Un tag est présent tant qu'une main le tient immobile, et le code s'exécute dans cette fenêtre. La référence de TagTechnology marque chaque échange comme bloquant et l'interdit sur le fil principal, et un tag qui part au milieu lève TagLostException.
Les essais au bureau masquent cela. Le téléphone est posé à plat, le tag ne bouge pas, et la fenêtre ne se referme jamais. Le même code dans la main d'un visiteur rencontre une fenêtre qui se ferme à moitié, et un code qui n'a jamais rencontré ce cas le traite comme un plantage.
Le tag n'est pas non plus ce qu'il était une seconde plus tôt. Android met en cache ce qu'il a lu à la découverte et ne met jamais ces valeurs à jour : un programme qui écrit puis se fie à la copie en cache relit sa propre hypothèse.
Vérifier ce que le code a écrit
Relisez le résultat avec un outil qui n'est pas le code en cours d'épreuve. Un bogue qui écrit le mauvais type d'enregistrement peut le relire comme le bon, puisque c'est le même bogue qui le décode.
NFC Tools, publié par la même société que ce site, montre les enregistrements que porte un tag et les technologies qu'il annonce, ce qui tranche la plupart des désaccords entre un programme et son auteur.
Puis relisez le tag sur l'autre plateforme. Un message qu'un analyseur Android accepte peut ne rien faire sur un iPhone, une décision de plateforme que couvre la page des enregistrements iOS.
Tous les guides de cette rubrique
- Android
- iOS et Core NFC
- Web NFC et multiplateforme
- Sous le NDEF
- Émulation de carte en code
- Lecteurs et appareils
- Tests et mise au point
Android
- Mode lecteur ou dispatch au premier plan : lequel choisir sur Android ?
- Comment déclarer les tags qu'une application Android doit recevoir ?
- Quelle classe de technologie ouvrir pour un tag donné ?
- Comment écrire un message NDEF depuis une application Android ?
- Une application Android peut-elle réagir à un tag sans afficher d'écran ?
- Comment traiter un tag qui arrive pendant que votre activité est ouverte ?
- Quelles limites du contrôleur le code Android doit-il vérifier ?
iOS et Core NFC
- Session NDEF ou session de tag : laquelle ouvrir sur iOS ?
- Que doit déclarer une application iOS avant de lire un tag ?
- Comment écrire et verrouiller un tag NDEF depuis une application iOS ?
- Comment une application iOS reçoit-elle un tag lu en arrière plan ?
- Comment lire plusieurs tags dans une même session iOS ?
- Une application iOS peut-elle lire l'identifiant d'un tag ?
Web NFC et multiplateforme
Sous le NDEF
- Comment envoyer une commande brute à un tag ?
- Qu'est-ce qu'un APDU, et quand le code en a-t-il besoin ?
- Comment lire la mémoire d'un tag de type 2 page par page ?
- Comment lire les blocs d'un tag ISO/IEC 15693 ?
- Comment le code trouve-t-il le fichier NDEF d'un tag de type 4 ?
- Comment le code s'authentifie-t-il sur un tag protégé par mot de passe ?
- Comment détecter qu'un tag a quitté le champ ?
- Comment écrire un tag pour qu'une écriture interrompue ne passe pas pour valide ?
- Comment écrire les pages de configuration sans perdre le tag ?
- Comment un serveur lit-il l'identifiant qu'un tag recopie dans son adresse ?
Émulation de carte en code
- Comment une application Android émule-t-elle une carte par l'hôte ?
- Pourquoi un lecteur atteint-il une autre application que la vôtre ?
- De quoi une application iOS a-t-elle besoin pour émuler une carte ?
- Un téléphone peut-il émuler un tag NDEF pour un autre téléphone ?
- L'émulation de carte par l'hôte marche-t-elle écran éteint ?
Lecteurs et appareils
- Comment un ordinateur parle-t-il à un lecteur NFC en USB ?
- Quelle puce de lecteur convient à un projet sur microcontrôleur ?
- Pourquoi un module de lecteur amateur rate-t-il des tags ?
- Qu'est-ce qu'un tag dynamique, et quand un appareil en a-t-il besoin ?
- Un téléphone peut-il configurer un appareil éteint ?
- Comment dessiner une antenne NFC pour votre propre platine ?
- Votre propre appareil peut-il se comporter en tag ?
Tests et mise au point
- Pourquoi une lecture échoue-t-elle sur une erreur de tag perdu ?
- Pourquoi une session Core NFC se termine-t-elle d'elle-même ?
- Pourquoi une commande expire-t-elle, et combien de temps attendre ?
- Peut-on tester du code NFC sans tag sous la main ?
- Quels tags un développeur doit-il garder pour tester ?
- Comment voir ce qu'une application et un tag échangent vraiment ?
- Que doit faire une application quand le NFC est coupé ou absent ?
- Pourquoi un code écrit pour une puce casse-t-il sur une autre du même type ?
- Une application NFC doit-elle s'installer sur un téléphone sans NFC ?
Questions fréquentes
Quelle plateforme viser pour un premier projet NFC ?
Android, si le projet doit parler au tag lui même. Son cadre atteint le NDEF, les commandes brutes et l'émulation de carte, et un tag peut lancer une application fermée. iOS ajoute une session que le système contrôle et Web NFC s'arrête au NDEF : les deux s'ajoutent plus facilement une fois l'échange au point.
Lire des tags demande-t-il une invite de permission ?
Pas sur Android, où la permission NFC est une permission normale accordée à l'installation. Web NFC interroge le visiteur, et seulement en réponse à un geste comme un appui sur un bouton.
Peut-on tester du code NFC sans téléphone ?
L'analyse et la construction de messages NDEF, oui. Tout ce qui dépend du champ, le minutage, un tag qui part au milieu d'une écriture ou un contrôleur qui refuse une commande, n'apparaît qu'avec de vrais tags sur de vrais téléphones.
D'où viennent les commandes propres à une puce ?
De la fiche technique de cette puce. Cette rubrique couvre les commandes que définissent les types de tag du NFC Forum, et laisse la carte mémoire de chaque puce aux fiches techniques de wakdev.com.