Wiegand RFID读卡器与USB RFID读卡器树莓派的比较

3
我有两个树莓派运行Python代码以检索RFID标签的序列号。一个具有连接到GPIO引脚的Wiegand接口的RFID读取器,另一个具有行为类似于连接到USB的键盘的RFID读取器。然而,当扫描相同的RFID标签时,我从两个读取器中得到不同的数字。
例如,对于一个标签,我从具有Wiegand读取器的树莓派得到57924897,而从具有USB键盘读取器的树莓派得到0004591983。
有人能解释一下这种差异吗?这两个读取器都在读取相同的内容吗?还是它们只是读取了一些不同的参数?

你得到了哪些“不同”的值? - undefined
1个回答

10

从这两个值来看,似乎您没有正确地读取和转换Wiegand接口的值。

USB键盘读卡器以10位十进制形式读取序列号。Wiegand读卡器通常将序列号截断为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

看起来Wiegand值与从USB键盘读取器获得的反转值匹配:
USB keyboard: 0000 0000 0100 0110 0001 0001 0110 1111
NOT(Wiegand):         0 0100 0110 0001 0001 0110 1111 0

因此,Wiegand接口的反转值(逻辑非)与USB读取器读取的值相匹配。

接下来,让我们看一下两个奇偶校验位。通过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

第一行代表Wiegand线路上到达的位数。第二行是接收方需要解释的相同位,其中PEb0)是D23..D12b1..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,因此满足奇偶校验。

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

为了从 Wiegand 读卡器获取正确的数字,您必须修复从 Wiegand 接口读取数据的代码(以修复极性、跳过数据值的第一个和最后一个位,并可能检查奇偶校验位)。或者,您可以接受当前获得的值,反转该值,并剥离下限和上限位。在 C 中,这看起来像这样:

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

好的,极性我能轻松解决。但是你所说的去掉奇偶校验位是什么意思?我需要贴出用来读取位的代码吗? - undefined
@swg1cor14 请查看我的更新,以获取有关如何解释该值的更多详细信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接