progettare & costruire di FRANCO TEDESCHI Usare la tecnologia RfId (parte seconda) LA GESTIONE deitag Terminata l analisi delle caratteristiche di base dei sistemi RfId, in questo articolo vedremo come gestire i dati rilevati dai tags per poterli organizzare e utilizzare in maniera operativa Per dare un approccio concreto alla trattazione, faremo riferimento ai prodotti commerciali della Softworks, esclusivista per l Italia del marchio FEIG Electronics; per questi dispositivi, insieme all hardware vengono forniti anche un programma per la configurazione/test della strumentazione e delle ottime librerie di supporto che permettono di integrare velocemente le funzionalità dei controller all interno di programmi applicativi C/C++, Visual Basic, Delphi, etc... In figura 1 è riportato il reader utilizzato. Si tratta del controller siglato CPR-MR50, con interfaccia USB per lettura e scrittura multitag di transponder a 13,56 Mhz in conformità agli standard ISO 14443A/B, ISO15693 ed EPC. E possibile acquistare questo prodotto anche on-line, sul sito della Inware www.elettroshop.com. Grazie all antenna paddle esterna, questo reader riesce ad operare fino ad una distanza di circa 25 cm. Il controller è adatto per una vasta categoria di applicazioni che vanno dal commercio, all autenticazione e security, tracciabilità dei documenti, logistica, industria, etc... Il lettore supporta inoltre funzioni di sicurezza quali Myfare ed my-d, attraverso un secutity access module opzionale: ciò permette soluzioni sicure per il ticketing o applicazioni contabili. La funzione di anticollisione permette inoltre l identificazione simultanea di più TAG, mentre il firmware upgradabile consente gli aggiornamenti software per future generazioni di transponder. INSTALLAZIONE DEI DRIVER DEL CONTROLLER E DEL SOFTWARE DI CONFIGURAZIONE Per poter utilizzare il controller, per prima cosa bisogna provvedere alla installazione dei driver; il costruttore fornisce sia driver per sistemi operativi Windows che per Linux: nel seguito faremo esplicito 24 Figura 1: il reader di Softworks.
Figura 2: la schermata di avvio del programma di gestione del reader. riferimento ad ambienti con sistemi operativi Microsoft. I TAG a cui faremo invece riferimento nell articolo sono quelli relativi allo standard ISO15693. Dopo aver collegato il reader alla porta usb di un PC, il sistema operativo procederà al riconoscimento dell hardware e richiederà di indicare il percorso dove sono disponibili i driver della periferica forniti dal costruttore. Dopo aver completato questa operazione è possibile installare il software OBID-ISOStart della FEIG Electronics; si tratta di un programma di configurazione che permette di operare sui parametri del lettore e definire le condizioni operative di funzionamento del dispositivo. Al primo avvio del programma, dopo avere eseguito la fase di riconoscimento automatico del Reader, è importante impostare la porta COM di default e settare i parametri di comunicazione. Nella schermata di avvio del programma, (figura 2) nella parte sinistra dello schermo sono mostrati cinque ambiti operativi: 1. Command 2. Configuration 3. Host Command 4. Scanner Mode 5. Test and measurement I protocolli di trasmissione tra Reader e Host sono invece visualizzati nella parte bassa dello schermo ogni volta che si esegue un comando: questo permette di controllare in che modo avviene lo scambio dei dati. MODALITÀ COMMAND In questa modalità è possibile eseguire dei comandi che agiscono direttamente sul controller, come ad esempio il Reset della CPU, l avvio del Flash loader, etc, oppure è possibile attivare gli ISO Host Command, ovvero i comandi che provvedono allo scambio dei dati con i tag che entrano nel campo del Reader. Il lettore distingue tra tre modalità di scambio: Addressed (con indirizzamento ossia trasferimento dei dati da o verso un determinato TAG), Non-addressed (broadcast) e Selected (con selezione). ISO HOST COMMAND: FORMATO DEL PROCOLLO I comandi di particolare interesse, che permettono la comunicazione fisica con i TAG sono [0x01] Inventory, [0x23] Read, e [0x24] Write. Per comprendere come sono strutturati questi comandi, è sufficiente fare riferimento al formato previsto dal protocollo ISO 15693 sintetizzato in figura 3. Il primo byte rappresenta la lunghezza, ovvero 25
progettare & costruire identifica il comando di Inventory; per quanto riguarda la Response-data, nel campo Data-sets viene riportato il numero dei tags rilevati, mentre nei campi successivi viene indicato il tipo, il DSFID e l UID, transponder per transponder (il significato di questi ultimi campi sarà illustrato fra breve). Figura 3: il formato standard ISO 15693. Figura 4: struttura del Request-data e del Response-data per il comando Inventory. Figura 5: struttura del Request-data e del Response-data per il comando Read. Figura 6: struttura del Request-data e del Response-data per il comando Write. il numero n dei byte del protocollo (minimo 6, massimo 255 bytes), compreso la checksum. Il secondo Byte definisce indirizzo della porta COM ovvero indica l indirizzo del device. Il terzo Byte rappresenta il codice del comando ISO. I byte Status e Dati del protocollo includono invece il messaggio di stato e/o il dato scambiato con il Reader. CRC16 è infine una checksum denominata Cyclic redundancy check. L algoritmo interessa i bytes del protocollo dall 1 all n- 2. Vediamo ora nello specifico i comandi ed il loro significato. [0x01] Inventory Questo comando legge l UID di tutti i transponders all interno del campo dell antenna: quando il Reader intercetta un nuovo tag, lo colloca nel Quiet state in modo che non sia più riconteggiato in caso di un secondo comando di Inventory. Il transponder manda in ogni caso una risposta se è uscito e rientrato dal campo dell antenna o il se Reader ha ricevuto un comando di [0x69] RF Reset. La Request-data e la Response-data sono strutturate come in figura4. Il byte 4 del protocollo vale 0x01 ed [0x23] Read Questo comando legge uno o più blocchi-dati memorizzati all interno del transponder. La struttura di Request-data e Response-data è indicata in figura 5. Nella Request-data si possono evidenziare (byte 5) MODE: impone la tipologia dello scambio che può essere Non Adressed, Addressed, Selected (byte 6 e successivi) UID: numero seriale del transponder, è necessario solo nel caso di Addressed mode (byte DB-ADR): numero del primo blocco che deve essere letto (byte sucessivi al DB-ADR) DB-N: numero dei blocchi di dati da leggere all interno del transponder Nella Response data invece (byte 5) DB-N: numero dei blocchi di dati letti all interno del transponder (byte 6) DB-SIZE: numero di bytes contenuti in un blocco di dati. Questo valore dipende dalle specifiche del costruttore dei transponders (byte 7) SEC-STATUS: Blocco di sicurezza, indica se un blocco è read-only oppure read-write (byte 8 n) DB: contenuto dei blocchi richiesti Se lo stato indicato nella Response Data è [0X95] si è verificato un errore di comunicazione. E bene tener presente che esistono transponders che non supportano la lettura di blocchi multipli, in questo caso vanno effettuate molte letture singole; inoltre nel non Addressed mode viene letta comunque la memoria di un singolo TAG. [0x24] Write Questo comando scrive uno o più blocchidati memorizzati all interno del transponder. La Request-data è strutturata come in figura 6. Nella Request-data si possono evidenziare (byte 5) MODE: impone la tipologia dello scambio che può essere: 26
non Addessed mode, Addressed, Selected (byte 6 e successivi ) UID: numero seriale del transponder, è necessario solo in caso di addressed mode (byte successivi all UID) DB-ADR: numero del primo blocco che deve essere scritto. (byte successi vi al DB-ADR) DB-N: numero dei blocchi da scrivere all interno del transponder (byte successivi alla DB-N) DB-SIZE: numero di bytes contenuti in un data block (byte successivi al DB-SIZE) DB: informazioni/dati da scrivere nei transponders; la loro dimensione dipende dalla DB-SIZE. Il numero dei bytes attesi è DB-N*DB-SIZE. Per quanto riguarda la response Data, se si tenta di scrivere in un area di sola lettura, se c è troppa distanza tra Reader e transponder o se avviene un tentativo di scrittura in una zona rumorosa il lettore risponde con lo status [0x03] Write-Error. Figura 7: l organizzazione della memoria del reader. LISTATO 1 Private Sub Command1_Click() Dim HReader As Long HReader = ISCReader1.NewComReader( 6, 8E1, 38400, 2000 ) If HReader <= 0 Then MsgBox ( Errore Apertura Dispositivo: + Str(HReader)) Else Call ISCReader1.ISO_CMD_Inventory(HReader, 0) End If Private Sub ISCReader1_ISOCMDAnswer(sResp As String, ireaderhnd As Long, ByVal cbusadr As Byte, istatus As Long) Text1.Text = CStr(sResp) Private Sub Command2_Click() Call ISCReader1.PRC_RF_OnOff(HReader, 0, 0) Unload Me 27
progettare & costruire Figura 8: l organizzazione della memoria dei trasponders. Figura 9: struttura dell UID. Per altri tipi di errore di comunicazione il Reader risponde con lo status [0x95] Iso 15693 Error. MODALITÀ CONFIGURATION I comandi di configurazione e di controllo sono utilizzati per impostare i parametri del lettore e per effettuare diagnosi attraverso l interfaccia USB. Le modifiche saranno salvate nella memoria del lettore, temporaneamente nella RAM, oppure definitivamente nella EEPROM. Il Reader è infatti dotato di due tipi di memoria, RAM ed EEPROM, organizzate in blocchi numerati (CFG0,...CFG9) di 16 bytes ciascuno (figura 7). I parametri di configurazione occupano 14 bytes; 2 bytes sono riservati alla checksum a 16 bit. Tra le operazioni possibili, ricordiamo quelle di configurazione del Reader ([0x80] 28 Read configuration, [0x81] Write configuration, [0x82] Save configuration, [0x83] Set default configuration). Una operazione particolarmente importante è quella che permette di commutare il reader dalla modalità Host attraverso cui è in grado di trasmettere i comandi ISO e scambiare dati, alla modalità Scan Mode. MODALITA SCAN MODE In questa modalità sarà attivata la finestra grafica in cui saranno visibili a video gli UID dei tag che entrano nella zona di lettura del reader. E anche possibile scrivere i valori acquisiti in un file di testo. Ricordiamo che affinché questa modalità sia attiva è necessario impostare nel blocco CFG1 l opzione Scan Mode ed effettuare il Write della configurazione nella memoria del controller. ORGANIZZAZIONE DELLA MEMORIA DEI TRANSPONDERS Secondo lo standard ISO 15693,i dati sono memorizzati in una memoria non volatile EEPROM (figura 8) dalla capacità di 1024 bit organizzati in 32 blocchi di 4 bytes ciascuno (1 blocco = 4 byte e rappresenta l unità di accesso minima). 28 blocchi contengono eventuali dati memorizzati dall utente, mentre 4 blocchi sono riservati per UID, condizioni di accesso in scrittura, AFI e DSFID. L UID di 64 bit è programmato durante il processo di produzione in accordo con lo standard ISO/IEC 15693-3 e non può essere manipolato in alcun modo. La numerazione inizia con LSB1 e termina con MSB64. All interno dell UID, (figura 9) sono codificate alcune informazioni quali tipo di tag (0x01 per gli ISO 15693) e codice del produttore (0x04 per Philips Semiconductors) come si può notare dalla Figura 8, EAS, DSFID e AFI sono byte riservati per funzioni specifiche: Electronic Article Surveillance consiste in un singolo bit che permette di effettuare un controllo antitaccheggio. Application Family Identifier codifica alcune famiglie (e sottofamiglie) di applicazioni con cui si possono strutturare le informazioni contenute nella memoria. Data Storage Family Identifier indica come il dato è strutturato all interno della memoria del tag. ORA METTIAMOCI ALL OPERA! Nel seguito mostreremo come creare dei semplici programmi che sfruttando alcune librerie specifiche, interagiscono con il Reader opportunamente configurato in modo da poter comunicare con i TAG. Questi programmi hanno il solo scopo di mostrare come le informazioni contenute nei tag possono essere acquisite, per essere poi elaborate a seconda delle specifiche esigenze. Abbiamo scelto di utilizzare il linguaggio Visual Basic in primo luogo per poter utilizzare il controllo ActiveX SwISCReader fornito dal distributore Softworks insieme all hardware a disposizione, ed in secondo luogo per le potenzialità di questo linguaggio per quanto riguarda la connessione ai database. Il controllo SwISCReader.OCX è
simile a un.dll, ma oltre alle funzioni condivise, fornisce anche una propria interfaccia che permette l interazione con la strumentazione attraverso alcune funzioni parametrizzate, consentendo di gestire da 1 a n Readers connessi al Pc tramite interfaccia seriale, USB o ethernet. Prima di utilizzare l OCX i dispositivi devono essere opportunamente configurati tramite il software di OBIDScan: in particolare devono essere impostati il metodo di funzionamento host mode e i parametri della porta seriale. Il primo esempio applicativo di cui mostriamo il codice nel listato 1, è un programma che implementa il comando ISO Inventory [0x23]. La figura 10 rappresenta la Form di interfaccia del programma. Ricordiamo che per poter utilizzare le funzionalità fornite dalla libreria SwI- SCReader in dotazione, è necessario installare preventivamente il controllo OCX sulla macchina, ed includerlo nel progetto Visual Basic. L istruzione HReader = ISCReader1.NewComReader( 6, 8E1, 38400, 2000 ) crea l handle al Reader, per poterlo riferire all interno del codice.questo comando crea un nuovo oggetto Reader per la seriale specificata parametro e ritorna l handle dell oggetto Reader ( HReader ) che permetterà la sua gestione. Nello specifico la procedura lega all oggetto Reader la porta seriale COM6 che viene aperta con i parametri Frame 8E1, Baud Rate 38400, Block Timeout 2000. La funzione Call ISCReader1.ISO_CMD_Inventory (HReader, 0) invia un comando ISO di inventory al Reader. Il comando Inventory attiva l evento di risposta ISOCMDAnswer() ed intercettandolo si possono rilevare i dati di risposta per i tags individuati nel campo dell antenna. In particolare, la risposta ( Resp ) contiene il numero di tags rilevati nel campo ed il loro UID. Il contenuto della stringa di risposta è del tipo nn xxyyssssssssssssssss xxyyssssssssssssssss... dove: nn = primi due byte che rappresentano il numero di tag rilevati in esadecimale dopodichè si ripetono sequenze di 20 byte dove i primi 2 di ogni sequenza identificano xx = il tipo di tag (Es. 00 per I-Code 01 per Tag-it, 03 per ISO) yy = family code per ISO tags ssss = Serial number L esempio applicativo successivo, il cui codice è riportato nel listato 2 implementa invece il comando ISO [0x23] Read, ovvero effettua una lettura del contenuto dei blocchi di memoria dei transponder. Si presuppone chiaramente, che i dati siano stati preventivamente scritti all interno dei TAG, il modo più semplice, se si vogliono fare dei test della routine, è quello CODICE MIP 2781295 29
progettare & costruire Figura 10: la form di interfaccia del programma. Figura 11: il risultato della lettura di un tag. LISTATO 2 Private Sub Command1_Click() Dim HReader As Long HReader = ISCReader1.NewComReader( 6, 8E1, 38400, 2000 ) If HReader <= 0 Then MsgBox ( Errore Apertura Dispositivo: + Str(HReader)) Else Call ISCReader1.ISO_cmdGen(HReader, 255, 23000201) End If Private Sub ISCReader1_ISOCMDAnswerGen(sResp As String, ireaderhnd As Long, ByVal cbusadr As Byte, istatus As Long) Text1.Text = CStr(sResp) Private Sub Command2_Click() Call ISCReader1.PRC_RF_OnOff(HReader, 0, 0) Unload Me di usare il software OBIDScan per memorizzare i dati desiderati all interno di uno o più TAG attraverso l apposito comando ISO [0x24]. La funzione Call ISCReader1.ISO_cmdGen(HReader, 255, 23000201) permette di inviare un commando ISO al trasponder e ottenere la risposta tramite l evento ISOCMDAnswerGen(). I comandi possibili i effetti, sono tutti i comandi ISO supportati dai tags in uso. Nella chiamata,hreader Indica l handle del Reader, 255 Indica l indirizzo del Reader, 23000201 è la ReqData ovvero la stringa che contiene il comando da inviare ai transponders seguito dagli eventuali parametri supportati. In particolare: CMD = 23 (comando Leggi ) 30 MODE = 00 (indica Non addressed mode ) UID = (nel caso di non addressed mode non si deve specificare un numero seriale per effettuare la lettura del tag) DB-N = 02 (lettura di 2 blocchi di memoria) DB-ADR = 01 (lettura a partire dal blocco di indirizzo 1 ovvero il primo blocco della memoria) Nell evento di risposta ISOCMDAnswer- Gen si riceverà la stringa Resp = 020400XXXXXXXX Dove: DB-N = 02 DB-SIZE = 04 (dimensione dei blocchi di memoria che dipende dal tipo di transponder) SEC-STATUS= 00 Stato dei blocchi. In questo caso non richiesto quindi = 0 DB = XXXXXXXX (contenuto dei blocchi di memoria, due caratteri per ogni byte, valore esadecimale) Per inviare altri comandi ISO, la stringa ReqData va costruita di volta in volta consultando le specifiche 15693. L evento ISOCMDAnswerGen, attivato da ISO_CmdGen, genera risposte che sono diverse a seconda del comando inviato: in ogni caso bisogna sempre riferirsi alla documentazione ISO 15693 per avere la corretta chiave di interpretazione della stringa. CODICE MIP 2772198