使用JavaScript获取完整的信用卡数据

时间:2019-01-25 05:46:50

标签: javascript node.js credit-card magnetic-cards

我一直在尝试从Desko Keyboard上获取信用卡数据,但最终成功了,但问题是我每次刷卡都以不同的方式获取信用卡数据

下面是我的JS代码

var fs = require('Serialport');
function listenDevice() {
  this.port = fs('COM8');
  let dataComplete = '';
  let count = 0;
  this.port.on('open', () => {
    console.log('sp: ' + this.port.path + ' port open event');
    this.port.set({ dtr: true, rts: true }, function (err) {
      if (err) {
        console.log('Set Error: ', err.message);
        this.isServiceError = true;
        this.serviceErrorText = err;
      }
    });
  });

  this.port.on('data', (data) => {
    console.log('sp: Data: ', data.toString('utf-8'));
  });
}

这是我得到的卡数据的模式:

sp:数据:CBZZZZZZZZZZZZZZZZZZ ^ XXXXXXXX sp:数据:XXXX X ^ 18082261485500005000000 !ZZZZZZZZZZZZZZZZZZ sp:数据:= 1808226000005

sp:数据:CBZZZZZZZZZZZZZZZZZZ ^ XXXXXXXX sp:数据:XXXX X ^ 18082261485 sp:数据:500005000000 !ZZZZZZZZZZZZZZZZZZ = 1808226000005

sp:数据:CBZZZZZZZZZZZZZZZZZZ ^ XXXXXXXX sp:数据:XXXX X ^ 18082261485500005000000 !ZZZZZZZZZZZZZZZZZZ = 1808226000005

此处X表示持卡人姓名 Z代表卡号

您可以sp: Data:登录两次或三次,但是卡数据相似。无论数据如何发送,我都希望保留此卡数据。任何想法。

我正在使用串行端口读取数据

1 个答案:

答案 0 :(得分:1)

您不能假设您将在单个data事件中拥有所有数据。您需要缓冲数据,并使用有关协议的已知信息来确定何时拥有足够的数据。

由于您只需要少量数据,因此可以将运行中的数据缓冲区串联在一起是可以接受的。

您将想要执行以下操作:

let buffer;
this.port.on('data', (data) => {
  buffer = Buffer.concat([buffer, data]);
  if (/* your code to determine if you have enough data */) {
    const packet = buffer.slice(0, /* expected length */);
    buffer = buffer.slice(/* expected length*/);
    console.log(packet.toString());
  }
});