
QR code unique par produit : bien sérialiser ses codes
Quatre mille corps de vanne partent avec un code gravé au laser sur chacun. Trois mois plus tard, la page de garantie derrière ces codes doit changer d'adresse, ce qui prend dix minutes, puisque les codes sont dynamiques. Puis un technicien demande si le code d'une unité retournée correspond bien à son dossier de fabrication, et il faut deux jours pour répondre : le numéro de série n'est pas dans le code, qui porte un jeton aléatoire, et la correspondance entre jeton et numéro vivait dans un tableur trié puis régénéré.
Sérialiser des codes n'est pas difficile. C'est le choix de l'endroit où vit le numéro de série, et de ce qu'il a le droit de signifier, qui décide si vous pourrez répondre à des questions trois ans plus tard.
Trois endroits où un numéro de série peut vivre
Dans la charge utile, comme charge utile entière. Le symbole contient SN-0004821, point final. L'appareil photo d'un smartphone se contentera d'afficher cette chaîne sans savoir quoi en faire, alors qu'une application de scan raccordée à votre système ira immédiatement la chercher en base. C'est la bonne option pour les boucles fermées, celles où le lecteur appartient à la maison : un poste en bord de chaîne, une douchette de magasin, la tablette d'un technicien SAV qui tourne sous votre application. La charge utile ne peut pas être plus courte, et elle se passe totalement de réseau.
Dans le chemin d'une URL. Le code encode https://ex.co/i/0004821. Chaque article reçoit sa propre adresse, cette adresse mène à une page propre à l'article, et n'importe qui muni d'un téléphone obtient quelque chose d'utile. C'est la réponse dès qu'un humain extérieur à votre organisation va le scanner.
Comme paramètre sur une base commune. https://ex.co/p?sn=0004821. Proche de la version avec chemin, et pire sur un point : un long préfixe commun signifie que mille codes ne diffèrent que par la fin, si bien qu'un rouleau d'étiquettes mal trié est invisible à l'œil et presque invisible à un contrôle ponctuel.
Si l'article est un produit de détail doté d'un GTIN, il existe une quatrième option : porter le numéro de série à l'intérieur d'un GS1 Digital Link aux côtés du code produit, en utilisant les identifiants normalisés. Partout où les codes seront un jour lus par une chaîne d'approvisionnement commerciale ou réglementée et pas seulement par vous, commencez par là plutôt que d'inventer un schéma.
Ce que le code imprimé ne pourra jamais changer
Un code dynamique vous laisse changer où le code mène. Il ne vous laisse pas changer ce que le code dit. La chaîne à l'intérieur du symbole a été figée à l'instant où le marquage a été fait, et elle reste figée pour la vie de l'objet.
Le numéro de série dans le code imprimé doit donc être un identifiant et rien de plus. N'encodez pas le propriétaire, le lieu, la configuration, le distributeur, la tranche de prix, la révision du micrologiciel ni le marché visé. Chacun de ces éléments change, et quand il change vous avez quatre mille objets marqués qui affirment quelque chose de faux. Mettez un identifiant opaque dans le code et laissez la fiche derrière lui porter tout fait modifiable : c'est la discipline dont les étiquettes d'inventaire ont besoin pour la même raison. Deux faits sont sûrs à encoder, parce qu'ils ne changent jamais pour cet objet : ce qu'il est, et lequel il est.
Ce qu'un numéro de série coûte en largeur de module
Un numéro de série, ce sont des caractères, les caractères sont de la capacité, et la capacité est une version. Parcourez cette chaîne avant de figer la taille de l'étiquette.
Les URL tombent en mode octet, parce qu'elles portent des minuscules et une ponctuation que le mode alphanumérique, plus dense, n'inclut pas ; comptez donc huit bits par caractère. La table des modes explique pourquoi. Au niveau de correction d'erreurs le plus élevé, la version 3 contient 24 octets, la version 4 en contient 34, la version 5 en contient 44 et la version 6 en contient 58. À un niveau plus bas, la même charge utile entre dans une grille plus petite, et ce qui s'échange est la tolérance aux dommages.
Prenez une base https://ex.co/i/, seize caractères. Un numéro de série à six chiffres porte la charge utile à 22 caractères, qui entre en version 3 : une grille de 29 par 29, soit 37 largeurs de module une fois ajoutée de chaque côté la zone de silence de quatre modules que demande l'ISO, ce qui fait 0,54 mm par module sur une étiquette de 20 mm. Utilisez maintenant un UUID à la place. La charge utile atteint 52 caractères et exige la version 6 : 41 par 41, donc 49 largeurs de module avec la marge, et 0,41 mm par module sur la même étiquette. Vous avez cédé un quart de votre largeur de module pour un identifiant que personne ne lira jamais à voix haute.
L'identifiant public et l'identifiant interne ne devraient donc pas être la même chaîne. Gardez un UUID ou une clé de base de données en interne et frappez un code public court et opaque pour l'étiquette. Huit caractères en base 36 donnent environ 2 800 milliards de valeurs, au-delà de toute série de production, et coûtent une version au lieu de trois.
Les numéros séquentiels en disent plus que vous ne croyez
Les numéros de série qui se suivent sont commodes et ils fuient. Un concurrent qui achète deux de vos unités à un mois d'intervalle lit les deux et sait à peu près combien vous en avez fabriqué entre-temps : votre volume de production, offert sur l'étiquette. Et quiconque flashe un code puis incrémente le dernier chiffre atterrit sur une page valide pour un article qu'il n'a jamais vu.
Deux correctifs, qui résolvent des problèmes différents. Frappez des identifiants publics non séquentiels tirés d'un espace assez vaste pour que la devinette échoue, et gardez privé l'identifiant interne séquentiel. Ou gardez un numéro de série séquentiel lisible et ajoutez-y un court jeton dérivé par clé, de sorte qu'un numéro deviné sans le jeton correspondant ne mène à rien.
Les deux arrêtent la devinette. Aucun n'arrête la copie, parce qu'un code photographié est identique octet pour octet à l'original et qu'aucun symbole ne peut prouver qu'il est celui qui a été imprimé. La seule chose qui détecte la duplication, c'est le comportement dans le temps : le même identifiant scanné dans deux pays la même semaine, ou un premier scan qui arrive après la date à laquelle la fiche dit l'article activé. C'est le vrai contenu de l'authentification produit, et il vit dans votre back end plutôt que dans le marquage.
Les clés de contrôle, et laquelle choisir
Quelqu'un finira par lire le numéro sur l'étiquette avec le pouce posé sur une partie, puis le saisira dans un formulaire. Une clé de contrôle est un caractère de plus qui attrape l'essentiel de ce qu'il se trompe, et les algorithmes diffèrent précisément sur quoi.
- Luhn, modulo 10. Celui que l'on connaît par les numéros de carte. Attrape toute substitution d'un chiffre et toute inversion de deux chiffres voisins, sauf 09 échangé contre 90.
- La clé de contrôle GS1 modulo 10. Poids alternés de 3 et 1, obligatoire dans un schéma GS1. Attrape toutes les erreurs sur un chiffre, mais pas toutes les inversions.
- Damm ou Verhoeff. Les deux attrapent toute erreur sur un chiffre et toute inversion de deux chiffres voisins sans exception, pour un peu plus d'implémentation et aucun inconvénient.
- ISO 7064 modulo 97-10. Deux caractères de contrôle, le schéma qui est derrière l'IBAN. Cela vaut le coup quand le numéro est long et qu'une recherche erronée coûte cher.
Imprimez le numéro de série à côté du code, avec sa clé de contrôle, dans une police qui distingue le zéro du O majuscule. Ainsi, un code qui refuse de se scanner reste un numéro que quelqu'un peut dicter au téléphone.
Et en France ?
Le code unique par article prend tout son sens avec les obligations françaises d'information sur la durée de vie des produits. Pour les biens neufs, la garantie légale de conformité dure deux ans, et un numéro de série lisible facilite la gestion des réclamations. Pour certaines catégories d'appareils, comme les lave-linge ou les téléviseurs, un indice de réparabilité puis un indice de durabilité doivent être communiqués au consommateur.
Un code sérialisé peut ouvrir, pour chaque exemplaire, la date de fabrication, la documentation de réparation, la disponibilité des pièces détachées et la procédure de garantie. C'est exactement l'information que ces règles cherchent à rendre accessible, et elle gagne à être rattachée à l'exemplaire exact que le client tient en main.
Contrôler un tirage où chaque étiquette est différente
Mille étiquettes identiques se vérifient en regardant une seule. Mille étiquettes sérialisées ne se vérifient en regardant aucune : elles se ressemblent toutes, et les différences se cachent au milieu d'une chaîne. Il faut donc les décoder automatiquement, et comparer chaque résultat à la liste attendue.
Décodez au lieu d'inspecter, et choisissez l'échantillon à dessein : la première étiquette, la dernière, et un bloc de part et d'autre de chaque changement de bobine ou de feuille. Les raccords de bobine et les décalages d'un cran à l'entraînement sont les endroits où un tirage sérialisé déraille, et il déraille par blocs contigus plutôt qu'au hasard, si bien qu'un échantillonnage aléatoire les trouve tard. Comparez chaque chaîne décodée à sa ligne source avec un script, pas à l'œil. La procédure complète, y compris ce qu'un tableur fait en silence à un numéro de série à douze chiffres, est dans les flux CSV pour QR codes, et le schéma d'identifiants devrait suivre la convention de nommage que le reste de vos codes utilise.
Gelez ensuite ce fichier et archivez-le avec la date, la quantité et la destination du matériel. Dans trois ans, la seule question que quiconque posera sur un code sérialisé sera : sur quel objet était-il.


