ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Collegare lettori di schede USB tramite Websocket

È possibile collegare qualsiasi lettore di schede USB a qualsiasi browser web utilizzando Websocket e NodeJS, il che consente di eseguire transazioni EMV da un terminale virtuale. Scopri come fare di seguito.

In precedenza, ho mostrato come configurare la connettività USB tramite JavaScript utilizzando NodeJS e un modulo chiamato node-hid. Il risultato è stato che siamo riusciti ad 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 leggere e scrivere dati USB.

Tutto ciò va benissimo, se l'unica cosa di cui si ha bisogno è l'accesso programmatico ai dati USB dall'interno di uno script Node.

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

Nessun problema. Si può fare. È semplice!

I Websocket 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. Ed è implementato con successo 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, è 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 popolare. Dopo l'installazione, gli script potranno richiamare require("socket.io") per sfruttare tutta la potenza di quel modulo. (Tra poco vedremo di più in proposito.)

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 l'API Websocket standard del browser, poiché il modulo socket.io citato in precedenza adotta un proprio meccanismo di keep-alive non riconosciuto dal browser. Per evitare conflitti, utilizza lo script lato client socket.io.slim.js. Come ulteriore vantaggio, lo script include dei polyfill che garantiscono la compatibilità Websocket anche ai browser meno recenti.) Il modo più semplice per ottenere lo script lato client è 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 serviti dal tuo server socket.

Gestione dei Websocket

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

Occorre ovviamente Node e il modulo socket.io (come descritto in precedenza). Sarà poi necessario avviare Node e fargli eseguire uno script simile al seguente:

Tralasciando i commenti, stiamo esaminando circa 30 righe di codice. Dal punto di vista concettuale, quello che accade è che require('http')viene utilizzato per configurare un'istanza di server HTTP fittizio. 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 la comunicazione full-duplex, basata su messaggi e punto-punto tra le parti connesse. Tuttavia, la modalità punto-punto non implica che i messaggi vengano automaticamente trasmessi alle altre connessioni. Per abilitare la trasmissione broadcast, registriamo un listener di eventi personalizzato, on.('echo') Il listener alla riga 58 ri-emette i messaggi "echo" in ingresso su tutte le connessioni socket, come nuovo messaggio di tipo 'message'. La regola è quindi la seguente: per la messaggistica punto-a-punto si utilizza il tipo di evento 'message', mentre per fare in modo che il server socket trasmetta il messaggio a tutti i listener si usa il tipo 'echo'. (Si tratta di una convenzione interna, non di qualcosa imposto da socket.io.)

L'ultimo aspetto da sottolineare è che il codice sopra riportato, di per sé, non esegue alcuna operazione, in quanto si tratta di una definizione di classe. Per poterla utilizzare è necessario istanziarla in fase di esecuzione. L'operazione è tuttavia molto semplice: i commenti all'inizio del codice spiegano come utilizzare la classe. Vedremo inoltre come impiegarla nei prossimi articoli del blog.

Non perdere i prossimi articoli di questa serie: nel giro di poco tempo effettueremo transazioni contactless su un gateway attivo, tutto dal browser e in JavaScript! Torna a trovarci presto!