NFC : Etat des lieux et développement

On a tous déjà utilisé ou presque des technologies de communication à courte portée telles que le RFID (Radio Frequency Identification)  et son sous ensemble qu’est le NFC (Near Field Communication).

Avec les téléphones équipés de composants NFC, on peut sentir des objets électroniques dans un rayon de couverture assez proche pour échanger des données. De la même manière, lorsque deux terminaux mobiles équipés d’un composant NFC sont en contact, on peut aujourd’hui utiliser le protocole peer-to-peer pour partager des ressources.

Dans ce billet, nous allons essayer de comprendre le NFC, voir les avantages et les inconvénients de cette technologie. Nous verrons aussi comment la plateforme Android nous permet d’utiliser le NFC dans nos applications mobiles via la mise en œuvre d’un cas concret.

C’est quoi le NFC

Le NFC est basé sur la technologie RFID. Les tags NFC peuvent être scannés sur une distance théorique de 1-10cm. En pratique, la distance varie entre 1-5cm. La quantité d’information que peut stocker un tag NFC est faible et peut varier entre 48 bytes et 8 kilos bytes. Les données d’un tag peuvent être lues ou mises à jours si ce dernier n’est pas protégé en écriture. La vitesse de transmission des données est faible mais elle reste plus rapide que le QR code. Elle peut varier entre 106 – 424 kbps. Contrairement au bluetooth, il n’y a pas de notion de « pairing » qui oblige un terminal mobile à accepter la connexion de la part d’un autre via un échange de clé de session. Ceci fait du NFC une technologie avec peu de friction. Les tags NFC sont passifs c’est à dire qu’ils n’embarquent aucune batterie ou source d’énergie. La seule source d’énergie est celle du terminal qui les embarque.

Les différents modes NFC

Nous disposons de trois modes de fonctionnement :

  • Le mode tag : ce mode permet de lire ou d’écrire des informations dans un tag NFC.
  • Le mode émulation de carte: dans ce mode, la puce NFC se comporte comme une « smart card » et peut donc servir de moyen de paiement et s’utiliser dans les applications sécurisées
  • Le mode P2P: c’est le mode qui permet d’échanger de l’information ou de partager de ressources  entre deux terminaux en peer-to-peer.

Le format NDEF

Le format d’échange standard entre terminaux équipés de NFC et les tags NFC est le format binaire léger appelé NDEF (NFC Data Exchange Format).

Ce format permet de structurer des messages NDEF appelés  « NDEFMessage » . Chaque message NDEF (NDEFMessage) peut contenir un ou plusieurs enregistrements NDEF  appelés « NDEFRecord ». Un « NDEFRecord » embarque les données que l’application mobile aimerait inscrire sur le tag NFC. Une donnée se compose dans ce cas de deux parties, le « payload » et les méta données additionnelles (metadata) qui devront aider les applications à traiter rapidement le « payload » durant le transfert.

Les applications et services autour du NFC

Il existe plusieurs applications et services autour du NFC. On peut citer entre autres :

  • Les systèmes de suivi d’inventaire
  • Les portes d’entrée sans clé
  • Les systèmes d’authentification duale (passcode + NFC physique)
  • Le media center
  • Les affiches publicitaires
  • La promotion d’évènements spéciaux
  • Les applications de suivi de table de réservation
  • Le paiement mobile
  • Les distributeurs de boissons
  • Disneyland Ressort et l’usage des bracelets NFC

Plateforme mobiles et NFC

Presque toutes les plateformes mobiles actuelles supportent le NFC à l’exception de l’iOS qui émet des réserves pour le moment comme le montre le tableau ci-dessous.

PlateformesSupport
JavaMeOK
iOSKO
AndroidOK
Windows PhoneOK
BlackBerry 10OK
BadaOK
 

Avantages et inconvénients du NFC

La technologie NFC présente certains avantages et inconvénients à savoir :

  • Puissance faible et basé sur la proximité
  • Pas de communication verbeuse
  • Scan singulier
  • Sécurité
  • Emulation de carte
  • Les matériaux supportés

NFC et Application android

Android est l’une des plateformes mobiles qui supportent le mieux le NFC surtout dans son mode peer-to-peer. Dans les lignes suivantes nous allons essayer de comprendre l’écrire d’une application mobile basée sur du NFC sous android. Il s’agira d’écrire une application de suivi d’un stock d’ordinateurs.

Quésaco ?

On voudrait une application mobile permettant de vite scanner les ordinateurs utilisés par les employés d’une société. Lors du scan, on à la possibilité de lire rapidement les informations concernant le poste (sa configuration matérielle.) mais aussi être capable de mettre à jour ces informations. L’autre fonctionnalité de l’application consiste à partager la fiche technique d’un poste avec un autre terminal mobile équipé d’une puce NFC et de l’application mobile.

Quelles sont les étapes ?

Modifier le fichier AndroidManifest.xml

Tout projet android comprend  un fichier manifeste ; afin de rendre le projet compatible à la technologie NFC, il convient de faire certaines modifications qu’on verra dans les lignes qui suivent :

  1. Permission et le minimum API level :

Pour cibler les terminaux supportant le NFC, on doit déclarer le package «android.hardware.NFC » comme fonctionnalité. On doit aussi préciser que l’application requiert la permission d’utiliser le lecteur NFC du terminal en ajoutant le code suivant dans le fichier manifeste :

Lorsque l’application requiert le NFC comme fonctionnalité, il est important de déclarer une version SDK minimum >= 10.

Le support NFC sur android est possible à partir de l’API level 10 du SDK. Par contre le support peer-to-peer du NFC est possible à partir de l’API level 14. Il convient donc de spécifier une version minimale de SDK raisonnable.

  1. Les filtres d’intention:

Afin de gérer les évènements de scanning de tags NFC, on doit rajouter des filtres d’intention (IntentFilter) à nos activités. Le système android met à notre disposition trois actions ou intentions possibles dans ce cas :

  • android.nfc.action.NDEF_DISCOVERED* – c’est le filtre d’intention ayant la plus forte priorité et qui permet d’associer le contenu du tag NFC à l’application mobile qui devrait le gérer. Il sera le filtre le plus utilisé dans cette catégorie d’application mobile.*
  • android.nfc.action.ACTION_TECH_DISCOVERED* – ce filtre peut être utilisé lorsque le format des tags NFC n’est pas du NDEF. Par exemple, on n’utilisera jamais ce filtre si l’on contrôle l’écriture d’un tag qui supporte le format NDEF.*
  • android.nfc.action.ACTION_TAG_DISCOVERED* – son usage dans le fichier manifeste n’est pas recommandé par la documentation Android. Aucune activité ne répondra à cette intention (intent) lorsqu’ un tag est découvert en réponse aux deux premières intentions.*

Dans notre cas, seul le premier filtre nous intéresse vraiment. On devrait donc avoir ce bout de code dans notre fichier manifeste :

L’attribut data android:mimeType=”text/plain” rend le scanning des tags générique. Ce qui veut dire que toute application installée sur le téléphone et supportant le NFC sera candidat pour gérer le tag scanné. Afin d’éviter ceci, il convient d’avoir des « Mime Types » personnalisés.

  1. Personnaliser les filtres d’intention avec des « Mime types » :

*<data android:mimeType=”application/fr.ippon.nfcdemo ” />

Notons que le MIME type application/fr.ippon.nfcdemoest arbitrairement défini par le développeur. Il suffit tout simplement d’être consistant entre les filtres d’intention et le contenu des tags NFC.

  1. Personnaliser les filtres d’intention avec des URL :

Ce paragraphe est optionnel. Contrairement aux lignes précédentes, on peut être emmené à amorcer une application mobile lorsque le tag NFC contient un URL spécifique. Dans ce cas, la détection ne se base plus sur le « Mime Type » mais plutôt sur le format de l’url contenu dans le tag comme expliqué dans l’exemple qui suit.

<data android:host=”m.ippon.fr”android:pathPrefix=”/employe/” android:scheme=”http” />

Dans ce cas, l’application mobile réagira lorsqu’elle va scanner un tag contenant un url de la forme http://m.ippon.fr/employe/xxx. Ce qui peut avoir un intérêt dans certains cas d’applications mobiles.

Le contenu du fichier manifeste de notre application mobile est alors le suivant : (gist). La prochaine étape consiste à la modification de la classe de notre activité.

Modifier la classe de l’activité principale

Dans notre cas, la classe java correspondant à l’activité principale s’appelle NFCInventoryActivity.java.
Nous allons essayer de comprendre la structure de cette classe dont le code complet se trouve ici : (gist)

  1. NfcAdapter

C’est la classe qui nous permet d’avoir une référence à une instance de l’adaptateur NFC qui n’est rien d’autre que le pont pour la puce NFC du terminal. Avec l’adaptateur NFC, on peut vérifier si le NFC est activé ou non sur le téléphone du l’utilisateur et contrôler la lecture et l’écriture des messages NDEF sur les tag NFC.

// get an instance of the context’s cached

*NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

// check if NFC is enabled


Boolean nfcEnabled = mNfcAdapter.isEnabled();

if (nfcEnabled)
{

//show off your fancy NFC feature!

} else 
{

//  let the user know how to turn NFC on in the Settings

*** 
}***

En plus de la méthode isEnabled(), la classe NfcAdapter comprend deux autres paires de méthodes importantes à savoir : enableForegroundDispatch()/disableForegroundDispatch() et enableForegroundNdefPush()/***disableForegroundNdefPush()***qu’on essayera d’expliquer plus loin.

  1. Foreground dispatching

Les méthodes enableForegroundDispatch () et disableForegroundDispatch ()   permettent d’activer ou de désactiver la  possibilité au téléphone de recevoir les intentions (intent) lors du scan de tags NFC.

mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mReadTagFilters, null);

mNfcAdapter.disableForegroundDispatch(this);** **

  1. Implémenter le filtre d’intention dans la classe NFCInventoryActivity.java

Il est conseillé de désactiver la notification du scan des tags au premier plan dans la méthode onPause() de l’activité  pour l’activer ensuite dans la méthode ***onResume()***comme expliqué dans le fragment de code qui suit :

public class NFCInventoryActivity extends Activity{

private static final String TAG = “nfcinventory_simple”;

**// NFC-related variables

NfcAdapter mNfcAdapter;

PendingIntent mNfcPendingIntent;

IntentFilter[] mReadTagFilters;

/Called when the activity will start interacting with the user./

@Override

protected void onResume(){

// ….

// Handle foreground NFC scanning in this activity by creating a

// PendingIntent with FLAG_ACTIVITY_SINGLE_TOP flag so each new scan

// is not added to the Back Stack

mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,

getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

// Create intent filter to handle NDEF NFC tags detected from inside our application //when in “read mode”:

IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

try{

ndefDetected.addDataType(“application/fr.ippon.nfcdemo”);

} catch (MalformedMimeTypeException e){

     *throw new RuntimeException(“Could not add MIME type.”, e);*

}

// create IntentFilter arrays:

mReadTagFilters = new IntentFilter[] { ndefDetected };

// Enable priority for current activity to detect scanned tags

mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mReadTagFilters, null);*  *

}

/ Called when the system is about to start resuming a previous activity. /

@Override

protected void onPause()

{

// …

mNfcAdapter.disableForegroundDispatch(this);

// …

}

}

Pour résumer ce code :

  • On crée un IntentFilter (filtre d’intention) – ndefDetected pour écouter les tags NFC de type NDEF supportant le Mime type application/fr.ippon.nfcdemo
  • On crée un tableau de filtres d’intention (IntentFilters) qu’on remplit avec l’objet ndefDetected déjà créé.
  • On crée un objet PendingIntent – mNfcPendingIntent avec le flag FLAG_ACTIVITY_SINGLE_TOP afin d’éviter que chaque nouvel scan NFC ne crée (n’amorce) plusieurs instances de l’activité principale NFCInventoryActivity.java

On remarquera d’ailleurs que la déclaration de l’activité dans le fichier AndroidManifest.xml comprend l’attribut android:launchMode=”singleTask”. Cet attribut permet de garantir la création d’une seule instance de l’activité par le système.

<activity **android:label=”@string/app_name” **android:launchMode=”singleTask”**android:name=”.NFCInventoryActivity” >

  • Activer la notification au premier plan en utilisant la méthode enableForegroundDispatch()
  1. Foreground NDEF Push

Les méthodes enableForegroundNdefPush()/***disableForegroundNdefPush()***sont disponibles depuis l’API level 10 et permettent de partager des données NDEF entre les terminaux android. Elle seront expliquées plus loin lors de la communication peer-to-peer.  Dans les nouveaux terminaux android, ces méthodes sont dépréciées et sont remplacées par ***setNdefPushMessage()****ou setNdefPushCallbackMessage()

  1. Réagir à un tag NDEF

Lors du scan d’un tag NFC, l’application mobile peut être au premier plan (foreground) ce qui veut dire que c’est la première application visible sur l’écran de l’utilisateur. Dans le cas contraire, l’application n’est pas encore lancée par l’utilisateur ou qu’elle est en background. Le traitement des tags NFC scannés dépend du cas dans lequel on se situe. Dans le cas d’une application en mode foreground, il est judicieux de traiter le tag en utilisant la méthode ***getIntent().getAction() depuis la méthode onResume(). ***Ce même traitement doit se faire dans la méthode ***onNewIntent() ***de l’activité dans le cas ou l’application n’est pas au premier plan (foreground). Le fragment de code suivant montre comment traiter les tag NDEF et non NDEF dans l’activité.

public class NFCInventoryActivity extends Activity {

// ……

/ Called when the activity will start interacting with the user. /

@Override

protected void onResume() {

// …..

if (getIntent().getAction() != null) {

// tag received when app is not running and not in the foreground:

if (getIntent().getAction().equals(

NfcAdapter.ACTION_NDEF_DISCOVERED)) {

NdefMessage[] msgs = getNdefMessagesFromIntent(getIntent());

// Do something with the NDEF message here…

}

}

// …..

}

/ This is called for activities that set launchMode to “singleTop” or *“singleTask” in their manifest package,

*or if a client used the FLAG_ACTIVITY_SINGLE_TOP flag when calling startActivity(Intent). /

@Override

protected void onNewIntent(Intent intent) {

// …..

if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {

NdefMessage[] msgs = getNdefMessagesFromIntent(intent);

// Do something with the NDEF message here

  • }elseif (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {*

Toast.makeText(this,”This NFC tag currently has no inventory NDEF data.”,  Toast.LENGTH_LONG).show();

}

// ….

}

// ……

}

Nous discuterons plus loin de la méthode privée getNdefMessagesFromIntent()

  1. Lecture des messages NdefMessage et NdefRecord à partir d’une intention (Intent)

On avait déjà rapidement expliqué la différence entre un objet NdefMessage et NdefRecord. Ces deux classes sont dans le package « *android.nfc.tech *»  du SDK android. Pour rappel, un objet NdefMessage est un contenant qui comprend un ou plusieurs objets NdefRecords. Un objet NdefRecord admet une zone de données disponible et un ensemble de méta donnée additionnelles telle que le type, la taille, l’identifiant…

Pour récupérer les messages, on peut se servir de la méthode ***getParcelableArrayExtra() avec le mot clé NfcAdapter. EXTRA_NDEF_MESSAGES ***comme dans l’exemple suivant :

Parcelable[] rawMsgs = intent .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

NdefMessage[] msgs = new NdefMessage[rawMsgs.length];

for (int i = 0; i < rawMsgs.length; i++) {

msgs[i] = (NdefMessage) rawMsgs[i];

}

Pour récupérer les enregistrements d’un message, on utilisera les méthodes ***getRecords()/getPayload()***comme dans l’exemple suivant :

NdefRecord record = msgs[0].getRecords()[0];

//Returns the variable length payload

byte[] payload = record.getPayload();

// Returns the optional variable length ID

byte[] id = record.getId() ;

// Returns the variable length Type field

byte[] type = record.getType();

  1. Création des NdefMessage et NdefRecord

Dans le cadre de ce billet, nous allons écrire et modifier le contenu d’un tag NFC. Pour l’écriture, l’application mobile crée un objet JSON à partir des values saisies par l’utilisateur. Cet objet est ensuite converti en un tableau de bytes qui sera par la suite un enregistrement NDEF.

JSONObject computerSpecs = new JSONObject();


// use computerSpecs.put(“specTypeName”, specTextFieldValue);

// to populate JSONObject create a new NDEF record and containing NDEF message using //the app’s custom MIME type:

String mimeType = “application/fr.ippon.nfcdemo”;

byte[] mimeBytes = mimeType.getBytes(Charset.forName(“UTF-8”));

String data = computerSpecs.toString();

byte[] dataBytes = data.getBytes(Charset.forName(“UTF-8”));

byte[] id = new byte[0];

NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, id, dataBytes);**

NdefMessage m = new NdefMessage(new NdefRecord[] { record });

Dans notre exemple, nous avons choisi le format JSON mais notons qu’on peut choisir n’importe quel format de stockage, il suffit tout simplement de faire attention à la limitation de taille lors de l’écriture des tags NFC.

3.Lecture des messages depuis un tag NFC scanné (Optionnelle) :

Lorsqu’un tag NFC est scanné, le système Android traite automatiquement la méta donnée du tag et l’encapsule avec la donnée (payload) dans une intention (intent). L’application mobile utilisera donc la méthode ***getParcelableExtra() *** de l’intention (intent) pour récupérer le tag dans un objet java de type Tag.

L’exemple suivant décrit une autre façon de lire les données d’un tag scanné en passant par une référence du tag et non de l’intention (intent)

Tag detectedTag = intent .getParcelableExtra(NfcAdapter.EXTRA_TAG);

Log.d(TAG, tag.getID()); // log tag identifier if one is available

Ndef ndef = Ndef.get(detectedTag);


// Read the current NdefMessage on this tag.

try {

ndef.connect();


NdefMessage ndefMessage = ndef.getNdefMessage();

Log.d(TAG, ndefMessage.toString());


NdefRecord record = ndefMessage.getRecords()[0];

byte[] payload = record.getPayload();

Log.d(TAG, new String(payload));

// Do something with the payload here

ndef.close();

} catch (IOException e) {

Log.e(TAG, “IOException reading tag”);

} catch (FormatException e) {


Log.e(TAG, “FormatException reading tag”);

}

4.Sauvegarde des messages dans un tag NFC scanné :

Le fait que les puces NFC sur les terminaux android soient mobiles nous oblige à amorcer rapidement l’écriture d’un tag NFC immédiatement dans un rayon de couverture assez optimal pour éviter les erreurs d’écriture (I/O erreurs). Il suffit donc d’être à l’écoute de l’action ACTION_TAG_DISCOVERED depuis l’application mobile. Une fois l’objet NDEFMessage en main, l’écrire sur un tag NFC est d’une simplicité avec le SDK android. Voici un exemple de code :

Tag detectedTag = intent .getParcelableExtra(NfcAdapter.EXTRA_TAG);

Ndef ndef = Ndef.get(detectedTag);
// Read the current NdefMessage on this tag.

try {

ndef.connect();

// Overwrite the NdefMessage on this tag

*ndef.writeNdefMessage(ndefMessage);

*// Make a tag read-only.

ndef.makeReadOnly();

ndef.close();


} catch (IOException e) {

Log.e(TAG,”IOException reading tag”);

}catch (FormatException e) {

Log.e(TAG,”FormatException reading tag”);

}

Plusieurs scenarios peuvent être la cause de l’échec d’écriture comme par exemple :

  • La tentative d’écriture dans un tag qui est protégé en écriture
  • La tentative d’écriture dans un tag qui n’a plus d’espace disponible pour accepter des messages NDEF
  • La tentative d’écriture dans un tag qui ne supporte pas le format NDEF
  • Les erreurs d’entrée/sortie dues au déplacement du terminal mobile lors de l’écriture.

NFC et communication Peer-to-Peer

Le fait d’avoir de plus en plus de terminaux supportant NFC, nous pousse à dépasser le mode passif avec une communication unidirectionnelle vers une communication bidirectionnelle en mode peer-to-peer. A partir d’Android 4, il est possible de faire communiquer deux terminaux android en mode peer-to-peer et d’effectuer des partages d’informations entre ces terminaux. Cette fonctionnalité se base sur la technologie S-Beam du SDK android.

On peut donc se demander ce que le mode peer-to-peer peut apporter dans une application de gestion d’inventaire. Imaginer qu’au moment ou vous essayez de mettre à jour le tag NFC d’un ordinateur à partir de l’application mobile que vous avez une urgence qui vous empêche de finaliser la mise à jour du tag. Si en cet instant vous avez un collègue à côté, vous pouvez tout simplement « beamer » son téléphone pour lui envoyer automatiquement les données enregistrées pour ce ordinateur. Il pourra ensuite mettre  à jour les tags à partir de données que vous aviez saisies et continuer le travail à votre place.

Pour permettre à une application NFC existante de supporter le mode peer-to-peer, on n’a pas beaucoup de modification à faire dans le code. Il faut tout simplement s’assurer que les terminaux ont une version du SDK android qui supportent le NFC en mode peer-to-peer.

A partir de l’API level 10 d’Android,  une paire de méthodes fut introduite dans la classe NfcAdapter pour permettre le partage via le mode peer-to-peer. Il s’agit des méthodes enableForegroundNdefPush() et disableForegroundNdefPush(). Notons que ces deux méthodes sont dépréciées dans l’API level 14 et sont remplacées par les méthodes ***setNdefPushMessage() ***et setNdefPushMessageCallback().

Ainsi, on a trois modifications importantes à faire :

  1. L’activité doit implémenter l’interface android.nfc.NfcAdapter.CreateNdefMessageCallback. Ce qui veut dire qu’on doit implémenter la méthode createNdefMessage() dans notre activité.

public class NFCInventoryActivity extends Activity implements CreateNdefMessageCallback

2.Enrégistrer un callback sur l’adapteur à l’aide de la méthode setNdefPushMessageCallback().

// register the callback

*mNfcAdapter.setNdefPushMessageCallback(this,this);

1.Implémenter la méthode createNdefMessage() dans l’activité.

@Override


public NdefMessage createNdefMessage(NfcEvent event) {

NdefMessage msg = createNdefFromJson();

return msg;

}

Tests et Screenshots

Le moment est venu de savoir comment tester tout ce qu’on vient d’expliquer et d’écrire comme code. Pour faire correctement ce test, nous avons besoin d’un certain nombre de matériels :

  • Un ou deux téléphones Android Samsung Galaxy S3. Le second servira surtout à tester la fonctionnalité peer-to-peer.
  • Des smartTags NFC. Dans mon cas j’ai acheté sur internet les tags Xperia SmartTags. Il y en existe plusieurs, il faut tout simplement s’assurer que les tags ne sont pas protégés en écriture et qu’ils ont suffisamment d’espace mémoire pour y mettre de l’information utile. J’avoue que les smartTags Xperia sont très limités en espace mémoire : 48 bytes seulement.

  • Pour m’assurer que les informations sont bien inscrites dans les tags, j’ai téléchargé l’application TagInfo de la société NXP  qui permet de lire et voir le contenu d’un Tag NFC supportant le format NDEF. Par défaut, les smartTags Xperia ont pour contenu un url. J’ai pu vérifier ceci en utilisant l’application TagInfo comme le montre l’image ci-dessous

  • Il faut ensuite installer l’application sur les deux téléphones. Comme on peut le voir ici.

  • Supposons maintenant que notre premier ordinateur du parc informatique est muni d’un tag NFC comme le montre cette image. Vous comprenez avec moi qu’avec un peu plus de moyen, on aurait pu prendre des smartTags beaucoup plus discrets.

  • Lancer l’application sur le téléphone et essayons de scanner un tag pour mettre à jour ses informations.

  • Pour vérifier que le tag a bien été mis à jour, il suffit de se servir de l’application TagInfo pour voir le contenu du tag comme le montre la figure suivante.

  • On peut aussi se servir du second téléphone pour scanner le tag et afficher les informations dans les champs dédiés dans l’application.

  • Pour tester le mode peer-to-peer, il faut activer le NFC et S-Beam sur les deux téléphones.

  • Il faut ensuite lancer l’application sur chaque téléphone et les rapprocher l’un de l’autre comme le montre la figure suivante :

Pour aller plus loin

  • NFC et mode émulation
    La technologie NFC existait bien avant l’arrivée des smartphones sous Android et autres.  Pour ceux qui ont déjà eu la chance de travailler avec les technologies Java comme JavaMe ou JavaCard, on sait le nombre important d’API riche mise à disposition pour écrire des Midlets et des Cardlets. Le Midlet n’est rien d’autre que l’application mobile installée dans la mémoire du téléphone et qui doit exécuter une tâche précise. Les Cardlets au contraire sont des applications ou des composants de l’application qui doivent s’installer dans la SIM du téléphone ou dans une carte à puce dédiée. On se demande alors pourquoi ce modèle de développement ou de distribution des composants des applications mobiles. La réponse est simple – c’est surtout pour des raisons de sécurité. En effet, une application ou un composant applicatif installé sur une SIM ou une carte à puce et qui respecte des spécifications précises est difficile à compromettre et donc plus fiable en terme de sécurité.  Dans le cadre de la mobilité, la SIM peut être vue comme un vrai coffre fort dans lequel on peut faire cohabiter de manière fiable et sécurisée des services mobiles.

Le modèle Midlet/Cardlet existe aussi avec les nouvelles plateformes mobiles (Android et autres) même si le terme Midlet n’est plus vraiment utilisé. Comme je l’avais précisé au début, le NFC admet aujourd’hui trois modes de fonctionnement : le mode Tag, le mode peer-to-peer et le mode « émulation de carte ». Nous avions eu à explorer et travailler avec les deux premiers modes. Ce paragraphe n’a pas pour objectif de présenter une démonstration de l’émulation de carte pour NFC. Il s’agira plutôt de faire un état des lieux des outils qu’on peut utiliser pour mettre en œuvre ce mode dans le cadre d’un projet android plus précisément.

Le mode émulation de carte est très important surtout dans le cadre des applications de paiement mobile sans contact. On parle d’émulation de carte en NFC lorsque le téléphone mobile se comporte comme une carte à puce intelligente avec des fonctionnalités complémentaires. En d’autres termes, avec ce mode, on n’a plus besoin d’avoir des tonnes de cartes dans nos portefeuilles. On peut tout dématérialiser  ou presque dans le téléphone et plusieurs applications peuvent s’installer et s’exécuter dans une seule carte SIM NFC comme le montre la figure ci-dessous.

Le schéma suivant résume un peu ce qui se passe lors d’un paiement mobile sans contact entre un lecteur NFC, le téléphone mobile de l’utilisateur, l’operateur et l’organisme bancaire.

Contrairement aux paiements par carte classique, on peut dématérialiser sur la carte SIM plusieurs cartes bancaires. Le flux d’information transférée entre le téléphone et l’organisme bancaire passe par l’operateur téléphonique grâce à une plateforme « Trusted Service Manager (TSM) » qu’on détaillera dans les lignes suivantes.

La plateforme Android ne propose pas de facto une API permettant de gérer le mode par émulation de carte en NFC. Il existe par contre des projets et frameworks en ligne qui s’appuient sur le SDK d’android et son ouverture pour proposer des API de « SmartCard » et d’émulation de carte.  Ces frameworks permettent de développer et de déployer des applications mobiles sécurisées qui doivent accéder aux éléments sécurisés du téléphone.

  • Acteurs autours du NFC en France

La France est active dans la promotion des applications et servies autour du NFC. On assiste depuis un moment à de nombreux pilotes et projets autour de cette technologie dans plusieurs domaines d’activité telle que les services de transport, les services citoyens (bibliothèque, piscine…), les services de contrôles d’accès, la gestion d’identité électronique…

Il existe l’association française du sans contact mobile (AFSCM) qui milite fortement pour la promotion et le développement des services sans contact mobiles. AFSCM s’appuie sur d’autres partenaires de références tels que les operateurs (Orange, Bouygues, SFR, Virgin Mobile), les industriels (Gemalto, Safran, Oberthur… ) et les émetteurs d’applications (BNP, Crédit mutuel, Société générale, Veolia, Tag&Play…) pour définir des spécifications autour du NFC et de l’interopérabilité entre ces différents acteurs.

Dans le cadre des paiements sans contact mobiles, l’AFSCM définit des interfaces de connexion techniques entre les operateurs mobiles, les fabricants de téléphones et d’autres acteurs qui contrôlent des composants ou éléments  sécurisés dans les terminaux mobiles. On assiste à la mise en place d’un rôle intermédiaire neutre dans l’écosystème NFC qu’on appelle les Trusted Service Manager (TSM).

Le TSM permet aux fournisseurs de services mobiles de distribuer et de gérer leurs applications sans contact en permettant l’accès à distance aux composants sécurisés des téléphones équipés de NFC. Par exemple avec le TSM, un operateur mobile peut activer ou désactiver des services à distance (Over The Air) sur un terminal mobile. Il peut supprimer à distance des applications et des données confidentielles dans le cas d’un vol de téléphone par exemple. Le TSM joue un rôle crucial dans le paiement sans contact mobile car il facilite et sécurise l’interconnexion entre les operateurs mobiles et les fournisseurs de services mobiles.

Certains operateurs mobiles sont prêts à mettre sur le marché des SIM NFC pouvant permettre à tous ceux qui n’ont pas de smartphone équipé de cette technologie d’être capable de jouir des services et applications dans ce sens.

Dans le domaine de paiement sans contact, plusieurs banques et operateurs se sont réunis dans le cadre de pilotes pour définir et normaliser comment les services devront d’intégrer. Ne soyons donc pas surpris de devoir payer sous peu avec nos téléphones devant un terminal de paiement électronique (TPE).

Conclusion

J’ai essayé dans ce billet de faire une rapide introduction sur le NFC et comment la plateforme Android supporte cette technologie via un exemple concret de suivi de gestion stock.  Cela fait un moment que la technologie NFC existe sans pour autant prendre une grande ampleur dans notre quotidien. Même si le grand souci pour certains demeure la sécurité, l’association des terminaux, des opérateurs mobiles et les systèmes de paiement bancaires peuvent réduire les risques de sécurité. Nous pensons que 2013 peut être vraiment un nouveau départ pour le NFC avec de plus en pus d’applications innovantes sur le sujet. Dans ce monde où l’on a plus tendance à tout dématérialiser, le NFC demeure la technologie incontournable pour la mise en œuvre de certaines applications et services mobiles.

Références