Programmez vos tags NFC avec Windows 8
Peut-être que peu de programmeurs ont eu la chance de faire du NFC avec Windows 8 pour le moment. Pourquoi ? Eh bien tout simplement parce que le système d’exploitation n’est pas encore sorti (mais bon… tous les bons programmeurs l’utilisent déjà, non ?), ou peut-être parce que trouver des lecteurs NFC est excessivement difficile pour le moment et qu’il faut attendre encore quelques semaines… mais soyez patient, ça vaudra la peine!
Entre temps, je vais vous donner l’eau à la bouche pour vous montrer à quel point il est facile de programmer une puce NFC a l’aide de l’API de Windows 8 en quelques lignes de code.
Le fonctionnement
Le fonctionnement de la technologie NFC est plutôt simple. Faisant partie de la famille des technologies RFID (Radio Frequencies IDentification, ou communément appelée la Radio-Identification en français), le champ proche (Near Field) n’existe qu’à quelques dizaines de millimètres de distance tout au plus. L’intérêt est tout là justement : plus la distance est limité, meilleure est la discrétion des échanges.
Tout comme pour la technologie RFID, il est possible d’avoir des puces passives qui n’ont besoin d’aucune alimentation pour fonctionner. Le lecteur fournit l’induction nécessaire pour alimenter la puce et lui permettre de communiquer via des fréquences prédéfinies. Dans le cas du NFC, il s’agit de la fréquence 13,56 MHz.
Lorsque 2 appareils alimentés communiquent ensemble, on dit que la connexion est active-active. Lorsqu’un appareil doit alimenter une puce à proximité pour communiquer avec, on parle alors de connexion active-passive. Les communications active-active ont quelques avantages car elles permettent une communication plus rapide.
Cependant, la majorité du temps les données à transférer consistent en un url de quelques caractères et la vitesse de transmission est normalement entre 100 et 800 kbit/seconde, ce qui représente de 12 à 100 caractères par seconde. Donc transférer un message qui contient un url d’une vingtaine de caractères peut prendre d’un huitième de seconde à un peu plus d’une seconde. Ce n’est pas très rapide, mais amplement suffisant pour les besoins. Surtout que les données comme les urls peuvent être abbrégés pour prendre moins de place.
Je n’irai pas plus loin dans l’explication du fonctionnement de cette technologie pour plusieurs raison : je ne suis pas un expert en électronique et en radio-communications et mon objectif est plutôt de vous parler de son utilisation et moins de son fonctionnement.
Les tags
Les tags sont ni plus ni moins qu’une puce passive que vous pouvez acheter à quelques cents l’unité. Elles se présentent sous plusieurs formes – autocollants, cartes d’affaires, cartes plasfifiées, porte-clés, etc… Et vous pouvez même acheter juste la puce, si vous souhaitez la mettre dans des vêtements ou d’autres types d’objets. C’est plutôt versatile.
Personnellement, je les achète sur le site http://www.buynfctags.com/ mais libre à vous de les acheter ailleurs : il y a des dizaines de vendeurs sur le web et il est à prévoir que ce nombre ne va pas aller en diminuant.
Il y a 2 principaux modèles de puces NFC, soit les FeliCa fabriquées par Sony et les MIFARE fabriquées par NXP Semiconductors (filiale de Philips Electronics). Mais elles s’utilisent grosso-modo de la même manière et le reste de cet article devrait fonctionner avec tous les modèles de tags NFC.
Je ne vous parlerai pas des types de puces (type 1, type 2, type 3 et type 4), ce n’est pas important pour le moment. Sachez simplement qu’il y a des puces « dry » (sèches) et d’autres « wet » (mouillées). Les « wet » sont alimentées et coûtent sensiblement plus chères, mais sont également plus rapides.
Finalement, les tags peuvent être réécrits à volonté, mais la majorité permettent également une commande permettant de les verrouiller de manière permanente. Ceci permet d’éviter que vos tags ne soient reprogrammées par le premier venu qui a une application pour ça sur son téléphone…
L’API
L’api de Windows 8 est vraiment simple. Vous allez le trouverez dans le namespace Windows.Networking.Proximity de WinRT. Je crois qu’il doit être possible de l’utiliser à partir d’une application .NET 4.5, mais je n’ai pas expérimenté sur ce terrain pour le moment.
La classe qui va nous intéresser dans cet article est ProxymityDevice et comporte les membres suivants :
- Méthodes statiques
- FromId(), GetDefault() et GetDeviceSelector() sont grosso-modo des factories qui permettent d’obtenir le device NFC qui vous intéresse.
- Méthodes d’instance
- PublishBinaryMessage(), PublishMessage() et PublishUriMessage() permettent de publier un message vers le device. S’il y a un device à proximité il sera transmis jusqu’à ce que StopPublishingMessage() soit appelé. La version binaire demande cependant de connaître le format NDEF, décrit dans la section suivante de cet article.
- StopPublishingMessage() a un nom suffisamment éloquant pour que sa description soit inutile.
- SubscribeForMessage() permet de recevoir un message selon un format défini. Je ne vais cependant pas couvrir cette méthode dans cet article.
- Propriétés
- BitsPerSecond, DeviceId et MaxMessageBytes permettent d’en savoir davantage sur un device en particulier.
- Évènements
- DeviceArrived et DeviceDeparted permettent d’être notifié lorsqu’un autre appareil ou un tag est détecté par notre périphérique NFC.
Que représente une instance de ProximityDevice ?
Une instance de la classe ProximityDevice représente le périphérique physique (normalement branché en USB ou incorporé à l’intérieur de l’ordinateur lui-même) qui a la capacité de communiquer en NFC. Il peut être mélangeant car lorsqu’un appareil arrive à proximité et que l’événement « DeviceArrived » est levé, le nom de l’évènement porterait à croire qu’il s’agit d’une nouvelle instance de ProximityDevice qui représente l’autre appareil. Mais il n’en est rien : l’API se contente de respecter (partiellement) le patron standard d’évènement de .NET et d’envoyer le sender comme premier paramètre.
Ainsi, il n’y a pas moyen de viser un appareil distant en particulier. Prenez pour acquis qu’il n’y en aura qu’un seul a la fois par périphéque NFC que vous avez (et qu’il est improbable que vous en ayez plus d’un).
NDEF : Le format de données
Les données binaires transférées via NFC suivent un format standardisé défini par la norme NDEF (NFC Data Exchange Format), publiées par un consortium qui s’appelle NFC Forum. Les specifications peuvent être téléchargées gratuitement depuis leur site, en échange de la création d’un compte.
Je ne vais pas décrire l’ensemble des possibilités du format NDEF, mais je vais plutôt me concentrer sur la fonctionnalitée appelée « SmartPoster », qui consiste à programmer un tag NFC de manière à ce que ce dernier transmette un URL.
Le format NDEF fonctionne en 2 niveaux :
- Un message, qui est l’intégralité de ce qui est transféré entre 2 appareils selon le protocole NFC et peut contenir un ou plusieurs records.
- Un record, qui est une instruction spécifique. Ce record peut être standard ou pripriétaire, le format est assez extensible pour couvrir un bon nombre de scénarios applicatifs.
Programmer un tag NFC
Pour programmer un tag NFC, je vais faire le paresseux et vous diriger vers d’autres qui le font très bien : le projet « ndef » sur codeplex, disponible à l’adresse http://ndef.codeplex.com/.
Ils fournissent le code qui permet de programmer un SmartPoster que je recopie intégralement ici, tout en changeant les commentaires :
// Création d'un record NDEF de type "SmartPoster" // Il s'agit d'un message à destination d'un tag pour // le programmer. var spRecord = new NdefSpRecord { Uri = "http://nokia.com", NfcAction = NdefSpActRecord.NfcActionType.DoAction }; spRecord.AddTitle(new NdefTextRecord { Text = "Nokia", LanguageCode = "en" }); // On crée un message NDEF dans lequel on met le record de // type "SmartPoster" créé précédemment var msg = new NdefMessage { spRecord }; // On envoie le message en spécifiant à Windows qu'ils faut utiliser // la commande d'écriture de tag _device.PublishBinaryMessage("NDEF:WriteTag", msg.ToByteArray().AsBuffer());
C’est tout! Après cela, si vous approchez votre tablette de ce tag (ou le tag de la tablette, ce qui est souvent le cas lorsque l’on développe), il sera lu automatiquement par l’OS!
Et l’URI transmis, ça peut être quoi ?
Noter qu’on parle d’URI ici et non pas d’URL. La différence est subtile, mais ça veut dire qu’on ne se limite pas à des http:// ou https:// ici. On peut y mettre des « scheme » propriétaire ou spécifique aux applications qu’on veut faire.
Il existe d’autres schemes standard tels que tel:, sms:, mailto:, irc… Certaines applications ont même déjà publiées certains schemes tels que skype:<username/number>, gtalk (google Talk), ymsgr (Yahoo Messenger). Le RFC 5870 défini même le scheme « geo: » qui permet de spécifier des trajets géographiques. Les possibilités sont nombreuses. Imaginez un tag NFC qui vous donne le trajet pour vous rendre à pied un chalet en plein bois…
Les possibilités sont tellement nombreuses qu’il est impossible de toutes les énumérer dans cet article.
Et Windows Phone ?
Il est tout à fait prévisible que les principes décrits ci-haut soient directement compatible avec Windows Phone 8. À suivre lorsque le le SDK sera disponible, probablement dans quelques jours (les téléphones seront en vente dans 12 jours).
Vais-je pouvoir l’utiliser dans le métro ?
Le métro de Montréal utilise la carte OPUS, qui fait partie du réseau Calypso (tout comme le Navigo à Paris, la carte Modalis en Aquitaine, la SmartLink à Newark… et une quarantaine d’autres réseaux de transports dans le monde) et utilise des protocoles propriétaires. Je crois qu’il est trop tôt pour se prononcer s’il sera possible de mettre un titre du réseau Calypso dans votre tablette Windows 8 ou votre téléphone Windows Phone 8.
Si par contre vous avez des détails à ce sujet, contactez-moi, ça m’intéresse !
Et si j’ai un iPhone ?
Apple a décidé que le NFC, ce n’est pas pour vous. Que faites-vous sur ce blog ??
Répondre à Jean-Philippe Encausse Annuler la réponse