On nous a récemment demandé si il existait un module Yoctopuce qui permettait d'interfacer par USB un lecteur de cartes à piste magnétique OMRON de la gamme V3A. Bien que de nos jours ces pistes magnétique ne représente plus une méthode véritablement sûre pour identifier une personne, elles sont toujours présentes sur les cartes bancaires par exemple et nous nous y sommes donc intéressés.
Sur la piste magnétique elle-même, les données sont stockées à l'aide d'un codage Manchester différentiel: en gros, c'est un code qui contient des 0 et des 1 (les données) superposés avec des transitions à intervalle fixe (l'horloge) de sorte à pouvoir l'interpréter correctement même lorsque la vitesse de défilement de la carte dans le lecteur varie.
Le lecteur de cartes à piste magnétique OMRON se contente de lire le signal, et de séparer les données et le signal d'horloge sur deux sorties digitales distinctes. Cela donne un signal de ce type:
Signal émis par le lecteur de cartes magnétiques OMRON
Ce genre de signaux correspond à ce que l'on appelle une liaison SPI (Serial Peripheral Interface), et pour le lire il faut donc utiliser un Yocto-SPI.
En plus de pouvoir décoder le signal SPI, le Yocto-SPI a l'avantage de fournir une source d'alimentation 5V ou 3.3V tirée du bus USB, qui nous permet d'alimenter le lecteur OMRON. Et cerise sur le gâteau, nous pourrons même utiliser les lignes de sortie non utilisées du Yocto-SPI pour piloter les LEDs du lecteur pour donner un feedback visuel.
Branchements
Voici le raccordement que nous proposons entre le Yocto-SPI et le lecteur OMRON:
Comment raccorder par USB un lecteur de cartes magnétiques OMRON (série V3A) à l'aide d'un Yocto-SPI
Comme le Yocto-SPI peut travailler de multiples manières, il faut le configurer correctement à l'aide du VirtualHub pour que la connection fonctionne:
- activer la source d'alimentation 5V pour le lecteur de cartes
- configurer le niveau électrique des signaux à 5V
- choisir l'ordre d'arrivées des bits en lsb (bit de poids faible en premier)
- activer l'utilisation d'une horloge externe (slave mode) plutôt que de génére une horloge à fréquence spécifiée.
Notez que ce dernier réglage n'est disponible que depuis le firmware 32351, qui vient de sortir (quelle coincidence...)
Configuration du Yocto-SPI avec horloge externe (SPI Slave)
Si tous les branchements sont corrects, vous devriez maintenant voir des valeurs s'afficher dans la fenêtre de contrôle du VirtualHub lorsque vous passez une carte dans le lecteur.
Décodage
Il reste encore une tâche importante pour pouvoir exploiter les données retournées par le lecteur de carte: il faut les décoder. En effet, les valeurs brutes ne sont pas directement utilisables:
- la polarité des bits est inversée
- le flux de bits commence par un nombre non-déterminé de 0, donc les données utiles ne commencent pas forcément au début d'un octet
- pour détecter les erreurs de lecture, entre chaque symbole (stocké sur 4 bits) se trouve un bit de parité qui doit être vérifié puis retiré du message pour que celui-ci soit compréhensible
- à la fin du message, un code de vérification transversal sert à valider le message dans son entier
- après le code de vérifications, un nombre non-déterminé de 0 suit les données utiles sans en faire partie
Nous vous épargnerons le détail des manipulations de bits à effectuer pour le décodage, mais vous pourrez retrouver le code source de notre petit programme d'exemple complet, écrit en C#, sur GitHub. La fonction qui effectue le décodage se trouve dans le fichier Form1.cs et s'intitule DecodeTrack2, puisque ce format spécifique à la Piste 2 définie par l'Association des Banques Américaines (ABA). Ce programme permet d'afficher le numéro d'une carte de crédit, sa date d'expiration et les informations annexes présente sur la bande magnétique par simple lecture de la piste 2:
Démonstration du décodage de la Piste 2 des cartes bancaires