ACS ACR 122

L'ACS ACR 122 est un lecteur d'étiquettes RFID bon marché se branchant sur un port USB.

Il est reconnu comme un équipement USB CCID (lecteur de cartes à puce). Il est donc accessible via PCSC et depuis Java via l'API javax.smartcardio

Il est disponible à moindre coût dans le starter kit Touchatag avec 10 tags Mifare verroullés.

La bibliothéque pilotant le Touchatag (ex Tikitag) peut être utilisée également.

NB: le service Touchatag a été fermé : un projet open-source IOTOPE prend le relai.


 * API http://www.acs.com.hk/drivers/eng/API_ACR122U_v2.00.pdf

Reconnaissance du peripherique sous Linux
Pour verifier que le lecteur est bien reconnu sous une machine Linux, utiliser la commande lsusb qui permet de lister les peripheriques branchés USB branchés a votre machine. Vous devriez voir une entrée de ce type: Bus XXX Device YYY: ID 072f:90cc Advanced Card Systems, Ltd ACR38 SmartCard Reader

Pour avoir plus de details concernant le lecteur branché, utilisez la commande pcsc_scan qui permettra d'indiquer le nom du materiel, du fabricant, aisni que diverses caracteristiques du lecteur. Certains packages sont requis pour utiliser cette commande, tapez la commande ci-dessous (ou installer manuellement à cette adresse) sudo apt-get install pcsc-tools

Le résultat de la commande pcsc_scan sur la console doit être de ce type là (peut varier suivant le type de lecteur utilisé!!) PC/SC device scanner V 1.4.22 (c) 2001-2011, Ludovic Rousseau  Compiled with PC/SC lite version: 1.8.10 Using reader plug'n play mechanism Scanning present readers... 0: Broadcom Corp 5880 [Contacted SmartCard] (0123456789ABCD) 00 00 1: ACS ACR 38U-CCID 01 00

Thu Mar 17 11:33:22 2016 Reader 0: Broadcom Corp 5880 [Contacted SmartCard] (0123456789ABCD) 00 00 Card state: Card removed, Reader 1: ACS ACR 38U-CCID 01 00 Card state: Card inserted, ATR: 3B BE 96 00 00 41 03 00 00 00 00 00 00 00 00 00 02 90 00

ATR: 3B BE 96 00 00 41 03 00 00 00 00 00 00 00 00 00 02 90 00 + TS = 3B --> Direct Convention + T0 = BE, Y(1): 1011, K: 14 (historical bytes)- TA(1) = 96 --> Fi=512, Di=32, 16 cycles/ETU 250000 bits/s at 4 MHz, fMax for Fi = 5 MHz => 312500 bits/s TB(1) = 00 --> VPP is not electrically connected TD(1) = 00 --> Y(i+1) = 0000, Protocol T = 0 - + Historical bytes: 41 03 00 00 00 00 00 00 00 00 00 02 90 00 Category indicator byte: 41 (proprietary format)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt): 3B BE 96 00 00 41 03 00 00 00 00 00 00 00 00 00 02 90 00 SAM inside the Tikitag reader from Alcatel-Lucent http://hackerati.com/post/57314994/rfid-on-the-cheap-hacking-tikitag

Interaction avec les tags Mifare UltraLight
La technologie Mifare (de la société NXP) se décline en plusieurs catégories qui respectent toutes à différent niveau le standard ISO/IEC 14443 Type A. Il existe donc des tags Mifare Classic 1k, Mifare Classic 4k, etc... et Mifare Ultralight. Nous nous intéressons ici qu'a ce dernier.

Installation de la libraire libnfc
Pour pouvoir lire/écrire un tag Mifare UltraLight, la librairie libnfc est nécessaire dont les instructions d'installation sont disponible à cette adresse: http://nfc-tools.org/index.php?title=Libnfc

A noter que sous Ubuntu, les paquets peuvent être installés nativement depuis les depots via la commande: sudo apt-get install libnfc5 libnfc5-dbg libnfc-bin libnfc-dev libnfc-examples

Interagir en mode commande avec un tag Mifare UltraLight
Pour interagir avec le tag, placer le sur le lecteur d'étiquette.

Caracteristiques du tag
Executer la commande nfc-list en mode verbose (http://nfc-tools.org/index.php?title=Libnfc:nfc-list) nfc-list -v

Cette commande permet d'obtenir des informations (ATQA, UID et SAK) du tag Mifare ainsi que son type. Voici un exemple de résultat: nfc-list uses libnfc 1.7.0 NFC device:    / CCID USB Reader opened 1 ISO14443A passive target(s) found: ISO/IEC 14443A (106 kbps) target: ATQA (SENS_RES): 00 44 UID (NFCID1): 04 0b  38  aa  0a  24  81 SAK (SEL_RES): 00
 * UID size: double
 * bit frame anticollision supported
 * Not compliant with ISO/IEC 14443-4
 * Not compliant with ISO/IEC 18092

Fingerprinting based on MIFARE type Identification Procedure: Other possible matches based on ATQA & SAK values:
 * MIFARE Ultralight
 * MIFARE Ultralight C

0 Felica (212 kbps) passive target(s) found.

0 Felica (424 kbps) passive target(s) found.

0 ISO14443B passive target(s) found.

0 ISO14443B' passive target(s) found.

0 ISO14443B-2 ST SRx passive target(s) found.

0 ISO14443B-2 ASK CTx passive target(s) found.

0 Jewel passive target(s) found.

Lire un tag
La commande nfc-mfultralight est ici utilisé. Pour effectuer une opération de lecture, il faut executer la commande suivante: nfc-mfultralight r fichier_sortie.mfd

Ce fichier contient l'état de la mémoire du tag UltraLight, composé de 16 pages (1 page = 4 octets) qui sont décrites dans ce document ( page 8).

Pour mieux comprendre le fichier .mfd généré, convertissez son contenu en hexadecimal via la commande suivante: xxd -p fichier_sortie.mfd

Les pages contenant les données, qui sont les plus intéressantes, sont les pages 5 à 16. Les données suivent le format NDEF dont la spec est disponible à cette adresse: http://www.eet-china.com/ARTICLES/2006AUG/PDF/NFCForum-TS-NDEF.pdf

Un exemple complet de données d'un tag est illustré sur ce site: http://www.acbm.com/inedits/nfc.html

Demon de detection d'un tag
Un demon, nfc-eventd, existe et permet d'envoyer un signal DBUS lorsque un tag est détecté par le lecteur ou retiré du lecteur. Ce démon ne prend uniquement que l'UID du tag scanné.

Les instructions d'installation de ce dernier sont disponible à cette adresse: http://nfc-tools.org/index.php?title=Nfc-eventd

Il est possible d'éditer le fichier de configuration nfc-eventd.conf de cet utilitaire en lui indiquant les actions à effectuer lorsqu'un tag est inséré. Dans l'exemple suivant, l'action effectuée correspond a un ajout d'une entrée (UID + date) dans le fichier /tmp/nfc-eventd.log. action = "(echo -n 'Tag (uid=$TAG_UID), inserted at: ' && date) >> /tmp/nfc-eventd.log";

Cette action correspond simplement a une commande shell exécuté et qui est possible d'être modifié par une autre commande.