Qu'est-ce qu'un message NDEF, et comment est-il construit ?
Un message NDEF est une suite ordonnée d'enregistrements. Chacun porte un en-tête court qui décrit la nature de son contenu, suivi du contenu lui-même. Cet en-tête est tout l'enjeu : il permet à un lecteur qui n'a jamais vu le tag de décider quoi faire de ce qu'il y trouve.
Un message est une liste d'enregistrements
Un tag porte un message NDEF. Ce message contient un enregistrement ou plusieurs, dans un ordre défini, et des drapeaux marquent lequel est le premier et lequel est le dernier pour qu'un lecteur sache où le message commence et où il finit.
La plupart des tags en circulation portent exactement un enregistrement. Plusieurs sont possibles et coûtent à la fois de la place et du temps de lecture, arbitrage qui mérite d'être fait délibérément plutôt que par habitude.
Ce que contient un enregistrement
Android documente précisément la structure dans sa référence NdefRecord, qui en est la description librement accessible la plus claire.
Un enregistrement porte toujours un champ de nom de type sur trois bits, d'ordinaire écrit TNF, qui donne un typage de haut niveau au reste de l'enregistrement. Viennent ensuite trois champs de longueur variable : un type qui donne le typage détaillé du contenu, un identifiant optionnel rarement employé en pratique, et le contenu lui-même.
| Champ | Toujours présent | Son rôle |
|---|---|---|
| TNF | Oui, trois bits | Typage de haut niveau, dit au lecteur comment interpréter le champ de type |
| Type | Longueur variable | Typage détaillé, tel qu'un schéma d'URI ou un type MIME |
| Identifiant | Optionnel | Métadonnée d'identification, peu employée |
| Contenu | Longueur variable | Le contenu proprement dit |
Pourquoi l'en-tête compte plus que le contenu
Deux tags peuvent porter des octets de contenu identiques et se comporter de façon complètement différente, parce que l'un les déclare comme une adresse web et l'autre comme du texte simple.
Le premier ouvre un navigateur. Le second est affiché, ou entièrement ignoré, selon la plateforme. Rien des octets n'a changé, et tout du résultat a changé.
C'est la chose la plus utile à comprendre sur NDEF, et elle explique la plupart des cas d'un tag qui se lit correctement et ne fait rien. Le contenu allait bien. La déclaration était fausse.
Ce que vous voyez dans un outil
Un outil de lecture affiche d'ordinaire le nombre d'enregistrements, puis pour chacun son type, sa taille et son contenu. Si un enregistrement affiche une taille sans contenu reconnaissable, le contenu est bien là et le type est quelque chose que l'outil ne sait pas décoder.
Un message vide est un état valide et non un défaut. Un tag formaté sans rien d'écrit porte un message avec un unique enregistrement vide, et c'est pourquoi un tag neuf se lit avec succès et ne fait rien.
Questions fréquentes
Un tag peut-il porter plus d'un message NDEF ?
Un message par tag, contenant autant d'enregistrements qu'il en tient. Le message est le contenant et les enregistrements en sont le contenu : la question de plusieurs messages ne se pose pas en pratique.
L'ordre des enregistrements compte-t-il ?
Oui, et plus qu'on ne le pense, les plateformes agissant en général sur le premier enregistrement qu'elles reconnaissent. Placer un repli avant l'enregistrement que l'on voulait déclencher est une erreur courante et évitable.
Un tag vide est-il la même chose qu'un tag non formaté ?
Non. Un tag non formaté n'a pas de structure qu'un lecteur générique puisse employer. Un tag formaté vide a la structure sans le contenu, et la différence compte parce que seul le second est prêt à être écrit normalement.
Faut-il comprendre tout cela pour écrire un tag ?
Pas pour écrire une adresse avec un outil, qui s'en charge pour vous. Cela devient nécessaire dès que quelque chose se comporte de façon inattendue, presque toutes les surprises se ramenant à un type d'enregistrement plutôt qu'à un contenu.