ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Collegare lettori di carte USB tramite Websockets

È possibile collegare qualsiasi lettore di carte USB da qualsiasi browser web utilizzando Websockets e NodeJS. Ciò significa che è possibile effettuare transazioni EMV da un Terminale Virtuale. Scopri come fare qui di seguito!

La volta scorsa, ho illustrato come configurare la connettività USB tramite JavaScript utilizzando NodeJS e un modulo chiamato node-hid. Il risultato è stato che siamo riusciti a ottenere accesso programmatico ai dispositivi USB, tramite JavaScript, in sole 75 righe di codice circa. Il nostro script ha implementato il rilevamento e la connessione automatica dei dispositivi, fornendoci un handle del dispositivo con cui eseguire operazioni di lettura e scrittura dei dati USB.

Il tutto va bene, se l'unica cosa di cui hai bisogno è l'accesso programmatico ai dati USB dall'interno di uno script Node.

Ma cosa succede se vuoi trasmettere quei dati a un altro processo? E se, ad esempio, volessi inviare dati USB a un browser web? O trasmetterli a un server?

Nessun problema. È possibile farlo. È semplice!

WEBSOCKETS IN SOCCORSO

Il protocollo Websocket (specifica IETF qui) è uno degli standard Web più straordinariamente utili apparsi sulla scena da molto, molto tempo a questa parte. E fortunatamente è implementato da tutti i browser moderni. Inoltre, è disponibile per gli script Node, il che significa che il codice Node può comunicare con gli script del browser in modo piuttosto semplice, creando una connessione socket che fa da ponte tra i due ambienti.

Sul lato Node, sarà necessario aprire una console del sistema operativo ed eseguire npm install socket.io -g (una volta sola) per installare il modulo socket.io , ampiamente diffuso e meritatamente apprezzato. Una volta fatto, gli script potranno richiamare require("socket.io") per sfruttare tutta la potenza di quel modulo. (Ne vedremo di più tra poco.)

Sul lato browser, è necessario puntare al file socket.io.slim.js script, in modo che la tua pagina web possa ricevere dati tramite Websocket. (Non tentare di utilizzare la API Websocket standard del browser, poiché il modulo socket.io sopra menzionato utilizza un proprio meccanismo di keep-alive non riconosciuto dal browser. Per evitare conflitti, utilizza lo script client-side socket.io.slim.js. Come ulteriore vantaggio, lo script include dei polyfill che garantiscono la compatibilità Websocket anche con i browser più datati.) Il modo più semplice per ottenere lo script client-side è scaricarlo da un edge server (CDN) inserendo il seguente snippet nella tua pagina web:

Con questo script in uso, la tua pagina web è pronta per connettersi ai socket gestiti dal tuo server socket.

GESTIONE DEI WEBSOCKET

Parliamo di come configurare un server socket in modalità loopback (ovvero su ws://localhost). È incredibilmente semplice e particolarmente utile per la comunicazione tra processi.

Hai bisogno di Node, ovviamente, e del modulo socket.io (come descritto in precedenza). Dovrai quindi avviare Node e fargli eseguire uno script simile al seguente:

Escludendo i commenti, stiamo parlando di sole 30 righe di codice circa. Concettualmente, quello che accade è che require('http')in modo da poter configurare un'istanza server HTTP fittizia. Successivamente require('socket.io').listen(server) consente al modulo socket.io di aggiornare le richieste HTTP in entrata a connessioni Websocket.

Per impostazione predefinita, le connessioni Websocket abilitano una comunicazione full-duplex, basata su messaggi e punto-a-punto tra le parti connesse. Tuttavia, la modalità punto-a-punto non significa che i messaggi vengano trasmessi automaticamente alle altre connessioni. Per abilitare la trasmissione in broadcast, registriamo un listener di eventi personalizzato, on.('echo') Il listener alla riga 58 re-emette i messaggi "echo" in arrivo su tutte le connessioni socket come nuovo messaggio di tipo 'message'. La regola è quindi la seguente: per la messaggistica punto-punto, utilizzare il tipo di evento 'message'; per fare in modo che il server socket trasmetta il messaggio a tutti i listener, utilizzare il tipo di messaggio 'echo'. (Si tratta di una convenzione nostra, non imposta da socket.io.)

Da notare, infine, che il codice sopra riportato, di per sé, non esegue alcuna operazione, trattandosi di una definizione di classe. Per poterla utilizzare è necessario istanziarla in fase di esecuzione. Questa operazione è però molto semplice. I commenti all'inizio del codice spiegano come utilizzare la classe. Vedremo inoltre come farne uso nei prossimi articoli del blog.

Non perdete i prossimi articoli di questa serie: nel giro di poco tempo eseguiremo transazioni contactless su un gateway attivo, direttamente dal browser e usando JavaScript! Tornate presto a visitarci!