我有两个运行python代码的Raspberry Pis来检索RFID标签的序列号。一种是带有Wiegand接口的RFID读取器,连接到GPIO引脚,另一种是带有RFID读取器,其行为就像通过USB连接的键盘。然而,当扫描相同的RFID标签时,我从两个阅读器获得不同的数字。
例如,对于一个标签,我从带有Wiegand阅读器的树莓派获得57924897,从带有USB键盘阅读器的树莓派获得0004591983。
有人能解释一下这两者的区别吗?两个读者读的是一样的吗?或者它们只是在读取不同的参数?查看这两个值,似乎没有正确地从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接口的倒转值(逻辑NOT)与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线到达的比特编号。第二行是需要被接收器解释的相同位,其中PE
(b0
)是D23..D12
(b1..b12
)之上的偶数奇偶校验位,PO
(b25
)是D11..D0
(b13..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
如果我们检查校验位PE
和PO
,我们得到:
PE D23........D12
0 0100 0110 0001
包含4个1 (1
),因此满足偶奇偶校验。
D21.........D0 PO
0001 0110 1111 0
包含7个1 (1
),因此满足奇偶校验。
为了从Wiegand读取器获得正确的数字,您要么必须修复从Wiegand接口读取的代码(修复极性,跳过数据值的第一个和最后一个位,并可能检查奇偶校验位)。或者,您可以取当前得到的值,对该值进行反转,并剥离上下位。在C语言中,它看起来像这样:
int unsigned currentWiegandValue = ...;
int unsigned newWiegandValue = ((~currentWiegandValue) >> 1) & 0x0FFFFFF;