查看这两个值,您似乎没有正确读取和转换来自 Wiegand 接口的值。
USB 键盘阅读器以 10 位十进制形式读取序列号。韦根阅读器通常将序列号转换为 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
因此,来自韦根接口的反转值(逻辑非)与 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
第一行是通过韦根线到达时编号的位。第二行是接收器需要解释的相同位,其中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
),因此满足偶校验。
D21.........D0 PO
0001 0110 1111 0
包含 7 个 ( 1
),因此满足奇校验。
因此,综上所述,您从 Wiegand 接口读取的代码无法正确处理 Wiegand 数据格式。首先,它不修剪奇偶校验位,其次,它读取极性错误的位(零是一,一是零)。
为了从韦根阅读器获得正确的数字,您要么必须修复从韦根接口读取的代码(修复极性,跳过数据值的第一个和最后一个位,并可能检查奇偶校验位)。或者你可以取你当前得到的值,反转那个值,然后去掉低位和高位。在 C 中,这看起来像这样:
int unsigned currentWiegandValue = ...;
int unsigned newWiegandValue = ((~currentWiegandValue) >> 1) & 0x0FFFFFF;