swg*_*r14 1 tags rfid raspberry-pi wiegand
我有两个运行python代码的Raspberry Pis来检索RFID标签的序列号.其中一个带有Wiegand接口的RFID阅读器连接到GPIO引脚,另一个带有RFID阅读器,其行为类似于通过USB连接的键盘.但是,当扫描相同的RFID标签时,我从两个阅读器获得不同的数字.
例如,对于一个标签,我使用Wiegand读取器从Raspberry Pi获得57924897,使用USB键盘读取器从Raspberry Pi获得0004591983.
sombody可以解释一下这个区别吗?这两位读者都是一样的吗?或者他们只是阅读一些不同的参数?
看看这两个值,您似乎没有正确地读取和转换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)是偶数奇偶校验位over D23..D12(b1..b12),PO(b25)是奇数奇偶校验位over 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),因此甚至可以满足奇偶校验.
D21.........D0 PO
0001 0110 1111 0
包含7个(1),因此满足奇数奇偶校验.
因此,总结以上内容,从Wiegand接口读取的代码无法正确处理Wiegand数据格式.首先,它不修整奇偶校验位,其次,它读取极性错误的位(零是1,1是零).
为了从Wiegand读取器获得正确的数字,您必须修复代码以便从Wiegand接口读取(以修复极性,跳过数据值的第一位和最后一位,并可能检查奇偶校验位).或者,您可以获取当前获得的值,反转该值,并删除低位和高位.在C中,看起来像这样:
int unsigned currentWiegandValue = ...;
int unsigned newWiegandValue = ((~currentWiegandValue) >> 1) & 0x0FFFFFF;