Technischer Beitrag
USB-Kartenlesegeräte über Websockets verbinden
Mit Websockets und NodeJS können Sie von jedem Webbrowser aus eine Verbindung zu einem beliebigen USB-Kartenlesegerät herstellen. Das bedeutet, Sie können EMV-Transaktionen über ein virtuelles Terminal durchführen. Wie das funktioniert, erfahren Sie im Folgenden!
Beim letzten Mal habe ich gezeigt, wie man die USB-Konnektivität über JavaScript einrichtet – mithilfe von NodeJS und einem Modul namens node-hid. Das Ergebnis war, dass wir mit nur etwa 75 Codezeilen programmatischen Zugriff auf USB-Geräte aus JavaScript heraus erhalten konnten. Unser Skript realisierte die automatische Geräteerkennung und -verbindung und verschaffte uns ein Geräte-Handle, mit dem USB-Daten gelesen und geschrieben werden können.
Das alles ist vollkommen ausreichend, sofern Sie lediglich programmatischen Zugriff auf USB-Daten innerhalb eines Node-Skripts benötigen.
Aber was, wenn Sie diese Daten an einen anderen Prozess weitergeben möchten? Was, wenn Sie beispielsweise USB-Daten an einen Webbrowser senden oder an einen Server übertragen möchten?
Kein Problem. Das ist möglich – und ganz einfach!
WEBSOCKETS ALS LÖSUNG
Das Websocket-Protokoll (IETF-Spezifikation hier) ist einer der nützlichsten Web-Standards, der seit langer, langer Zeit entwickelt wurde. Erfreulicherweise wird er von allen modernen Browsern unterstützt. Darüber hinaus steht er auch Node-Skripten zur Verfügung – das bedeutet, Ihr Node-Code kann problemlos mit Ihren Browser-Skripten kommunizieren, indem Sie einfach eine Socket-Verbindung erstellen, die beide Welten miteinander verbindet.
Auf der Node-Seite müssen Sie eine Betriebssystem-Konsole öffnen und npm install socket.io -g (einmalig) ausführen, um das weit verbreitete und zu Recht beliebte socket.io -Modul zu installieren. Anschließend können Ihre Skripte require("socket.io") aufrufen, um die beeindruckenden Möglichkeiten dieses Moduls zu nutzen. (Dazu gleich mehr.)
Auf der Browser-Seite müssen Sie auf die socket.io.slim.js Script, damit Ihre Webseite WebSocket-Daten empfangen kann. (Verwenden Sie hierfür nicht die standardmäßige Browser-WebSocket-API, da das oben genannte socket.io-Modul ein eigenes Keep-Alive-Verfahren nutzt, das Ihrem Browser nicht bekannt ist. Um Konflikte zu vermeiden, verwenden Sie das clientseitige Skript socket.io.slim.js. Als zusätzlicher Vorteil enthält das Skript Polyfills, die älteren Browsern WebSocket-Kompatibilität ermöglichen.) Der einfachste Weg, das clientseitige Skript zu beziehen, besteht darin, es von einem Edge-Server (CDN) herunterzuladen, indem Sie den folgenden Code-Ausschnitt in Ihre Webseite einfügen:
Mit diesem Skript ist Ihre Webseite bereit, eine Verbindung zu Sockets herzustellen, die von Ihrem eigenen Socket-Server bereitgestellt werden.
WEBSOCKETS BEREITSTELLEN
Lassen Sie uns besprechen, wie Sie einen Socket-Server im Loopback-Modus einrichten (d. h. unter ws://localhost). Es ist denkbar einfach und äußerst praktisch für die Interprozesskommunikation.
Sie benötigen selbstverständlich Node sowie das socket.io-Modul (wie oben beschrieben). Anschließend müssen Sie Node starten und ein Skript wie das folgende ausführen lassen:
Abgesehen von den Kommentaren umfasst der Code hier lediglich etwa 30 Zeilen. Konzeptionell geschieht Folgendes: Wir require('http')um eine einfache HTTP-Server-Instanz einzurichten. Anschließend require('socket.io').listen(server) damit das socket.io-Modul eingehende HTTP-Anfragen auf WebSocket-Verbindungen upgraden kann.
Standardmäßig ermöglichen WebSocket-Verbindungen eine vollduplexfähige, nachrichtenbasierte Punkt-zu-Punkt-Kommunikation zwischen den verbundenen Parteien. Punkt-zu-Punkt bedeutet jedoch nicht, dass Nachrichten automatisch an andere Verbindungen übertragen werden. Um das Broadcasting zu aktivieren, registrieren wir einen benutzerdefinierten Event-Listener, den on.('echo') Listener in Zeile 58, der eingehende „Echo"-Nachrichten als neue Nachrichten vom Typ „message" an alle Socket-Verbindungen weiterleitet. Die Regel lautet also: Für die Punkt-zu-Punkt-Kommunikation wird der Ereignistyp „message" verwendet; soll der Socket-Server die Nachricht jedoch an alle Listener weitergeben, ist der Nachrichtentyp „echo" zu verwenden. (Dies ist übrigens unsere eigene Konvention und keine Vorgabe von socket.io.)
Abschließend ist zu beachten, dass der obige Code für sich genommen nichts bewirkt, da es sich lediglich um eine Klassendefinition handelt. Um sie nutzen zu können, muss die Klasse zur Laufzeit instanziiert werden. Das ist jedoch denkbar einfach. Die Kommentare am Anfang des Codes erläutern die Verwendung der Klasse. Außerdem wird in den kommenden Blog-Beiträgen gezeigt, wie sie eingesetzt wird.
Verpassen Sie nicht die nächsten Beiträge dieser Serie – wir werden in Kürze kontaktlose Transaktionen über ein Live-Gateway abwickeln, und zwar direkt aus dem Browser heraus mit JavaScript! Schauen Sie bald wieder vorbei!
