Aller au contenu
Langue : FR

Pourquoi une lecture échoue-t-elle sur une erreur de tag perdu ?

Parce que le tag a quitté le champ avant la fin de l'échange, ce qu'une main fait en une demi-seconde. Android lève TagLostException depuis toute opération qui touche la radio, iOS échoue sur une erreur de connexion perdue, et une écriture interrompue ainsi laisse une issue que personne ne connaît encore.

Ce que lève chaque plateforme

Sur Android, toute opération qui touche la radio peut la lever. La référence de TagLostException en fait une sous-classe d'IOException, et connect(), transceive(), readPages() et writePage() la déclarent toutes. Une autre erreur veut dire un autre problème : réemployer un objet Tag après le départ de son tag lève SecurityException, cet objet appartenant à une seule apparition.

Sur iOS le même événement arrive comme un code d'erreur. readerTransceiveErrorTagConnectionLost dit que le lecteur a perdu la connexion au tag, et ses voisins nomment les autres cas : readerTransceiveErrorTagNotConnected quand le tag n'est pas dans l'état connecté, readerTransceiveErrorSessionInvalidated quand la session s'est terminée sous lui, readerTransceiveErrorRetryExceeded quand il y a eu trop de nouvelles tentatives.

La main d'abord, le code ensuite

Les causes physiques viennent en premier parce que ce sont les fréquentes. Une écriture prend plus longtemps qu'une lecture, donc un geste qui lit sûrement peut être trop bref pour écrire, ce que décrit du côté de l'utilisateur la page de l'écriture interrompue. Une coque épaisse, un petit tag ou un angle malcommode ne laissent aucune marge, et le tag sort de portée pour un millimètre de mouvement.

Les causes de code sont plus fines. Chaque commande est un aller-retour, donc une suite de vingt laisse vingt occasions de perdre le tag, et du travail fait entre deux commandes, un calcul ou pire un appel réseau, tient le tag ouvert pour rien. Ouvrir une autre classe de technologie en pleine séquence peut faire resélectionner le tag par la plateforme, ce que couvre la page de l'authentification là où cela coûte le plus cher.

Que faire du tag que vous avez perdu

Traitez un tag perdu pendant une écriture comme une issue inconnue plutôt que comme un échec. La commande a pu atteindre le tag avant que la réponse ne se perde, donc l'étape suivante est de relire la mémoire, pas de réécrire, et un ordre qui ne laisse rien à moitié valide rend cela lisible : la page des écritures interrompues l'expose.

Repartez ensuite du début. Le tag qui revient est une nouvelle détection, un nouvel objet Tag sur Android et une nouvelle détection sur iOS, toute authentification a disparu, et une séquence ne se reprend pas par son milieu. Un code qui garde un état en travers d'une perte doit le réconcilier avec ce qu'il relit.

Élargir assez la fenêtre

Raccourcissez l'échange plutôt que d'allonger le délai. Lisez par les plus gros blocs qu'offre le protocole, limitez le nombre de commandes, et faites avant le contact tout ce qui n'a pas besoin du tag, l'arithmétique que rend explicite la page des expirations.

Concevez ensuite l'interface pour une main. Dites à l'utilisateur quand s'écarter, n'affichez l'achèvement que lorsque l'appel est revenu, et testez dans une main plutôt qu'avec le téléphone posé à plat sur un bureau, où la fenêtre ne se referme jamais et où le défaut ne paraît pas.

Questions fréquentes

Une erreur de tag perdu veut-elle dire un tag cassé ?

Presque jamais. Elle veut dire que le tag a quitté le champ en plein échange. Le même tag se lit d'ordinaire à la tentative suivante si le téléphone reste immobile.

Puis-je reprendre un échange quand le tag revient ?

Non. Le tag qui revient est une nouvelle détection, et toute authentification a disparu. Repartez de la détection, et relisez avant de réécrire.

Pourquoi une écriture échoue-t-elle plus souvent qu'une lecture ?

Elle prend plus longtemps, donc elle demande de tenir plus longtemps. Un geste qui lit sûrement est régulièrement trop bref pour écrire.

Que fait SecurityException ici ?

Elle veut dire que le code a réemployé un objet Tag d'une apparition antérieure. Chaque détection en donne un nouveau, et seul le plus récent fonctionne.