Blog Zenika

#CodeTheWorld

IoT & Mobilité

NFC V – Android Beam et P2P

Jusqu’à présent, lors de cette série de billets sur le NFC, je n’ai évoqué que des modes d’utilisation unidirectionnels. Ici, je vais maintenant détailler les possibilités offertes par Android pour les autres modes d’utilisation décrits dans le premier article.

Mode émulation de carte

Je commence par ce mode d’utilisation car, à l’heure actuelle, il n’est pas possible avec Android d’utiliser le NFC en mode Card Emulation. Le mode émulation de carte consiste à utiliser le téléphone comme s’il s’agissait d’une carte à puce.
Par exemple, le téléphone pourrait ainsi remplacer la carte bancaire; c’est le fameux paiement sans contact.
Pour fonctionner, l’application émulant la carte doit pouvoir accéder à un élément dit sécurisé (e.g. une carte Sim, une carte mémoire spécifique). Pour le moment, il n’existe aucune API sur Android permettant cet accès. Il existe toutefois un projet qui essaye de corriger ce manque.

Mode passif

J’appelle mode passif, le mode dans lequel l’appareil NFC agit comme un Tag. Il ne faut pas confondre ce mode avec le précédent. Dans ce mode, l’appareil NFC n’interagit qu’avec un autre appareil NFC, mais ne nécessite pas d’accès à un élément sécurisé.
On peut obtenir un comportement assez proche grâce à la technologie Android Beam™.

Android Beam™

Android Beam permet le push de message Ndef. Ainsi, si un premier appareil Android utilise Beam, lorsqu’un second s’approchera, il détectera le premier comme il détecterait un Tag.
Voici comment utiliser Beam.

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());
NdefMessage message = ...;
nfcAdapter.setNdefPushMessage(message, this);

Le deuxième paramètre de la méthode setNdefPushMessage doit être une Activity active (i.e. celle au premier plan, recevant les interactions utilisateur). Il n’est donc pas question de tenter d’utiliser Beam depuis un Service ou un BroadcastReceiver.
Le message Ndef n’est envoyé qu’une fois que le téléphone est proche d’un autre. Il peut donc exister un délai plus ou moins long entre la création du message et son envoi. Dans le cas où ce fonctionnement serait problématique, il existe une alternative qui permet de créer le message à la volée, juste avant de l’envoyer.

public class BeamActivity extends Activity implements CreateNdefMessageCallback {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());
		nfcAdapter.setNdefPushMessageCallback(this, this);
	}
	@Override
	public NdefMessage createNdefMessage(NfcEvent event) {
		NdefMessage message = ...;
		// ...
		return message;
	}
}

La méthode setNdefPushMessageCallback prend en premier paramètre un objet de callback qui doit implémenter CreateNdefMessageCallback, et en second une Activity, comme dans le premier exemple. Le NdefMessage est alors crée dans la méthode createNdefMessage qui n’est appelée qu’une fois que les 2 appareils sont proches.

Contraintes

Android Beam permet d’envoyer un message Ndef à un autre appareil Android, et d’être ainsi perçu comme un Tag. Il y a cependant plusieurs limitations à prendre en compte.
Tout d’abord, un véritable Tag NFC est alimenté par le champs magnétique produit par le lecteur. Un appareil Android est alimenté par sa batterie. Si l’appareil est éteint, il ne peut être lu par un lecteur.
De manière similaire, l’appareil ne peut être en veille, ni sur n’importe quelle application, Beam ne peut être activé qu’à partir d’une Activity au premier plan.

Mode P2P

Le NFC Forum a ajouté une spécification pour réaliser des communications point-à-point car cet usage n’est pas prévu par le RFID. Cette spécification, portant le nom de Simple NDEF Exchange Protocol (SNEP), repose sur le Logical Link Control Protocol (LLCP), lui aussi défini par le NFC Forum.
Android Beam utilise le protocole SNEP mais l’Api publique offerte aux développeurs ne permet que le push de message. Il n’est donc pour le moment pas possible d’utiliser le mode P2P du NFC avec Android.
De plus, lors de l’utilisation de Beam, l’utilisateur final est contraint de valider, par un appui sur l’écran, l’envoi de chaque message, ce qui ne permet pas de remplacer l’absence de P2P par un grand nombre de push.

Contournement

NFC n’est pas le seul moyen d’établir une connexion point-à-point, c’est également possible, entre autres, en bluetooth ou en Wifi Direct. Le NFC peut alors jouer le rôle d’entremetteur pour échanger les moyens supportés et éventuellement les données de configuration.
Le NFC Forum a justement publié une spécification appelée Connection Handover qui permet à deux appareils de s’accorder sur la manière d’établir une connexion. Le principe est le suivant :

  • le premier envoie un message de type Handover Request contenant l’ensemble des technologies d’échange dont il dispose (bluetooth, wifi…) agrémenté éventuellement d’informations de configuration.
  • le second réceptionne ce message, choisit parmi les technologies celle la plus appropriée, puis répond avec un message de type Handover Select, contenant les informations relatives à la technologie choisie.
  • la connexion P2P est alors établie

La spécification prévoit notamment les cas de conflits si les 2 appareils envoient une Handover Request.
Bien que les constantes RTD_HANDOVER_REQUEST et RTD_HANDOVER_SELECT existent, cette spécification n’a pas été (encore ?) implémentée dans Android.

Conclusion

L’Api Android dédiée au NFC souffre pour le moment de quelques lacunes pour les modes évolués d’utilisation. Concernant l’émulation de carte, Google semble peu enclin à l’inclure dans le framework (certains diront que la stratégie est de favoriser la solution maison de paiement Google Wallet, d’autres évoqueront un problème matériel). Par contre, Google semble miser davantage sur le P2P, et il est fort à parier de voir apparaître des évolutions du framework dans ce sens.

Auteur/Autrice

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.