技术文章
通过 Google Chrome 使用 RS-232 与刷卡器通信
ID TECH 刷卡器的一大优点在于,与其通信简直轻而易举。例如您是否知道,可以通过 Google Chrome 浏览器与我们大多数支付外设进行通信?接下来我们就聊聊具体如何操作,因为仅用 JavaScript 和 HTML 就能与串口和/或 USB 设备通信,实在是非常方便。
本文将重点介绍 ID TECH 符合 SRED 规范的 RS-232 版本 SecuRED 刷卡器 (如下图所示)。这款全程加密磁条刷卡器(MSR)可通过 USB-HID、USB-KB 或 RS-232 进行通信。在后续文章中,我们将深入探讨如何在 Chrome 中通过 USB-HID 连接 ID TECH 刷卡器。今天我们重点关注 RS-232——它比 USB 稍微简单一些,同时也会展示许多我们日后用于 USB-HID 通信的技术。
如果您要说"可是我的电脑根本就 没有 RS-232 端口",别担心。您可以使用串口转 USB 适配线(由 Prolific 或其他厂商提供)将串口设备连接到电脑。即使数据是通过 USB 端口传入的,串口数据 看起来 仍然是串口数据。
Google 的 Chrome 浏览器通过 chrome.serial.* API提供 RS-232 连接能力,但请特别注意,该 API 普通网页是无法使用的。要使用 serial API,您必须实现一个 Chrome 应用 ,并通过 Chrome 扩展程序机制安装该应用(这一点其实并不难)。下面我们来看一下具体涉及哪些内容。
要创建一个 Chrome 应用,只需在一个文件夹中放入约六个小文件即可。本文示例的完整应用(已构建完成,包含所需的 6 个小文件)可在此处下载:
将 Zip 文件下载到本地驱动器,并解压到独立文件夹中。其中应包含以下文件:
关于如何将该应用作为 Chrome 扩展程序进行 安装 ,稍后再谈。现在,让我们先快速浏览一下构成此应用的各个文件。
该 background.js 文件是一个文本文件,内容如下:
该文件告诉 Chrome 应使用名为 window.html 的文件来创建应用的主窗口(宽 390 像素,高 438 像素)。
接下来的两个文件只是小型 PNG 图标。
该 manifest.json 文件是一个文本文件,内容如下:
manifest 是一个重要文件,因为 Chrome 应用运行在独特的安全环境中,例如必须事先明确指定权限。manifest 告诉 Chrome 应用需要哪些权限、应关联哪些图标,以及其他关键信息。
该 script.js 文件(将从 window.html中引用)包含驱动本应用运行的所有 JavaScript 代码。其代码如下:
好吧,它可能 看起来 不像一个小文件,但实际上,我们说的代码不到 200 行,(总体而言)这其实是相当少的代码量。
最后是 window.html,该文件包含我们应用的 HTML 标记(即应用的用户界面)。其内容如下:
请注意,页面中没有任何内联 JavaScript。应用 100% 的逻辑都在外部文件中(即 script.js 文件)。这使得程序逻辑与展示标记得以非常清晰地分离,从而极大地方便了代码维护和调试。
与其逐行讲解代码(其实代码本身已相当不言自明),不如来谈谈如何安装和运行它。
如果尚未打开 Chrome 浏览器,请先启动它,然后访问您的 chrome://extensions 页面。在右上角找到并勾选 开发者模式复选框。如下所示。
当您勾选开发者模式复选框后(且仅在勾选后), 加载已解压的扩展程序… 按钮(位于左侧)才会出现。点击该按钮,浏览到包含您那 6 个小文件的文件夹,将其指定为目标文件夹,然后点击 确定。您将返回到 chrome://extensions 页面,该应用将出现在可用扩展程序列表中。找到该应用并点击与之关联的 启动 链接(请仔细查看上方截图)。应用的主窗口将随即弹出:
如果您已经将 SecuRED 读卡器(或其他串口设备!)连接到 COM3 端口,窗口看起来就会是这个样子。请注意, script.js 中的 JavaScript(见上文)是硬编码使用"COM3"作为端口名的。如果您的电脑使用的是其他串口,请手动修改代码以使用正确的名称。(在 Windows 中可通过"设备和打印机"查看;在 Linux 中,您的串口名称可能类似于 /dev/tty0 或 /dev/ttyUSB0 或 /dev/tty1。)顺便说一句,只要安装了 Chrome,该扩展程序就可以在 Windows、Linux、Mac OS X 或 ChromeOS 中运行。
如果您已成功连接串口设备,且该设备恰好是 ID TECH 的 SecuRED 读卡器,那么请刷一张信用卡通过卡槽。卡片数据会自动显示在应用窗口顶部的文本区域中(请留意下方截图中的十六进制值):
当然,要懂得如何解析这些数据,需要了解 ID TECH 的增强加密 MSR 格式。(同样地, 解密数据需要您理解 DUKPT、密钥派生、AES 和/或 TDES。)我们将在后续文章中讨论这些内容。目前,只需了解串口测试工具能让您即时、自动地从 Google Chrome 中捕获信用卡数据,并可在任何运行 Google Chrome 的平台上使用。而且您还可以使用 Chrome 强大的内置调试工具来调试您的代码——这些代码就是普通的 JavaScript。
如果您逐行查看代码,会发现(在代码最底部)为了接收串口数据,我们向 chrome.serial.onReceive.addListener() 传入了一个接收回调函数。该 receive() 函数又会调用 collect() 函数,将接收到的字节累积到缓冲区中。在经过 500 毫秒的 WAIT_TIME 后,缓冲区会以文本形式写入应用界面。也就是说,当读卡器有数据传入应用时,我们会启动一个计时器,将分小批次(间隔几毫秒)到达的数据累积到缓冲区中,待计时器超时(500 毫秒后)再将缓冲区数据刷新到屏幕上(如果数据仍在传入,则重新开始缓冲过程)。这样可以在显示之前批量积累合理数量的数据。(否则,我们可能就要每隔几毫秒在屏幕上写出大量极短的数据包。)
该应用中可能不那么显而易见的另外几个部分是:Send 和 Clear 按钮上方的小"命令窗口"(见上方截图),以及下拉菜单("Select a command and hit Send")。Send 按钮上方的小文本区域用于手动输入目标设备(此例中为 ID TECH 的 SecuRED)能够识别响应的特定固件命令。下拉菜单中包含若干已预加载的命令(例如 02 53 11 01 33 03 71,可让 SecuRED 蜂鸣一次),可直接使用。如果您恰好知道其他十六进制命令(例如手头有该设备的文档),可以输入命令来控制或配置该设备。
即使您不使用专属于 SecuRED 的下拉菜单控件,串口测试工具仍是从 Chrome 浏览器中嗅探任何串口连接的便捷工具。无论数据是否来自 ID TECH 读卡器,它都会显示所有经过串口的数据。
希望您喜欢这个项目。在接下来的文章中,我们将探讨如何使用 Chrome 的连接 API 与 USB-HID 设备进行通信。这绝对是值得掌握的本领!
