我正在尝试与ACR1252U NFC读卡器通信(http://www.acs.com.hk/en/products/342/acr1252u-usb-nfc-reader-iii-nfc-forum-certified-reader/)使用Node.js和https://github.com/nonolith/node-usbNPM模块。
我创建了一个简单的脚本来获取读取器USB设备并监听事件。
当NFC卡与读取器接触时,我会收到一个缓冲区:
<Buffer 50 03>
当NFC卡从读取中取出时,我收到一个缓冲区:
<Buffer 50 02>
这表明我至少能够与正在工作的读者进行一些基本的交流。
我现在的问题是,当NFC卡与读卡器接触时,我试图获取有关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模块的输出端点发送数据:
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标签,并在标签出现时将其读回。
我原以为这是一个非常简单的过程,但我被难住了!也许我应该对数据进行不同的编码?也许我没有正确地终止数据?我就是不知道!
我尝试将缓冲区大小增加1,并通过向缓冲区添加\0终止符
buf.write(' ', 6, 'utf-8');
但这并没有什么区别。
谢谢!
API规范中描述的命令是通过PC/SC与读卡器交换的(伪)APDU命令。当您在没有PS/SC抽象层的情况下直接通过USB访问读卡器时(请参阅http://www.pcscworkgroup.com/specifications/overview.php),您必须自己实现该抽象。因此,您必须自己实现USB CCID(芯片卡接口设备)类接口。从本质上讲,这意味着您必须将APDU命令封装在CCID协议中。您可以在此处填写规格:http://www.usb.org/developers/docs/devclass_docs/