韦根 RFID reader VS USB RFID reader Raspberry PI

Wiegand RFID reader VS USB RFID reader Raspberry PI

我有两个 Raspberry Pis 运行 python 代码来检索 RFID 标签的序列号。一个有一个 RFID reader,带有连接到 GPIO 引脚的 Wiegand 接口,另一个有一个 RFID reader,其行为类似于通过 USB 连接的键盘。但是,当扫描同一个 RFID 标签时,我从两个 reader 中得到不同的数字。

例如,对于一个标签,我使用 Wiegand reader 从 Raspberry Pi 获得 57924897,使用 USB 键盘 reader 从 Raspberry Pi 获得 0004591983。

谁能解释一下区别?两个 reader 的读数相同吗?或者他们只是在读取一些不同的参数?

看这两个值,你似乎没有正确地从韦根接口读取和转换值。

USB 键盘reader 以十进制形式读取序列号。 Wiegand reader 通常将序列号转换为 26 位值(1 位奇偶校验位 + 8 位站点代码 + 16 位标签 ID + 1 位奇偶校验位)。

那么让我们看看您得到的两个值:

+--------------+------------+-------------+-----------------------------------------+
| READER       | DECIMAL    | HEXADECIMAL | BINARY                                  |
+--------------+------------+-------------+-----------------------------------------+
| USB keyboard | 0004591983 | 0046116F    | 0000 0000 0100 0110 0001 0001 0110 1111 |
| Wiegand      |   57924897 | 373DD21     | 1 1011 1001 1110 1110 1001 0000 1       |
+--------------+------------+-------------+-----------------------------------------+

当您仔细查看这两个值的二进制表示时,您会发现它们相互关联:

USB keyboard: 0000 0000 0100 0110 0001 0001 0110 1111
Wiegand:              1 1011 1001 1110 1110 1001 0000 1

所以看起来韦根值与从USB键盘获得的反转值匹配reader:

USB keyboard: 0000 0000 0100 0110 0001 0001 0110 1111
NOT(Wiegand):         0 0100 0110 0001 0001 0110 1111 0

因此来自 Wiegand 接口的反转值(逻辑 NOT)与 USB 读取的值匹配 reader。

接下来,让我们看看两个校验位。 Wiegand 接口上的数据通常如下所示:

b0  b1  b2  b3  b4  b5  b6  b7  b8  b9  b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21 b22 b23 b24 b25
PE  D23 D22 D21 D20 D19 D18 D17 D16 D15 D14 D13 D12 D11 D10 D9  D8  D7  D6  D5  D4  D3  D2  D1  D0  PO

第一行是通过韦根线到达时编号的位。第二行是接收方需要解释的相同位,其中 PE (b0) 是 D23..D12 (b1..b12) 上的偶校验位,POb25)是D11..D0b13..b24)的奇校验位,D23..D0是表示无符号整数的数据位。

所以看看你的号码,你会收到:

PE  D23 D22 D21 D20 D19 D18 D17 D16 D15 D14 D13 D12 D11 D10 D9  D8  D7  D6  D5  D4  D3  D2  D1  D0  PO
0   0   1   0   0   0   1   1   0   0   0   0   1   0   0   0   1   0   1   1   0   1   1   1   1   0

如果我们检查奇偶校验位 PEPO,我们得到:

PE D23........D12
0  0100 0110 0001

包含 4 个 1 (1),因此满足偶校验。

D21.........D0 PO
0001 0110 1111 0

包含 7 个 1 (1),因此满足奇校验。

因此,综上所述,您从 Wiegand 接口读取的代码没有正确处理 Wiegand 数据格式。首先,它不 trim 奇偶校验位,其次,它读取极性错误的位(0 是 1,1 是 0)。

为了从 Wiegand reader 获得正确的数字,您要么必须修复从 Wiegand 接口读取的代码(修复极性,跳过数据的第一位和最后一位值,并可能检查奇偶校验位)。或者您可以采用当前获得的值,反转该值,并去除低位和高位。在 C 中,它看起来像这样:

int unsigned currentWiegandValue = ...;
int unsigned newWiegandValue = ((~currentWiegandValue) >> 1) & 0x0FFFFFF;