Доброе утро, товарищи. Сразу к делу. Постараюсь описать как можно понятнее. Есть: Arduino UNO и считыватель rfid дальнего действия с возможностью одновременного считывания до 64 меток.
К считывателю идет ПО, китайское, в котором можно настроить практически все: мощность, выбор антенн (из четырех), типы (Wiegand26\34,rs232,rs485 и тд),длину "какбэ паузы между сканированиями", когда карта приложена и интервал повторного считывания карты с тем же ID. Вообщем, вот эти 2 параметра, особенно "пауза" очень важна. Объясню почему, но сначала простой код, который успешно считывает данные с софтверного сериал порта:
01 | #include <SoftwareSerial.h> |
03 | SoftwareSerial mySerial(2, 3); |
08 | Serial .println( "serial activated" ); |
16 | if (mySerial.available()) |
19 | byte data = mySerial.read(); |
Можно выводить Serial.print(data,HEX);Serial.print(data,BIN); - не важно
Так вот в чем вся соль:
Учитывая то, что карт в диапазоне считывания может быть несколько, соответственно длина считывания за раз байт будет разная. ПРИНТ выводит вот это:
Если в мульти режиме сканить по одной карте
02 | 70 0 119 179 227 253 59 255 211 215 207 255 141 213 31 19 187 125 |
03 | 70 0 119 179 227 253 59 255 211 215 207 255 55 213 31 19 105 39 |
04 | 70 0 119 179 227 253 59 255 209 219 223 253 17 221 255 173 130 8 |
05 | 70 0 119 179 227 253 59 255 209 219 223 253 59 221 255 171 112 44 |
08 | 70 0 119 179 227 253 59 255 209 249 238 151 215 191 233 39 28 |
09 | 70 0 119 179 227 253 59 255 209 249 238 153 215 191 233 43 1 |
10 | 70 0 119 179 227 253 59 255 209 249 238 205 215 191 233 157 15 |
11 | 70 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
Отформатировал уже я. Как видно, есть какая-то закономерность, но разные карты и наклейки дают разное количество байт (если я правильно выразился) - отмечены курсивом. жирным отмечены части одинаковые.
В этой строке передается не только номер карты, но и тип считывателя и номер антенны, с которой передается сигнал.
Итак, что мне необходимо: помогите понять алгоритм, по которому можно разобрать строку по номерам карт и каждый номер записать в лог (это уже вторая задача, думаю, что я с ней справлюсь)
Спасибо!
Девайс бы показали свой - может быстрее мысли у народа появятся. Какая модель или чип в нем который стоит...
Девайс бы показали свой - может быстрее мысли у народа появятся. Какая модель или чип в нем который стоит...
Да, это нонейм с алиэкспресса, не знаю на каком чипе((
https://ru.aliexpress.com/item/High-Quality-860-960Mhz-ISO18000-6C-UHF-Reader-RFID/1291125670.html?spm=a2g0s.9042311.0.0.ahlA0x
Черт его знает...
Давайте по сто карт сразу не подносить, а на двух разобраться: два одиночных считывания и одно групповое. Иначе вообще непонятно как этот поток делить на части.
Вроде так, не ?
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
Черт его знает...
Давайте по сто карт сразу не подносить, а на двух разобраться: два одиночных считывания и одно групповое. Иначе вообще непонятно как этот поток делить на части.
Вся соль в том, что метки(люди с метками) будут проходить каждый раз разным количеством в дверной проход. не сто человек. но 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 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 байт выделено?
Ошибся при выделении в одном месте во второй секции, везде должно быть по 8, я так думаю.
Ошибся при выделении в одном месте во второй секции, везде должно быть по 8, я так думаю.
должно быть да. а как можно "отловить следующее считывание"?
ведь есть же какой-то интервал передачи следующего байта после предыдущего? этот интервал на определенной скорости порта должен быть равный.
Ну, очень похоже, что данные идут после байта 255 и занимают 8 байтов. То есть ждете байта 255, следующие 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
"какой-то промежуток времени"
"пик" - (другие данные группового считывания)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, а был такой, прочитал данные и теперь не активен)
скажем так, это будет триггером каким-то... метки считались - пока нет меток других - сериал не активен и массив не пуст - активируем какую-то паралельную задачу (Трэд): например пишем в лог
Прошу прощения за кашу, старался более понятно разложить.
Ахах - либо ставить узкий проход и пропускать по одному человеку)))
задублировал сообщение
Дело ваше. Лично мне отличия проще искать в двух фрагментах, а не в портянке, куда суются айдишники в произвольном порядке.
Не совсем понял вас.
Я тоже не совсем понимаю - вам задачу решить надо или завалить всех странными цифрами и мыслями? Если первое, то нужна декомпозиция:
1) разобраться в формате пакета;
2) всё остальное.
Для #1 проще будет понять на примере двух однотипных объектов, а не сотни: считали одну карту, вторую, потом обе несколько раз. Затем ищем признаки пакета. А когда вы десяток накидываете, то хрен его знает, в каком порядке они пойдут: 1-2-3-4 или 10-1-3-9. А может по какому-то определенному алгоритму сортированы, как в 1-wire, например.
Для #1 проще будет понять на примере двух однотипных объектов, а не сотни: считали одну карту, вторую, потом обе несколько раз. Затем ищем признаки пакета.
Да, конечно же разобраться. Согласен. Я так и делал. Считывал по одной, потом две, три и так далее. И приходят они конечно же не по порядку. может прийти 1-2-3, а может 1-2, а может 3-1-2.
Я думаю так: пока буду ковырять и разбираться с пакетом(-ами). Потом по факту увеличения кода и возникновения вопросов буду писать в теме. Чтобы предметно было. Спасибо за отзывчивость)
Кстати, я вот тут подумал, что неплохо было бы накинуть логический анализатор на TX этого девайса. Он, может быть, сами пакеты шлет с какой-нибудь паузой. println() ее не покажет. А вообще - у продавца про какой-то SDK написано. Может там будут куски кода по разбору пакета.
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" и читаете номер... Код не должен быть сложным.
Сазанов, а в чем проблема? По списку номеров видно, что считывание каждой карты начинается с "70 0 119 179", потом два произвольных байта, далее "59 255" и номер карты. ИМХО, префикс карты более чем узнаваемый.
Соответсвенно. ищите в потоке первую комбинацию, пропускаете два байта. проверяете следующие на совпадение с "59 255" и читаете номер... Код не должен быть сложным.
За произвольные байты - спасибо!
"59 255" - это еще зависит от типа меток. Но не суть.
Сложность может быть тогда, когда карты (метки, люди) медленно идущие или застрявшие по разным причинам в проходе начинают считываться снова и снова. Нужно определить момент, когда начинается следующее считывание в этом случае. И когда они прошли - логировать. Чтобы дублей не было.
К тому же сюда(в байты) добавляется номер антены считывателя (в конец наверное). но каким макаром - непонятно.
Сложность может быть тогда, когда карты (метки, люди) медленно идущие или застрявшие по разным причинам в проходе начинают считываться снова и снова.
Вставьте разумный таймаут. Скажем, если между считываниями одной и той же метке менее 1 минуты - все эти считывания считаются одним проходом, если более 1 минуты - разными....
Нам нужно сделать подобный проект.
У Вас получилось в результате разобраться с подключением этот оборудования?
Есть смысл покупать такое же?
ага, получилось, можете покупать
Добрый день, столкнулся с проблемой софта для данных антенн, не могли бы вы поделится листингом своего ПО