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

我正尝试使用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-usb NPM模块。

我已经创build了一个简单的脚本来获取阅读器的USB设备,并听取事件。

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

<Buffer 50 03> 

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

 <Buffer 50 02> 

这表明我至less能够与读者工作的基本沟通。

我现在的问题是我试图获取有关NFC卡的信息,当它与读者联系。 我试图发送数据给读者,但不能得到一致的响应(有时我得到一个缓冲区响应,有时我不,一遍又一遍地运行相同的命令)。

我决定简化我发送的命令,打开和closures读卡器的内部蜂鸣器,所以我查看了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 

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

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

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

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

控制台logging“out transfer”,没有错误,但没有收到“in”端点的内容。

如果我创build一个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设备进行通信,而且我最近的这种types的体验是在当天发送AT命令给调制解调器:)

任何人都可以阐明我在做什么错? 我认为发送64字节而不是6与USB标准需要设置长度或类似的东西有关?!? 有其他人有与Node.js NFC读取器(非HID)沟通的经验吗? 最终,我想要做的就是将一些数据写入NFC标签,并在标签出现后再读回来。

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

我试图增加缓冲区大小1,并通过添加\ 0终止符到缓冲区:

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

但这根本没有任何区别。

谢谢!

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