Near Field Communication

NFC, Le software

Les couches protocolaire

Comme précisé en introduction, le NFC n'est pas une nouvelle technologie à part entière. Il s'appuie sur des normes existantes. Le NFC apporte réellement 3 couches protocolaires qui vont venir en surcouches des normes ISO sur lesquelles il se base.


Illustration du mode card eumation du nfc

Si nous partons du bas de l'architecture logicielle, nous trouvons dans un premier temps les couches ISO-14443 et Felica. Ces couches sont les normes sur lesquelles s'appuie le NFC. Elles permettent de piloter directement le hardware (gestion du champ magnétique, fréquence des ondes émises, émissions des données dans l'air...). Nous retrouvons ensuite les 3 couches protocolaires amenées par le NFC: DEP, LLCP, SNEP,

Data exchange protocol

Le NFC-DEP est un protocole d'échange de données bas niveau. Il peut s'appuyer soit sur la couche physique NFC-A (ISO 14 443 - A) ou bien sur la couche NFC-F (Felica). Dans le protocole DEP, l'équipement qui initie la connexion est appelé Initiator tandis que l'équipement cible est appelé Target. Les messages respectant DEP suivent le format suivant :


Illustration d'une trame dep

Start of Data (SOD) : Dans ce protocole, le début d'un message doit indiquer la taille totale du message. La taille des données doit être comprise entre 3 et 255 octets.
Payload : Le champ Payload contient la commande DEP à effectuer suivi du corps du message à envoyer au périphérique distant.
End of Data (EOD) : Le champ End of Data contient des octets de contrôle permettant de vérifier qu'il n'y a pas eu d'erreurs de transmission.

Principales commandes
Commandes Descriptions
Atr_Req La commande Attribute Request permet d'activer une connexion DEP entre deux périphériques. Elle permet également de définir les paramètres de communication tels que la vitesse de communication, la taille maximale d'un message etc. Sans cette activation, il est impossible d'échanger des messages à travers le Protocol DEP.
Pls_Req La commande Parameter Selection Request permet de changer les paramètres de connexion définis lors de la commande ATR_REQ. Cette commande est notamment utilisée lorsqu'un Initiator effectue une demande de connexion avec un périphérique et que celui-ci ne supporte pas les paramètres de connexion demandés. L'Initiator effectue alors un PLS_REQ pour redéfinir les paramètres si cela est possible.
Dep_Req La commande Data exchange protocol request est la commande permettant d'échanger des données avec un périphérique distant.
Dsl_Req La commande Deselect Request est la commande permettant de désélectionner un périphérique NFC précédemment activé. Une fois désélectionné, il reste en attente de reconnexion.
Rls_Req La commande Release Request est la commande permettant de fermer une connexion avec un périphérique NFC précédemment activé. Une fois la connexion fermée, le périphérique distant n'est plus en attente d'aucun message.

En résumé, le couche DEP permet de paramétrer un lien entre deux périphériques et ainsi de définir la façon de communiquer (vitesses, temps de réponse...).

Logical link control protocol

La couche LLCP est un protocole d'échange de données offrant différents services de contrôle et permet l'utilisation d'un mode connecté ou non connecté. L'utilisation du protocole SNEP nécessite d'utiliser LLCP en mode connecté uniquement. C'est donc ce mode que est générallement implémenté. Dans ce mode, LLCP utilise un mode de communication half duplex (Question/Réponse). On ne peut envoyer qu'une trame à la fois, celle-ci devant être suivie obligatoirement d'une trame réponse dans les délais impartis. L'échange de trames doit être permanant même lorsqu'il n'y a pas de données utiles à envoyer. Cet échange permanant permet de détecter les pertes de connexions. Un message Llcp suit le format suivant :


Illustration d'une trame llcp

Dsap : Destination Service Access Point. Sur un même équipement, plusieurs applications peuvent utiliser Llcp simultanément. Le champ dsap est un numéro d'identification attribué à un service (une application) utilisant llcp. Il permet de déterminer à qui le message est destiné.
Type : PDU type. Ce champ représente la commande LLCP à effectuer.
Ssap : Source Service Access Point. Le champ dsap est un numéro d'identification attribué à un service (une application) utilisant llcp. Il permet de déterminer de qui le message provient.
Sequence : Sequence number. Un numéro de séquence est attribué à chaque message envoyé. Il permet d'effectuer un contrôle afin de vérifier qu'aucun message n'a été perdu en route.
Information : Le champ information contient le corps du message en lui même.

Principales commandes
Commandes Descriptions
Symmetry Pdu Cette commande permet de respecter le balancement 1 trame envoyé, 1 trame reçue ... Elle doit être utilisé lorsqu'aucune autre commande ne peut être envoyé en réponse d'une trame reçue.
Connect Cette commande permet d'effectuer une demande de connexion d'un service local vers un service distant à travers un lien llcp . La commande Connect permet d'échanger également différents paramètres tels que la version de la librairie, les services supportés, le timeout de la connexion . . .
Disconnect Cette commande permet de terminer une connexion ou de désactiver un lien llcp.
Connection Complete Commande en réponse à la commande Connect confirmant que la connexion à bien été établie.
Information Cette commande permet d'échanger des données à travers la connexion établie. Elle permet également d'acquitter des messages reçues grâce au champ Séquence.

En résumé, la couche LLCP permet de maintenir une connexion entre deux périphériques et de détecter lorsque l'un des deux ne répond plus. Elle fournit également du contrôle de données grâce aux numéros de séquences attribués aux messages permettant de vérifier qu'ils ont bien tous été reçus.

Simple NDEF exchange protocol

Le protocole SNEP permet d'échanger des messages dans un format particulier (NDEF). Il est notamment utilisé en surcouche de LLCP par le BEAM des smartphone Android. Ce protocole est assez simple.


Illustration d'une trame dep

Version: Ce champ correspond à la version de SNEP utilisée.
Request: Ce champ correspond à la commande SNEP à effectuer.
Length: Ce champ correspond à la taille du message à transmettre
Information : Le champ information contient le corps du message en lui même.

Principales commandes
Commandes Descriptions
Continue Cette commande est utilisée après avoir reçu un PUT ou un GET. Elle doit être utilisée lorsque la commande reçue ne tient pas en une seule trame pour confirmer la capacité à recevoir le reste du message.
Get Cette commande permet de demander à un périphérique de nous envoyer un Ndef message en particulier.
Put Cette commande permet d'envoyer à un périphérique un Ndef message.
Reject Cette commande est utilisée après avoir reçu un PUT ou un GET. Elle doit être utilisée lorsque la commande reçue ne tient pas en une seule trame pour préciser que l'on ne peut pas recevoir la suite du message.

En résumé, SNEP fournit une interface de programmation pour envoyer des messages en NFC simple à utiliser pour les développeurs. Elle permet une fois toutes les couches implémentées de profiter de tous leurs avantages (contrôle de données, paramétrage de connexions etc) sans avoir à se soucier de quoi que ce soit, le travail étant effectué par les couches inférieurs à SNEP.