技术文章
通过 Websocket 连接 USB 读卡器
您可以借助 Websocket 与 NodeJS,从任意网页浏览器连接到任意 USB 读卡器。这意味着您可以通过虚拟终端完成 EMV 交易。具体方法请见下文!
上次,我介绍了 如何通过 JavaScript 建立 USB 连接 ,所使用的是 NodeJS 和一个名为 node-hid的模块。最终,我们仅用约 75 行代码,就实现了从 JavaScript 以编程方式访问 USB 设备。脚本实现了自动设备检测与连接,并获取到了用于读写 USB 数据的设备句柄。
如果您只需要在 Node 脚本中以编程方式访问 USB 数据,上述方案已经足够。
但如果您想把这些数据传递给另一个进程呢?例如,您想把 USB 数据发送到网页浏览器?或者推送到服务器?
没问题,完全可以做到,而且非常简单!
WEBSOCKET 来救场
Websocket 协议(IETF 规范 此处)是近年来涌现出的最实用的 Web 标准之一。可喜的是,所有现代浏览器都已支持该协议,Node 脚本同样可以使用它。这意味着,只要您建立一条连接两端的 socket,您的 Node 代码就能轻松与浏览器脚本进行通信。
在 Node 端,您需要打开操作系统的控制台,运行 npm install socket.io -g (仅需一次),即可安装这款应用广泛、广受好评的 socket.io 模块。之后,您的脚本即可通过 require("socket.io") 来调用该模块的强大功能。(稍后即将看到。)
在浏览器端,您需要引入 socket.io.slim.js 脚本,以便您的网页能够接收 Websocket 数据。(请勿直接使用浏览器标准的 Websocket API,因为前述 socket.io 模块采用了浏览器并不识别的保活机制。为避免冲突,请使用客户端脚本 socket.io.slim.js。此外,该脚本附带 polyfill,可让旧版浏览器获得 Websocket 兼容性。)获取该客户端脚本最便捷的方式,是通过 CDN 边缘服务器引用——只需在网页中插入以下代码片段:
引入该脚本后,您的网页便已准备就绪,可连接到您自己的 socket 服务器所提供的套接字。
提供 WEBSOCKET 服务
下面我们来谈谈如何在回环模式下(即 ws://localhost)搭建 socket 服务器。这极为简单,对进程间通信也非常实用。
首先,您需要 Node,以及 socket.io 模块(如前所述)。然后启动 Node,运行如下脚本:
撇开注释不算,这里只有约 30 行代码。其大致思路是:我们 require('http')以便建立一个虚拟的 HTTP 服务器实例。随后通过 require('socket.io').listen(server) 让 socket.io 模块将传入的 HTTP 请求升级为 Websocket 连接。
默认情况下,Websocket 连接在通信双方之间实现全双工、基于消息的点对点通信。但"点对点"意味着消息不会自动广播给其他连接。要启用广播,我们需注册自定义事件监听器,即第 58 行的 on.('echo') 监听器。它会将接收到的 "echo" 消息以 'message' 类型重新广播至所有 socket 连接。规则是:进行点对点消息通信时使用 'message' 事件类型;若要让 socket 服务器把消息转发给所有监听者,则使用 'echo' 消息类型。(顺便说一句,这是我们自己的约定,并非 socket.io 强制规定。)
最后需要注意的是,上述代码本身并不会执行任何操作,因为它只是一个类的定义。您必须在运行时实例化该类才能使用,不过这非常简单。代码顶部的注释说明了类的用法。后续博文中我们还会演示如何使用它。
请不要错过本系列接下来的几篇博文——我们很快就会基于真实网关完成非接触式交易,全部在浏览器中通过 JavaScript 实现!敬请期待!
