ID TECH
Contact
Tous les articles techniques

Article technique

Connecter des lecteurs de carte USB via Websockets

Vous pouvez connecter n'importe quel lecteur de carte USB à n'importe quel navigateur web grâce aux Websockets et à NodeJS. Cela signifie que vous pouvez effectuer des transactions EMV depuis un terminal virtuel. Découvrez comment ci-dessous !

La dernière fois, j'ai montré comment configurer la connectivité USB via JavaScript en utilisant NodeJS et un module appelé node-hid. Le résultat : nous avons pu obtenir un accès programmatique aux périphériques USB, depuis JavaScript, en à peine 75 lignes de code. Notre script a implémenté la détection et la connexion automatiques des appareils, et nous a fourni un handle de périphérique permettant la lecture et l'écriture de données USB.

Tout cela est parfait si vous avez uniquement besoin d'un accès programmatique aux données USB depuis un script Node.

Mais que faire si vous souhaitez transmettre ces données à un autre processus ? Par exemple, si vous voulez envoyer des données USB vers un navigateur web ? Ou les diffuser vers un serveur ?

Aucun problème. C'est tout à fait possible, et c'est simple !

LES WEBSOCKETS À LA RESCOUSSE

Le protocole WebSocket (spécification IETF ici) est l'un des standards Web les plus remarquablement utiles à avoir vu le jour depuis très, très longtemps. Il est heureusement pris en charge par tous les navigateurs modernes, et disponible pour les scripts Node — ce qui signifie que votre code Node peut communiquer très facilement avec vos scripts de navigateur, à condition de créer une connexion socket qui fait le lien entre ces deux environnements.

Côté Node, vous devrez ouvrir une console système et exécuter npm install socket.io -g (une seule fois) pour installer le module très répandu et à juste titre populaire socket.io . Une fois cette étape effectuée, vos scripts pourront appeler require("socket.io") pour tirer parti de la puissance remarquable de ce module (nous y reviendrons dans un instant).

Côté navigateur, vous devez pointer vers le fichier socket.io.slim.js script, afin que votre page web puisse recevoir des données Websocket. (N'essayez pas d'utiliser l'API Websocket standard du navigateur, car le module socket.io mentionné précédemment utilise son propre mécanisme de maintien de connexion qui n'est pas reconnu par votre navigateur. Pour éviter tout conflit, utilisez le script côté client socket.io.slim.js. Avantage supplémentaire : ce script inclut des polyfills qui assurent la compatibilité Websocket avec les navigateurs plus anciens.) La façon la plus simple d'obtenir le script côté client est de le récupérer depuis un serveur de périphérie (CDN) en insérant l'extrait de code suivant dans votre page web :

Une fois ce script en place, votre page web est prête à se connecter aux sockets servis par votre propre serveur de sockets.

MISE EN PLACE DES WEBSOCKETS

Voyons comment configurer un serveur de sockets en mode loopback (c'est-à-dire sur ws://localhost). C'est d'une simplicité déconcertante et d'une grande utilité pour la communication entre processus.

Vous aurez bien entendu besoin de Node, ainsi que du module socket.io (comme indiqué ci-dessus). Il vous suffira ensuite de lancer Node et de lui faire exécuter un script similaire au suivant :

En mettant de côté les commentaires, nous n'avons affaire qu'à une trentaine de lignes de code. Conceptuellement, voici ce qui se passe : nous require('http')afin de pouvoir créer une instance de serveur HTTP factice. Puis nous require('socket.io').listen(server) pour que le module socket.io puisse mettre à niveau les requêtes HTTP entrantes en connexions Websocket.

Par défaut, les connexions Websocket permettent une communication bidirectionnelle simultanée, basée sur des messages et point à point entre les parties connectées. Cependant, la communication point à point ne signifie pas que les messages sont automatiquement diffusés aux autres connexions. Pour activer la diffusion, nous enregistrons un écouteur d'événements personnalisé, le on.('echo') un écouteur à la ligne 58, qui réémet les messages « echo » entrants vers toutes les connexions socket, sous la forme d'un nouveau message de type « message ». La règle est donc la suivante : pour effectuer une messagerie point à point, utilisez le type d'événement « message » ; en revanche, pour que le serveur socket transmette votre message à tous les écouteurs, utilisez le type de message « echo ». (Il s'agit de notre propre convention, et non d'une contrainte imposée par socket.io.)

Dernière remarque importante : le code ci-dessus, tel quel, ne fait rien, car il s'agit d'une définition de classe. Vous devez instancier la classe au moment de l'exécution pour pouvoir l'utiliser. Mais c'est très simple. Les commentaires en haut du code expliquent comment utiliser la classe. De plus, nous verrons comment l'utiliser dans les prochains articles de blog.

Ne manquez pas les prochains articles de cette série, car nous allons très bientôt effectuer des transactions sans contact auprès d'une passerelle en production — le tout depuis le navigateur, en JavaScript ! Revenez nous voir prochainement !