2015-05-29 2 views
0

У меня есть два Python-кода Raspberry Pis для получения серийного номера метки RFID. У одного есть RFID-ридер с интерфейсом Wiegand, подключенным к контактам GPIO, а у другого есть RFID-ридер, который ведет себя как клавиатура, подключенная через USB. Тем не менее, я получаю разные цифры от двух считывателей при сканировании одного и того же тега RFID.Wiegand RFID-считыватель VS USB RFID-считыватель Raspberry PI

Например, для одного тега я получаю 57924897 от малины Pi с помощью считывателя Wiegand и 0004591983 от малины Pi с помощью USB-клавиатуры.

Может ли кто-нибудь объяснить разницу? Оба читателя читают то же самое? Или они просто читают какой-то другой параметр?

+0

Какие «разные» значения вы получаете? –

+0

Wiegand: 57924897 – swg1cor14

+0

USB: 0004591983 – swg1cor14

ответ

5

Рассматривая эти два значения, кажется, что вы неправильно читаете и конвертируете значение из интерфейса Wiegand.

USB-считыватель клавиатуры считывает серийный номер в десятичной десятичной форме. Читатель 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. Вторая линия является одни и те же биты, как они должны быть интерпретированы приемником, где 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. Во-первых, он не обрезает биты четности, а во-вторых, он считывает биты с неправильной полярностью (нули являются единицами, а единицы - нулями).

Для получения правильного номера у читателя Wiegand вам необходимо исправить код для чтения с интерфейса Wiegand (чтобы зафиксировать полярность, пропустить первый и последний бит из значения данных и, возможно, проверьте биты четности). Или вы можете взять значение, которое вы в настоящее время получаете, инвертировать это значение и вырезать нижний и верхний бит. В C это будет выглядеть примерно так:

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

Хорошо полярность Я могу легко исправить. Но что вы хотите урезать биты четности? Нужно ли мне отправлять код того, что я использую, чтобы читать биты? – swg1cor14

+0

@ swg1cor14 См. Мое обновление, для получения более подробной информации о том, как интерпретировать значение. –

Смежные вопросы