logo

 

Preface
Objectif
L'ASIC
Protocole IR
Pricehax
Les ESL DM

Pour le consommateur, l'etiquette electronique (ESL) a été présentée comme:

  • Écologique car elle remplace le papier
  • Un gage de fiabilité car prix affiché = prix en caisse
  • Utile car capable de signaler les promos
  • Un allégement de la charge de travail du staff: il peut mieux s'occuper du client

Mais l'étiquette électronique n'a certainement pas été inventée pour le consommateur. Du côté des enseignes de grande distribution, le discours se situe forcement de l'autre coté de la barrière: il faut séduire tout le monde.

  • Mise a jour instantanée des prix
  • Staff moins occupé = staff qui dégage
  • Permet d'orienter et de faciliter la décision des clients
  • Démarcation des petites enseignes qui ne peuvent pas se payer le système

Avec les arguments avancés de part et d'autre, on a bien la confirmation que les étiquettes électroniques sont vendues à Carrefour, pas à madame Michu. D'ailleurs, c'est bien madame Michu qui croirait à l'argument écologique...
Devinette: quelle est la différence entre un bout de papier certainement issu de forêts gérées, et un appareil électronique contenant plastique, cadmium, antimoine, nickel et une paire de piles au lithium ? Le progrès. Des gains...

 

Objectif de ces pages: Étudier le fonctionnement d'un système d'étiquettes électroniques dans le but de prouver qu'elles sont avant tout un outil de vente, qu'elles n'apportent pas plus de fiabilité que des étiquettes papier et aussi pour se marrer un coup, avouons-le.

Les informations données sur ces pages proviennent de mes recherches, qui se sont étalées sur plusieurs mois en 2015.
Je tiens à remercier Aoi, Dr. Windaube, LightSnivy, Deadbird, BiduleOhm et Virtualabs pour leur soutien moral et matériel ;-)

Le nom de la firme qui produit et vend ces étiquettes n'est pas donné pour une bonne raison.
Quelques indices innocents: Leroy Merlin, Castorama, Delhaize.

L'argument principal avancé pour ce dit système est qu'il communique en infrarouge, de manière bidirectionelle et sécurisée: Bidirectionelle peut être. Sécurisée, j'en doute.

“There is absolutely no way the system can be hacked or suffer interference from any other wireless devices which are powerful and mobile today. It’s the same, secure technology that was developed specifically for heat-seeking missiles fired from fighter jets.”

ESL

Il existe une autre marque (cocorico cette fois) qui utilise de la radio mais pour une raison bien particulière, je n'en parlerai pas.

 

Comment la firme assure ses revenus sur le long terme grâce a l'implantation de ses étiquettes:

Comme décrit plus loin, ces ESL sont basées sur un ASIC propriétaire.
D'après mes observations ils ne possèdent pas de flash, et cela pour deux raisons: La RAM est plus compacte, mais surtout et avant tout, elle est volatile.
C'est a dire que si l'ESL perd son alimentation, non seulement les données affichées s'envolent mais aussi le firmware.
En clair, quand les piles sont mortes ou retirées, il n'y a aucun moyen de ressusciter l'ESL a part la renvoyer chez la firme pour qu'elles soit remplacées (un petit tiroir est prévu) et qu'ils recopient le firmware en RAM.

C'est clairement du recyclage contrôlé, payant, et restrictif.

 

Terminologie:

  • ESL: Electronic Shelf Label, ou EEG: Étiquette Électronique de Gondole
  • PL: Price Label, la même chose
  • IR: Infrarouge
  • UPC: Universal Product Code, le code à barres des produits
  • Code128: Le type de code à barres utilisé pour identifier les ESL
  • DM: Dot Matrix, les ESL à écrans e-ink
  • PLID: Price Label IDentification, un code 32 bits unique identifiant une ESL
  • Access key: Un code sur 16 bits permettant de restreindre l'accès a certaines ESL dans un magasin
  • Store key: Un code sur 16 bits permettant de restreindre les ESL d'un magasin entier
  • TRX: Transceiver, les soucoupes volantes infrarouge au plafond
  • BS: Base Station, l'interface backend magasin / TRX
  • Page/Register: Zone mémoire ou champ d'une ESL
  • Frame: Trame infrarouge

 

Quelques fantasmes réalisés:

  • Changer les prix affichés
  • Changer les images affichées
  • Bloquer un affichage faux pendant 3 heures
  • Sécher les piles en une semaine

Quelques fantasmes possiblement réalisables:

  • Changer l'Access key, empêcher le magasin de communiquer avec l'ESL
  • Mettre le firmware a jour par infrarouge, briquer l'ESL
  • Mettre le firmware a jour avec un ver qui peut se propager d'ESL en ESL en utilisant la LED de réponse

 

Premières recherches

Dans une vidéo, on peut voir un employé de magasin lier des étiquettes a des produits. Ceci permet au niveau informatique d'utiliser la base de données du magasin (et donc des caisses) pour gérer l'étiquette placée sous le produit.

ESL

On peut le voir premièrement scanner l'UPC d'un produit a l'aide d'un terminal/scanner classique, puis le code128 de l'ESL. Quelques secondes après, l'ESL se met a jour.
La deuxième association rate car le scanner n'arrive pas a lire le code sur l'ESL, l'employé retourne celle-ci pour avoir son code imprimé a l'arrière (le même).
La troisième association montre que l'étiquette répond avec un certain délai (clignotement IR visible) alors qu'elle n'est plus visée. Cela prouve que la mise a jour ne se fait pas directement depuis le terminal portable mais par le serveur du magasin par WiFi auquel le terminal est connecté.

Au lieu d'avoir une simple liaison Terminal -> ESL, un grand détour est fait par l'infrastructure propriétaire. La séquence se déroule comme suit:

  • L'employé scanne un UPC, puis un code128 d'ESL.
  • Le terminal transmet par WiFi l'ordre d'association produit/ESL
  • Le logiciel de gestion des ESL enregistre l'association en DB
  • Le logiciel transmet en ethernet une demande d'acquittement de l'ESL vers la BS
  • La BS commande aux TRX d'interroger l'ESL par IR(ou qu'elle soit)
  • Le TRX reçoit (ou non) l'acquittement de l'ESL par IR et l'indique a la BS
  • Le BS indique au logiciel que l'étiquette existe bien et qu'elle est prête

ESL

 

Étude des étiquettes

Un des modèles utilisés: une "E4 HCN Freezer" (version frigo, supportant jusqu'a -30°C).
Elles m'ont été gracieusement offertes par Dr. Windaube il y a très longtemps, merci !

ESL

Sur toutes ces ESL, on peut trouver a l'arrière le code128 avec son contenu alphanumérique sur un autocollant. C'est un identifiant de 17 caractères. Il est constitué ainsi:

ESL

Le "4" en deuxième position est commun a beaucoup d'ESL. La lettre indique peut être le type de matériel ?

Pour être valide, un code doit satisfaire les conditions suivantes:

  • Le "4" doit être présent
  • Manufacturing unit doit être égal ou inférieur a 64
  • Manufacturing week doit être égal ou inférieur a 53 (logique)
  • Le serial doit être égal ou inférieur a 65535
  • Le checksum doit être égal a la somme des 16 précédentes valeurs ASCII modulo 10.

Donc G4591371776312423: Étiquette fabriquée par l'unité 59, dans la 37eme semaine de 2001, le serial est 17763, la référence produit (1)1242, et le checksum est 3 (valide).

Le PLID 32 bits correspond a MMYWWSSSSS, soit Manufacturing unit, l'année et la semaine de fabrication, et le serial. L'exemple donne un PLID de 0xE7014563.

Derrière cet autocollant se trouvent deux petits trous dans la coque de l'ESL donnant sur des pastilles du PCB. L'une va au plan de masse, l'autre à l'ASIC. Des impacts de pointes sont visibles, indiquant que c'est probablement via cette interface que les étiquettes sont baptisées en usine et ressuscitées durant le recyclage.

Note: Je pensais que ca pouvait éventuellement être une PROM ou une EEPROM 1-wire, mais c'en est pas. Ni quoi que ce soit de connu en 1-wire, d'ailleurs. C'est vérifié. C'est probablement un protocole unidirectionnel très simple, pour éviter d'avoir trop de logique en dur dans l'ASIC (pas de bootloader, forcement !).

ESL

Quand on veut remplacer du papier par un appareil électronique et qu'on veut réduire leur prix au minimum, on doit se contenter de pas grand chose:

ESL

"PLL band transmitter" dans la doc commerciale: Certainement quelqu'un qui ne savait pas ce qu'était une PLL.
Merci pour l'information en tout cas !

Le quartz est taillé pour 32768Hz, et sert dès la mise sous tension de l'étiquette (>2.2V).
A droite on trouve la photodiode D1 wire-bondée directement sur la carte, la LED infrarouge de réponse D2 au dessus, ainsi que son condensateur réservoir C4.
Une charge pump intégrée dans l'ASIC génère du 6V sur TP9, probablement pour l'afficheur.
Un procédé nomme "precharge" géré par l'infrastructure permet a l'étiquette de recharger C4 entre plusieurs réponses (allant jusqu'a 2 secondes) afin d'obtenir une réponse puissante malgré le peu de courant disponible instantanément avec les piles CR2032.
TP13: Tension piles (3V).
TP18: Masse.
A noter: 3 fins de pistes sans vernis sont visibles à gauche de R2, possiblement une interface de programmation ou de debug propriétaire.

La modulation infrarouge propriétaire est nomme "PP4" et correspond à une modulation par position d'impulsion à 4 symboles (4PPM), pouvant ainsi coder 2 bits par symbole.

Les impulsions sont en fait des bursts à exactement 20MHz/16 = 1.25MHz. Ils durent 50 périodes, soit 40µs.
La durée des espaces entre les symboles code les 2 bits. Elles sont mélangées et pas graduelles.
Une autre version de la modulation, "PP16" utilise les mêmes bursts mais avec une résolution plus fine permettant de coder 4 bits en un symbole. Seules les ESL DM semblent accepter PP16.

A noter qu'il est impossible de simuler cette modulation avec un chip IRDA classique, ni un émetteur IR de téléphone (limité a quelques kHz en général).

Selon des documents publics, les bitrates réels seraient de 10kbps pour PP4 et 38kbps pour PP16. Mes ESL a segment ne reconnaissent que PP4.

ESL
(La taille des bursts n'est pas a l'échelle)

 

Étude du firmware du TRX, avant de recevoir le TRX:

J'avais a disposition une mise a jour au format Intel hex, convertie de suite en .bin.

Une première analyse visuelle montre que les opcodes sont sur 16 bits, et que celles-ci ne correspondent pas a des instructions Microchip (MSB parfois supérieur a 0x20), ni Atmel.

Une analyse statistique révèle qu'un des mots les plus récurrents est 0x5470 qui, après une rapide recherche Google, s'avère être l'opcode RTS des processeurs H8 (Hitachi, maintenant Renesas).

Une tentative de désassemblage dans IDA génère en effet du code sensé:

ESL

 

Etude du logiciel serveur

Le "arrayOfInt" contient des valeurs ressemblant a celles des durees pour les symboles PP4C.
De plus, les lignes suivantes decomposent "paramByte" en 4 groupes de 2 bits, MSB en premier (i,j,k,m) et ajoute les durees pour chaque.
Note: si on divise les valeurs par 30.5, on obtient: 3.3, 9.3, 5.3 et 7.3. Pas de valeurs entiere. Il semblerait donc que la duree des bursts n'est pas comprise dans la duree specifiee dans le profil de la BS.

Si par exemple on veut tomber a 3 au lieu de 3.3 pour la valeur 101, on tombe sur 101/3 = 33.67µs. Ce qui voudrait dire que les bursts durent 33.67-30.5 = 3.15µs. Avec 24 cycles on arrive a une porteuse de 7.62 MHz, ce qui parait un peu trop eleve.
Si plutot on veut tomber a 2 au lieu de 3.3, comme le nombre de cycles trouve pour le symbole PP4C "00" dans l'analyse ci-dessus, on tombe sur 101/2 = 50.5µs. Ce qui voudrait dire que les bursts durent 50.5-30.5 = 20µs. Avec 24 cycles on arrive a une porteuse de... 1.25MHz, pas loin du tout des 1.245MHz vaguement specifies dans la doc !

On sait donc que les cycles correspondants ne sont pas 3,9,5,7 mais 2,5,3,4

60=0x3C soit la commande utilisee dans WakeUpFrames pour reveiller les E4 HCN Freezer (selon WakeUpSchemes).
La frame serait donc constituee de 60,boolean1=128/0=0,paramByte,1=128/0=0,longtoaob(paramlong),aob de 2 bytes a 0 ?,null

longtoaob(long paramLong) retourne un arrayOfByte de 4 bytes, avec paramLong dedans 0=LSB 3=MSB

Longueur wakeup frame: 1,1,1,1,4,2,0 = 10 (byte,byte,byte,byte,aob,aob,null)

Checksum function (CRC16 avec une valeur de depart a 33800):

crc = 33800
Pour chaque byte de aob: crc = table[(crc ^ aob[i]) & 0xFF] ^ (crc >> 8);

On peut mettre a jour le firmware des etiquettes via IR (verifier sa version, et -peut etre- le lire ?)

 

 

Etude du TRX: Voir Youtube

WO0209322

RS485 et 48V en entree. Oscillateur 20MHz.

H8/3687 et CPLD Lattice 4064V (pas gros)

Reception reponse ESL IR par SA636, generation d'IF 10.7MHz par AD9833 sinus filtré LC. Discrimination a 455MHz (10.7-0.455 = 1.245MHz !).
La porteuse de reponse est a 1.245MHz. Decalage de seulement 5kHz du 1.25MHz du downlink ?

Filtre ceramique, logo Murata marquage XH:

ESL

CPLD clock a 20MHz, aussi une entree a 10MHz.

On trouve une connexion UART 38400bps sur l'µC, qui semble etre unidirectionelle:

***** TRX INIT *****
Firmware:
Compile date: Feb  4 2007
Compile time: 20:39:15
PON Counter:0001
TCSRWD:AA
WOKE UP FROM POWER ON
WATCHDOG INITIATION STARTED!
WATCHDOG INITIATION COMPLETED!
irrxSetup:
 Intg. Time:02E1
 Noise Time:02C2
 PreFB Time:0DD8
 RIM Time  :1F95
CABLE: TxError
CABLE: RxError
CABLE: 48V Error
FELIF: Closed (HW error)
Hello: 0000632F
Hello: 0000C651
Hello: 00012BCD

L'µC detecte la presence du 48V avec un pont diviseur directement sur l'alimentation (avant la diode): 100k et 4.7k, donnant 2.15V sur une broche ADC (ref interne + comparateur certainement). En ajoutant 100k en parallele sur la resistance de 100k deja presente (=50k), et en alimentant en 30V seulement, l'erreur disparait.

TxError et RxError semblent etre liees a une mesure electrique, et pas un echange de donnees (rien sur la liaison RS485 au demarrage).
FELIF closed ? J'espere que c'est lie a l'absence de 48V...

ESL

Corrections aux suppositions sur le PP4 grace a la doc trouvée par Biduleohm: Les bursts durent 41µs ?

ESL

footer
symbol symbol symbol symbol symbol