NodeJS 和串口——读取 RFID 卡

NodeJS and Serialport – Read RFID Card

我想用 NodeJS 读取 RFID 卡。我有一个基本的 RFID-Reader(真的不知道型号),通过 USB 连接到我的电脑。

我尝试使用以下代码使用 NPM 包“serialport”读取串行数据:

var SerialPort = require('serialport');
var Readline = require('@serialport/parser-readline');
var port = new SerialPort('/dev/cu.usbserial-0001', { baudRate: 9600, parser: new Readline() });

port.on('data', (data) => {
    var serialData = data.toString('hex');
    console.log(data);
});

我启动程序,当我将卡片悬停在 reader 上时,我得到了这样的结果(只要我在 reader 上有卡片,它就会变化得非常快):

0
1818
18
18
98
98
e0
98
f898
e6
18
7e
7e
18
f8
00
18
1818
18
98
98
e0
98f898e6
187e
7e
18
f8
00
18
18
18
18
98
98e0
98
f898
e618
7e7e
18
f8
...
...
...

替代方案我尝试用这样的红线解析数据:

const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const port = new SerialPort('/dev/tty.usbserial-0001', {baudRate: 9600});

const parser = port.pipe(new Readline())
parser.on('data', (data) => console.log(data))

但不幸的是我没有得到关于这个的输出。

预期的输出是,我得到了 RFID 卡 ID,我可以在我的程序的其余部分中使用它。以前存储在数据库中的 ID 格式如下:“MT_0E00635C65”,打印在卡上的 ID 例如:“0015642441 241,48265”。我想在旧程序(读取卡片)中,开发人员使用了这样的东西:

   private char[]const HexpartsReadline = new char[16] {
        '0',
        '1',
        '2',
        '3',
        '4',
        '5',
        '6',
        '7',
        '8',
        '9',
        'A',
        'B',
        'C',
        'D',
        'E',
        'F'

        string text = RFID_Port.ReadLine ();
        if (textparser.Length == 10) {
            string text2 = "";
            string text3 = text;
            foreach (char c in text3) {
                text2 += Hexparts [on(byte)c - 48];
            }
            LastKart = text2;
            LastKartView ='data', DateTimeconsole.Now;
        }
    }
    };

这是我第一次使用 RFID 卡,所以有点难以理解。你能帮助我如何达到我想要的结果吗?

谢谢。

//更新

我想出了一个模式,我检查了多张卡片,开头总是一样的,看起来像这样(删除了空格)

Card 1:
00
18181818
9898e098
7ee01898f8 #this line changes
18
f8

Card 2:
00
18181818
9898e098
f898e6187e7e
18
f8

Card3:
00
18181818
9898e098
f898187efe
18
f8

//更新 仍然没有想出如何解决这个问题,有人有想法吗?

我使用这段代码得到了想要的结果:

var SerialPort = require('serialport');

var sp = new SerialPort('/dev/tty.usbserial-0001', {
    baudRate: 4800,
});

let package = '';
const Hexparts = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];

sp.on('data', (data) => {
    const stringData = data.toString().trim();

    if (stringData) {
        package += stringData;
        if (package.length == 10) {
            let text2 = '';
            let text3 = package;
            for (const c of text3) {
                text2 += Hexparts[c.charCodeAt(0) - 48];
            }
            const RFID_Data = text2;
            console.log(RFID_Data);
        }
    } else {
        package = '';
    }
});

这取决于 RFID reader,提供给您的数据。 一些 readers 有一个特殊的命令来查询 CardID。 其他人将 CardID 与所有其他数据一起输出,通常 CardID 在末尾或开头。 ID 的长度也与卡上的 RFID 芯片不同。对于 Mifare,这些通常有 6-8 个字节长。