node.js - 通过 Node.js 与 ACR1252U NFC 读卡器对话

标签 node.js nfc smartcard-reader pcsc node-usb

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

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

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

<Buffer 50 03>

当 NFC 卡从读取中取出时,我收到一个缓冲区:

<Buffer 50 02>

这表明我至少能够与读者进行一些基本的沟通。

我现在的问题是,当 NFC 卡与读卡器接触时,我试图获取有关该卡的信息。我尝试向读取器发送数据,但无法获得一致的响应(有时我得到缓冲区响应,有时却没有,一遍又一遍地运行相同的命令)。

我决定简化我发送的命令,仅打开和关闭阅读器的内部蜂鸣器,因此我查看了 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);
});

控制台记录“输出传输”,没有错误,但没有从“输入”端点接收到任何内容。

如果我创建一个 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 标准需要设定长度或类似的东西有关?!?还有其他人有过使用 Node.js 与 NFC 读取器(非 HID)通信的经验吗?最终,我想做的就是能够将一些数据写入 NFC 标签,并在标 checkout 现时将其读回。

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

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

buf.write('\0', 6, 'utf-8');

但这根本没有任何区别。

谢谢!

最佳答案

API 规范中描述的命令是通过 PC/SC 与阅读器交换的(伪)APDU 命令。当您直接通过 USB 访问读取器而不使用 PS/SC 抽象层(请参阅 http://www.pcscworkgroup.com/specifications/overview.php )时,您必须自己实现该抽象。因此,你必须自己实现USB CCID(芯片卡接口(interface)设备)类接口(interface)。本质上,这意味着您必须将 APDU 命令封装在 CCID 协议(protocol)中。您可以在此处找到规范:http://www.usb.org/developers/docs/devclass_docs/

关于node.js - 通过 Node.js 与 ACR1252U NFC 读卡器对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551646/

相关文章:

javascript - 如何在循环中同步遍历 Promise 对象引用链

node.js - NPM 和 NVM 的区别

c++ - 当我向智能卡发送命令时,6E 00 是什么意思

android - Android 5.0(和其他)上的设备所有者没有 root 设备,通过 NFC 进行设备配置

android - HCE 服务和 BIND_NFC_SERVICE 权限

macos - MacOSX 上的智能卡 PKCS#11 支持

java - 读取 Visa emv 卡时总是得到 6a82 和 6d00

javascript - 向 Node Webshot 生成的 PDF 添加标题

apache - 我可以用 Node.js 替换 Apache 吗?

iphone - 外部 RFID/NFC 读取器可以检测到 iPhone 6 吗?