Software Serial и чтение множества меток сразу с UHF Rfid Reader

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

Доброе утро, товарищи.  Сразу к делу. Постараюсь описать как можно понятнее. Есть: Arduino UNO и считыватель rfid дальнего действия с возможностью одновременного считывания до 64 меток.

К считывателю идет ПО, китайское, в котором можно настроить практически все: мощность, выбор антенн (из четырех), типы (Wiegand26\34,rs232,rs485 и тд),длину "какбэ паузы между сканированиями", когда карта приложена и интервал повторного считывания карты с тем же ID. Вообщем, вот эти 2 параметра, особенно "пауза" очень важна. Объясню почему, но сначала простой код, который успешно считывает данные с софтверного сериал порта:

01#include <SoftwareSerial.h>
02 
03SoftwareSerial mySerial(2, 3);
04int c = 0;
05void setup()
06{
07  Serial.begin(9600);
08  Serial.println("serial activated");
09  mySerial.begin(9600);
10 
11}
12 
13void loop()
14{
15 
16  if (mySerial.available())
17  {
18    c++;
19    byte data = mySerial.read();
20     Serial.print(data);
21     Serial.print(" ");
22  }
23}

 Можно выводить Serial.print(data,HEX);Serial.print(data,BIN); - не важно

Так вот в чем вся соль:

Учитывая то, что карт в диапазоне считывания может быть несколько, соответственно длина считывания за раз байт будет разная. ПРИНТ выводит вот это:
Если в мульти режиме сканить по одной карте
 

01карты в комплекте
0270 0 119 179 227 253 59 255 211 215 207 255 141 213 31  19  187 125
0370 0 119 179 227 253 59 255 211 215 207 255 55  213 31  19  105 39
0470 0 119 179 227 253 59 255 209 219 223 253 17  221 255 173 130 8
0570 0 119 179 227 253 59 255 209 219 223 253 59  221 255 171 112 44
06 
07наклейки покупные
0870 0 119 179 227 253 59 255 209 249 238 151 215 191 233 39  28
0970 0 119 179 227 253 59 255 209 249 238 153 215 191 233 43  1
1070 0 119 179 227 253 59 255 209 249 238 205 215 191 233 157 15
1170 0 119 179 227 253 59 255 209 249 238 149 215 191 233 149 6

Если поднести несколько, то:

70 0 119 179 190 188 59 255 209 249 238 205 215 191 233 157 175 59 255 209 249 238 149 215 191 233 149 70 59 255 209 249 238 151 215 191 233 39 28 127 135 255 209 249 238 153 215 191 233 43 209 59 255 211 215 207 255 55 213 31 19 105 39 127 135 255 209 219 223 253 17 221 255 173 130 8

ИЛИ

70 0 119 179 223 253 59 255 209 249 238 205 215 191 233 157 175 59 255 209 249 238 153 215 191 233 43 209 59 255 209 249 238 149 215 191 233 149 70 59 255 209 249 238 151 215 191 233 39 28

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

Спасибо!

sadman41
Offline
Зарегистрирован: 19.10.2016

Девайс бы показали свой - может быстрее мысли у народа появятся. Какая модель или чип в нем который стоит...

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

sadman41 пишет:

Девайс бы показали свой - может быстрее мысли у народа появятся. Какая модель или чип в нем который стоит...

Да, это нонейм с алиэкспресса, не знаю на каком чипе((

https://ru.aliexpress.com/item/High-Quality-860-960Mhz-ISO18000-6C-UHF-Reader-RFID/1291125670.html?spm=a2g0s.9042311.0.0.ahlA0x

sadman41
Offline
Зарегистрирован: 19.10.2016

Черт его знает...

Давайте по сто карт сразу не подносить, а на двух разобраться: два одиночных считывания и одно групповое. Иначе вообще непонятно как этот поток делить на части.

GarryC
Offline
Зарегистрирован: 08.08.2016

Вроде так, не ?

70 0 119 179 190 188 59 255 209 249 238 205 215 191 233 157 175 59 255 209 249 238 149 215 191 233 149 70 59 255 209 249 238 151 215 191 233 39 28 127 135 255 209 249 238 153 215 191 233 43 209 59 255 211 215 207 255 55 213 31 19 105 39 127 135 255 209 219 223 253 17 221 255 173 130 8

И вторая секция

70 0 119 179 223 253 59 255 209 249 238 205 215 191 233 157 175 59 255 209 249 238 153 215 191 233 43 209 59 255 209 249 238 149 215 191 233 149 70 59 255 209 249 238 151 215 191 233 39 28

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

sadman41 пишет:

Черт его знает...

Давайте по сто карт сразу не подносить, а на двух разобраться: два одиночных считывания и одно групповое. Иначе вообще непонятно как этот поток делить на части.


Вся соль в том, что метки(люди с метками) будут проходить каждый раз разным количеством в дверной проход. не сто человек. но 1-5 за раз. поэтому,
В примере я как раз и прислал: одиночные вверху. и длинная строка с групповым.
Тут ещё проблема:считывание происходит с неким импульсом перед следующим(я могу длину этого импульса задать) нужно ещё отловить поттаймеру или по прерыванию(не знаю как правильно сказать) следующее считывание ли это, иначе в. сериал, если карта застряла в проходе, продолжают писаться данные. понятно сказал?

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

GarryC пишет:

Вроде так, не ?

70 0 119 179 190 188 59 255 209 249 238 205 215 191 233 157 175 59 255 209 249 238 149 215 191 233 149 70 59 255 209 249 238 151 215 191 233 39 28 127 135 255 209 249 238 153 215 191 233 43 209 59 255 211 215 207 255 55 213 31 19 105 39 127 135 255 209 219 223 253 17 221 255 173 130 8

И вторая секция

70 0 119 179 223 253 59 255 209 249 238 205 215 191 233 157 175 59 255 209 249 238 153 215 191 233 43 209 59 255 209 249 238 149 215 191 233 149 70 59 255 209 249 238 151 215 191 233 39 28


а почему где то 8, а где то 9 байт выделено?

GarryC
Offline
Зарегистрирован: 08.08.2016

Ошибся при выделении в одном месте во второй секции, везде должно быть по 8, я так думаю.

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

GarryC пишет:

Ошибся при выделении в одном месте во второй секции, везде должно быть по 8, я так думаю.

должно быть да. а как можно "отловить следующее считывание"?
ведь есть же какой-то интервал передачи следующего байта после предыдущего? этот интервал на определенной скорости порта должен быть равный.

GarryC
Offline
Зарегистрирован: 08.08.2016

Ну, очень похоже, что данные идут после байта 255 и занимают 8 байтов. То есть ждете байта 255, следующие 8 захватили, залогировали и опять ждете.

sadman41
Offline
Зарегистрирован: 19.10.2016

sazanof пишет:
Вся соль в том, что метки(люди с метками) будут проходить каждый раз разным количеством в дверной проход. не сто человек. но 1-5 за раз.

Дело ваше. Лично мне отличия проще искать в двух фрагментах, а не в портянке, куда суются айдишники в произвольном порядке.

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

sadman41 пишет:

sazanof пишет:
Вся соль в том, что метки(люди с метками) будут проходить каждый раз разным количеством в дверной проход. не сто человек. но 1-5 за раз.

Дело ваше. Лично мне отличия проще искать в двух фрагментах, а не в портянке, куда суются айдишники в произвольном порядке.

Не совсем понял вас.

Вот дело то как раз не мое) Но занимаюсь я. Даже если абстрагироваться от всего это: по факту есть разной длины строка (или разнойго объема данные - называйте как хотите), которые даже не один раз считываются. А с каким-то интервалом (если метки блуждают рядом или застряли в проходе).

Тоесть грубо говоря держу рядом карты и не убираю

"пик" - (одни данные группового считывания)70 0 119 179 190 188 59  255 209 249 238 205 215 191 233 157 175 59  255 209 249 238 149 215 191 233 149 70 59  255 209 249 238 151 215 191 233 39  28 127 135 255 209 249 238 153 215 191 233 43  209 59  255 211 215 207 255 55  213 31  19  105 39 127 135 255 209 219 223 253 17 221  255 173 130 8

"какой-то промежуток времени"

"пик" - (другие данные группового считывания)70 0 119 179 190 188 59  255 209 249 238 205 215 191 233 157 175 59  255 209 249 238 149 215 191 233 149 70 59  255 209 249 238 151 215 191 233 39  28 127 135 255 209 249 238 153 215 191 233 43  209 59  255 211 215 207 255 55  213 31  19  105 39 127 135 255 209 219 223 253 17 221  255 173 130 8

"и продолжается в том же духе"

Нужно фиксировать либо вход, либо выход.

Делать можно это двумя способами: 2 считывателя и 2 дуины (между собой по rs485 например, али еще как-то), либо 1 дуина 1считыватель и 2антенны(1 и 2 скажем)

Вход получается это

1 вариант если 2 дуины (данные первой потом, если поступили - то данные второй)

2 вариант - 1антенна -> 2антенна

Выход наоборот.

+ Отсеивать тех, кто тупит в проходах

Важный момент: могу например выставить на считывателе, чтобы он в течении 10 секунд повторно не считывал тот же айдишник карты, скажем - это нужно, чтобы минимизировать  данные

А по сему пока главный вопрос: 

 - как правильнее считывать данные (я думаю например:
1)приходят байты, пишем-парсим номера карт в массив например) - не логирую их, так  как жду сигнал от другого считывателя, скажем (или антены)
2)потом - как только включается в работу вторая антена - парсим массив (сравниваем с предыдущим) - пишем в лог
3) что делать, если одновременно выходят и входят)))))???

- как можно отловить что данные из сериала прошли (не то чтобы он не available, а был такой, прочитал данные и теперь не активен)

скажем так, это будет триггером каким-то... метки считались - пока нет меток других - сериал не активен и массив не пуст - активируем какую-то паралельную задачу (Трэд): например пишем в лог

Прошу прощения за кашу, старался более понятно разложить.

 

Ахах - либо ставить узкий проход и пропускать по одному человеку)))

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

задублировал сообщение

sadman41
Offline
Зарегистрирован: 19.10.2016

sazanof пишет:

sadman41 пишет:

sazanof пишет:
Вся соль в том, что метки(люди с метками) будут проходить каждый раз разным количеством в дверной проход. не сто человек. но 1-5 за раз.

Дело ваше. Лично мне отличия проще искать в двух фрагментах, а не в портянке, куда суются айдишники в произвольном порядке.

Не совсем понял вас.

Я тоже не совсем понимаю - вам задачу решить надо или завалить всех странными цифрами и мыслями? Если первое, то нужна декомпозиция:
1) разобраться в формате пакета;
2) всё остальное.

Для #1 проще будет понять на примере двух однотипных объектов, а не сотни: считали одну карту, вторую, потом обе несколько раз. Затем ищем признаки пакета. А когда вы десяток накидываете, то хрен его знает, в каком порядке они пойдут: 1-2-3-4 или 10-1-3-9. А может по какому-то определенному алгоритму сортированы, как в 1-wire, например.

 

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

sadman41 пишет:

Для #1 проще будет понять на примере двух однотипных объектов, а не сотни: считали одну карту, вторую, потом обе несколько раз. Затем ищем признаки пакета.

Да, конечно же разобраться. Согласен. Я так и делал. Считывал по одной, потом две, три и так далее. И приходят они конечно же не по порядку. может прийти 1-2-3, а может 1-2, а может 3-1-2.

Я думаю так: пока буду ковырять и разбираться с пакетом(-ами). Потом по факту увеличения кода и возникновения вопросов буду писать в теме. Чтобы предметно было. Спасибо за отзывчивость)

sadman41
Offline
Зарегистрирован: 19.10.2016

Кстати, я вот тут подумал, что неплохо было бы накинуть логический анализатор на TX этого девайса. Он, может быть, сами пакеты шлет с  какой-нибудь паузой. println() ее не покажет. А вообще - у продавца про какой-то SDK написано. Может там будут куски кода по разбору пакета.

b707
Offline
Зарегистрирован: 26.05.2017

sazanof пишет:

70 0 119 179 223 253 59 255 209 249 238 205 215 191 233 157 175 59 255 209 249 238 153 215 191 233 43 209 59 255 209 249 238 149 215 191 233 149 70 59 255 209 249 238 151 215 191 233 39 28

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

Спасибо!

Сазанов, а в чем проблема? По списку номеров видно, что считывание каждой карты начинается с "70 0 119 179", потом два произвольных байта, далее "59 255" и номер карты. ИМХО, префикс карты более чем узнаваемый.

Соответсвенно. ищите в потоке первую комбинацию, пропускаете два байта. проверяете следующие на совпадение с "59 255" и читаете номер... Код не должен быть сложным.

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

b707 пишет:

Сазанов, а в чем проблема? По списку номеров видно, что считывание каждой карты начинается с "70 0 119 179", потом два произвольных байта, далее "59 255" и номер карты. ИМХО, префикс карты более чем узнаваемый.

Соответсвенно. ищите в потоке первую комбинацию, пропускаете два байта. проверяете следующие на совпадение с "59 255" и читаете номер... Код не должен быть сложным.

За произвольные байты - спасибо!

"59 255" - это еще зависит от типа меток. Но не суть.

Сложность может быть тогда, когда карты (метки, люди) медленно идущие или застрявшие по разным причинам в проходе начинают считываться снова и снова. Нужно определить момент, когда начинается следующее считывание в этом случае. И когда они прошли - логировать. Чтобы дублей не было.

К тому же сюда(в байты) добавляется номер антены считывателя (в конец наверное). но каким макаром - непонятно.

b707
Offline
Зарегистрирован: 26.05.2017

sazanof пишет:

Сложность может быть тогда, когда карты (метки, люди) медленно идущие или застрявшие по разным причинам в проходе начинают считываться снова и снова.

Вставьте разумный таймаут. Скажем, если между считываниями одной и той же метке менее 1 минуты - все эти считывания считаются одним проходом, если более 1 минуты - разными....

 

eksvtk
Offline
Зарегистрирован: 23.08.2018

Нам нужно сделать подобный проект.

У Вас получилось в результате разобраться с подключением этот оборудования?

Есть смысл покупать такое же?

 

sazanof
sazanof аватар
Offline
Зарегистрирован: 08.12.2017

ага, получилось, можете покупать

Reckless
Offline
Зарегистрирован: 11.09.2020

Добрый день, столкнулся с проблемой софта для данных антенн, не могли бы вы поделится листингом своего ПО