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

时间:2015-11-05 18:02:07

标签: 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/ NPM模块与ACR1252U NFC读卡器(https://github.com/nonolith/node-usb)进行通信。

我创建了一个简单的脚本来获取读卡器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);
});

控制台记录“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标准有什么关系?!?有没有其他人有过使用Node.js与NFC阅读器(非HID)通信的经验?最终,我想做的就是能够将一些数据写入NFC标签,并在标签出现时稍后再读取。

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

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

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

但这根本没有任何区别。

谢谢!

1 个答案:

答案 0 :(得分:2)

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