通过 Node.js 与 ACR1252U NFC 卡通话 Reader

Talking to ACR1252U NFC Card Reader via Node.js

我正在尝试与 ACR1252U NFC 卡通信reader(http://www.acs.com.hk/en/products/342/acr1252u-usb-nfc-reader-iii-nfc-forum-certified-reader/) using Node.js and the https://github.com/nonolith/node-usb NPM 模块。

我创建了一个简单的脚本来获取 reader USB 设备并监听事件。

当 NFC 卡与 reader 接触时,我收到一个缓冲区:

<Buffer 50 03>

当NFC卡被取走读取时我收到一个缓冲区:

<Buffer 50 02>

这表明我至少能够与 reader 工作人员进行一些基本的沟通。

我现在的问题是,当 NFC 卡与 reader 接触时,我试图获取有关 NFC 卡的信息。我试图将数据发送到 reader 但无法获得一致的响应(有时我会收到缓冲区响应,有时我不会,运行 一遍又一遍地执行相同的命令)。

我决定简化我发送的命令,只打开和关闭 reader 的内部蜂鸣器,所以我查看了 API 文档 (http://www.acs.com.hk/download-manual/6402/API-ACR1252U-A1-1.07.pdf),上面写着激活您发送的蜂鸣器:

E0h 00h 00h 28h 01h + 1 byte to determine duration of buzzer activation

考虑到这一点,我创建了一个缓冲区:

var buf = new Buffer(6);
buf.write('e00000280108', 'hex');

然后使用USB模块的out端点发送数据:

outEndpoint.transfer(buf, function (err) {
    console.log('out transfer', err);
});

控制台记录 "out transfer" 没有错误,但未从 "in" 端点接收到任何内容。

如果我改为创建 64 字节缓冲区:

var buf = new Buffer(64);
buf.write('e00000280108', 'hex');

outEndpoint.transfer(buf, function (err) {
    console.log('out transfer', err);
});

我收到来自 "in" 端点的响应:

<Buffer e0 00 00 00 00 01 00 42 ff 00>

这似乎与手册中的预期不符,根本没有激活蜂鸣器。

我对像这样直接与 USB 设备通信还很陌生,我最近一次使用这种类型是在当天向调制解调器发送 AT 命令:)

任何人都可以阐明我做错了什么吗?我认为发送 64 个字节而不是 6 个字节与需要设定长度或类似内容的 USB 标准有关?!?有没有其他人有过使用 NFC reader(非 HID)与 Node.js 通信的经验?最终我想要做的就是能够将一些数据写入 NFC 标签,并在标签出现时读回。

我认为这将是一个非常简单的过程,但我很难过!也许我应该对数据进行不同的编码?也许我没有正确终止数据?我只是不知道!

我尝试将缓冲区大小增加 1,并通过以下方式向缓冲区添加 \0 终止符:

buf.write('[=19=]', 6, 'utf-8');

但这根本没有任何区别。

谢谢!

API 规范中描述的命令是(伪)APDU 命令,通过 PC/SC 与 reader 交换。当您在没有 PS/SC 抽象层的情况下直接通过 USB 访问 reader 时(参见 http://www.pcscworkgroup.com/specifications/overview.php), you have to implement that abstraction yourself. Therefore, you have to implement the USB CCID (chip card interface device) class interface yourself. Essentially, this means that you have to encapsulate APDU commands in the CCID protocol. You can fin the specification here: http://www.usb.org/developers/docs/devclass_docs/