Mobile

Présentation du NFC – Near Field Communication

Publié le : Auteur: Jean-Charles FEVRE 2 commentaires
mobile

Le NFC est un sujet qui revient de plus en plus dans le monde de la mobilité. Ce thème a notamment été abordé aux deux précédentes éditions du Devfest à Nantes. Cet article permet de vous présenter brièvement la technologie.

NFC pour Near Field Communication

Cette technologie permet la communication sans contact, entre un lecteur et une puce (appelée Tag). C’est une communication en champ proche basée sur la technologie RFID (Radio Frequency IDentification). Même si RFID permet la communication sur plusieurs dizaines de mètres, NFC ne peut communiquer que sur une dizaine de centimètres (en général moins de 4 cm).
NFC est spécifié depuis 2004 par le NFC Forum (au départ Sony, NXP), comptant aujourd’hui 140 membres dont Google, Visa, Paypal (liste des membres : http://nfc-forum.org/about-us/our-members/principal/).

NFC Data Exchange Format (NDEF)

Un tag contient un ou plusieurs messages NDEF. Un message NDEF contient un ou plusieurs enregistrements (Record). Un enregistrement contient un en-tête (dont TNF décrit ci après) suivi de son contenu (Payload).

NDEF

Record TNF (Type Name Format)

C’est une convention de code pour économiser des caractères. Les différents TNF sont :

0x00 Vide : Enregistrement vide
0x01 Well-Known Type (WKT) : Type défini par le NFC Forum
0x02 Type MIME
0x03 Absolute Uri
0x04 External
0x05 Type non connu
0x06 Type inchangé (utilisé pour les enregistrements tronqués)
0x07 réservé pour un usage futur

Exemple d’utilisation

Nous allons voir ici comment créer un enregistrement contenant l’URL : http://www.sodifrance.fr.

D1 : Premier et dernier enregistrement, pas tronqué, ..., TNF=Well-Known Type
01 : type sur 1 octet
0C : taille du payload (octets)
55 : type URI
01 : http://www.
73 6f 64 69 66 72 61 6e 63 65 2e 66 72 : sodifrance.fr (converti en hexadécimal)

Toutes ces informations mises bout à bout permettent d’obtenir la séquence suivante :

D1 01 0C 55 01 73 6f 64 69 66 72 61 6e 63 65 2e 66 72    (http://www.sodifrance.fr)

Lorsqu’un terminal scannera le tag, il recevra l’information que c’est une URL et lancera une action correspondante (par exemple, lancement d’un navigateur internet sur smartphone).

NFC avec Android

Le NFC est supporté par Android depuis la version 2.3 (Gingerbread).

Le terminal doit être actif et déverrouillé. Android transforme le tag en Intent (les informations du tag sont encapsulées dans l’Intent), l’application n’est pas en tâche de fond.

Il y a 4 utilisations possibles du NFC avec Android :

  • Mode Reader  : Lecture d’un tag. Code promotionnel, clé d’identification du réseau wifi
  • Mode Writer : Ecriture sur un tag passif.
  • Mode Passif : Agit comme un simple tag. Carte de fidélité, carte de pointage
  • Mode Point-à-point : Communication bidirectionnelle entre 2 appareils. Chaque appareil joue le rôle de reader tour à tour (déclenchement d’un protocole pour l’échange de données, comme bluetooth), il n’y a pas de transfert de données en NFC directement. Echange de fichiers, processus d’authentification

Le paiement sans contact rencontre encore des problèmes d’authentification, de déploiement des terminaux chez les commerçants. Google indique que rien ne presse sur le front du paiement sans contact, estimant que la NFC sera mûre d’ici trois à cinq ans.

Les permissions 

Dans le fichier AndroidManifest.xml, il faut déclarer la permission pour l’utilisation du NFC (uses-feature requis, pour se limiter aux terminaux ayant une puce NFC) :

<uses-permission android:name="android.permission.NFC" />

<uses-feature android:name="android.hardware.nfc" android:required="true" />

Il faut au minimum utiliser la version 10 d’Android (Gingerbread 2.3), mais l’API a été sensiblement enrichie à partir de la version 14  (Ice Cream Sandwich 4.0) :

<uses-sdk android:minSdkVersion="14"/>

Utilisation du intent-filter pour que l’application soit proposée à la lecture d’un tag :

<intent-filter>
  <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

Ecriture sur un tag 

NdefRecord uriRecord = new NdefRecord(  NdefRecord.TNF_ABSOLUTE_URI ,
  "http://www.sodifrance.fr".getBytes(Charset.forName("US-ASCII")),
 new byte[0], new byte[0]);
//ou plus simplement
NdefRecord rtdUriRecord1 = NdefRecord.createUri("http://www.sodifrance.fr");

// Création du message avec l'enregistrement
NdefMessage msg = new NdefMessage(
        new NdefRecord[] { rtdUriRecord1  };

Lecture d’un tag

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);
// Récupération du message
NdefMessage msg = (NdefMessage) rawMsgs[0];
// Récupération des données
String payLoad = new String(msg.getRecords()[0].getPayload());

En savoir plus :

  • Jean-Charles

    Orange a proposé un concours pour promouvoir l’utilisation du NFC. Vous pouvez consulter la liste des lauréats pour avoir des idées d’applications utilisant le NFC. http://www.orange-nfc-awards.orange.com

    • Vincent Hanniet

      C’est intéressant de parcourir cette liste : les applications sont très éclectiques. On sent bien qu’il y a certainement des marchés grand public pour le NFC mais pour le moment l’appli Lauréate est… un jeu ;( C’est pas encore mûr 😉