从node.js访问ACS芯片读取器

时间:2018-10-10 10:20:52

标签: node.js usb libusb smartcard-reader node-usb

我正在尝试使用node-usb库从node.js访问ACS芯片读取器(ACR1252)。但是似乎由于没有文档,该库确实是一个使用难题。到目前为止,我已经识别出该设备并连接到接口(仅在Mac,Linux上仍然无法正常工作)。 识别出芯片后,设备将在取出芯片时发出<Buffer 50 03><Buffer 50 02>

但是,当发送命令获取芯片的序列号时,转接调用失败,错误为undefined

到目前为止,这是我的代码:

import usb, { InEndpoint, OutEndpoint } from 'usb';

usb.on('attach', device => {
   device.__open();
   device.__claimInterface(0);

   device.open();

   const ifc = device.interface(0);
   ifc.claim();

   const outEndpoint: OutEndpoint = <OutEndpoint>ifc.endpoints[0];
   const inEndpoint: InEndpoint = <InEndpoint>ifc.endpoints[2];

   inEndpoint.startPoll();
   inEndpoint.on('data', (buffer: Buffer) => {
      console.warn('-- Received data: ', buffer);

      if (buffer.toString('hex') === '5003') {
         console.warn('Chip recognized!');
         outEndpoint.transfer(Buffer.from('FF CA 00 00 00', 'hex'), error => {
            console.warn('transfer error', error);
         });
      }
   });
   inEndpoint.on('error', error => {
      console.warn('error', error);
   });
});

输出日志:

-- Received data:  <Buffer 50 03>
Chip recognized!
transfer error undefined
-- Received data:  <Buffer 50 02>

1 个答案:

答案 0 :(得分:1)

您必须实现CCID协议才能与智能卡读取器进行通信(这不像将APDU发送到USB端点那么简单)。

考虑使用提供node-pcsclite API的PC/SC,这是与智能卡读卡器进行通信的标准方式-您的代码将与已安装驱动程序支持的任何智能卡读卡器一起使用,而您无需实现CCID。

有关示例,请参见Ludovic Rousseau's blog

祝您的项目好运!