Добрый Самурай

Протокол Орион Болид

102 сообщения в этой теме

Доброго времени суток, господа!

Сталкивался ли кто со спецификацией протокола обмена Болид (Орион)? Я понимаю что эти данные закрыты, но возможно народные умельцы смогли понять его работу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
ferrum    14

Ничего там сверхестественного нет . Протокол и протокол. Сам посмотри. Каждая запрос начинается с заголовка(адреса, размера посылки) ,тела(команды, данные) и оканчивается CRC. Длина посылки зависит от контекста.Код CRC и является препятствием(для меня) для воспроизведения. Интерес к протоколу упал после выхода C2000-ПП

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

Здравствуйте! Тоже столкнулся с необходимостью расковырять этот протокол.

Код CRC и является препятствием

Как раз это и не проблема. Вот пример вычисления (на PureBasic) CRC реального ответа от "Сигнал-20", где первый байт (132) -это адрес прибора(4) плюс 128 (не понятно почему так), второй байт(5)-это кол-во байт в посылке, последний, шестой байт- это CRC, его мы успешно и получаем.


; CRC ОРИОН
; Побайтное вычисление CRC8
;

Procedure Crc8(inbait ,incrc)
bait.c=inbait
crc.c=incrc
For i=0 To 7
If bait ! crc & 1 = 1
 crc=((crc ! %00011000) >> 1 ) | %10000000
Else
 crc=crc >> 1
EndIf
bait = bait >> 1
Next i
ProcedureReturn crc
EndProcedure
Dim Data_Array.c(7)
CRC.c=0
; размер массива равен полной длине посылки (включая адрес), но без последнего байта-это и есть CRC
; пример ответа от Сигнал-20: 132 5 178 156 176 26
Data_Array(0) = 132
Data_Array(1) = 5
Data_Array(2) = 178
Data_Array(3) = 156
Data_Array(4) = 176

For k=0 To 4
crc=Crc8(Data_Array(k) ,crc )
Next k
Debug crc

А вот с оставшимися байтами (3-5) просто беда! При одинаковом состоянии шлейфов ответы от "Сигнал-20" каждый раз разные! Может знает кто, как выдернуть инфу о состоянии шлейфов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

Немного разобрался! Приборы, с которыми я экспериментировал (Сигнал-20, С2000-СП1), отвечают на запросы контроллера С2000 шестибайтными посылками, в байтах 3-5 содержится информация (считаем байт адреса за первый). Чтобы её получить, необходимо произвести между двумя из байт операцию "исключающее ИЛИ" ("XOR"). При этом получается три байта: (b3 XOR b5) -как-то связано с номером шлейфа, а так же состояние при стартовом опросе прибора, (b4 XOR b5) -счетчик посылок, сбрасывается при изменении состояния шлейфов, (b3 XOR b4) -типа ответ на команду ("статус"). Таким образом у меня получилось-таки отлавливать события (сработки, взятие-невзятие и т.д.), включение-выключение реле на СП1, чего и остальным страждущим искренне желаю!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

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

Я разные приборы пробывал, разные сетевые опросчики (С2000, uprog,pprog,shleifes) и могу сказать что посылки достаточно разной длинны, полностью зависит от контекста, типов приборов и программ. Даже поиск приборов программами и пультом происходит немного по разном. Припамянаю, что при обмене с прибором было число, которое принималось прибором, инкрементировалось на еденицу и в ответе отправлялось опросчику(думаю это какой то механизм контроля подмены прибора )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

Выше я писал, что адрес прибора передается увеличенным на 128. С этим тоже прояснилось: пока прибор не обнаружен, контроллер посылает запрос на присутствие, в заголовке которого указан "чистый" адрес, после обнаружения обмен информацией ведется с использованием адреса, увеличенного на 128. Теперь понятно, почему в системе может быть не более 127 адресов (нулевой адрес, как известно, используется для широковещательных сообщений).

Изменено пользователем КЭС

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

что то не припомню широковещания у болида, есть примеры? Видимо страший бит байта адреса несет в себе какой то смысл, флаг чего то.

127 адресов в болиде скорее наверное исторически. Изначально взяли драйвера 485го с 1\4 UL , потом решили, чего зря биту пропадать и заняли какой то служебной информацией. А сейчас куча драйверов с 1\8 ul, казалось бы взяли бы и увеличили максимальное количество устройств до 256, да вот незадача бита нехватает :) Это ведь не этап разработки, миллионы устройств по России уже наверное в работе!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

Широковещалка у болида есть. Например, если заглянуть в программе pprog в страничку, где указывается, каким приборам передавать события (страницы->разное->передача событий->приборам), там есть ярлычек "Всем". Если его выбрать, в правой части окна программы (инспектор (события)) будет указан адрес"0".

На счет 8го бита в адресе. Он действительно занят служебной информацией: это флаг того, что прибор с этим адресом обнаружен и находится в работе. Об этом я и писал в своем предыдущем посте.

Изменено пользователем КЭС

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Anthon    0

Здравствуйте! Тоже разбираюсь с Орионом, хочу программно запустить релюшку с прибора с2000-2! Насколько я понял это можно сделать из под программ ОРИОНА, но я пищу свой софт, к порту подключился, а вот как послать команду не знаю, напишите кто нибудь как это программно реализовать, простой пример! Пишу на C#! Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

Напрямую управлять реле с2000-2 нельзя(например как у Сигнала,С2000-4, СП1,КПБ). Жестко привязан к локальной тактике работы. Нужно сформировать сообщение сетевого контроллера чтото типа "Разрешить доступ"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Anthon    0

Да, но из под программы "Администратор базы данных" у меня например получается послать сигнал на с2000-2 замыкания контактов, так почему нельзя это запрограммировать послав аналогичную команду из под другого программного обеспечения? Насколько я понял, мне только и надо одну лишь команду найти?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

из под программы "Администратор базы данных" у меня например получается послать сигнал на с2000-2 замыкания контактов

Ну так и смотри на СОМ-порту, что посылает программа, попробуй смоделировать такую же посылку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

Anthon, АРМ есть купленный? Если да , то делаешь сценарий с нужными действиями, вешаешь его на горячую клавишу, затем своей программой посылаешь оперативной задаче сочетание клавиш.

Кстати если у тебя на этом компе крутится оперативная задача , то порт ею занят, если ОЗ нет, а есть С2000(М) то пойдут потери приборов у пульта. Потому что доступ детерминированный, и сетевой контроллер решает кому когда говорить.

пс Вот как раз АБД формирует "Разрешить доступ" значит, только я у АБД не припомню такую функцию, может у тебя Орион ПРО ? :umnik2:

Изменено пользователем ferrum

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Anthon    0

В АБД на релюшке меняешь свойства включить, включить на время, после сохраняешь и между контактами +12В1 и DOOR1 проскакивает импульс. Да я вот и думаю, надо попробовать прослушать порт, а вот по поводу оперативной задачи, это походу тоже проблема, ведь если порт уже каким-то приложением будет открыт, его же уже из под другого не запустишь?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

Если есть оперативная задача, то я уже сказал как тебе решить. Если расскажешь свою задачу вкомплексе, то может придумаем решение.

Здесь люди лезут в дебри, потомучто это интересно, а не потому что без этого никиак. Многие вещи можно сделать некустарными методами.

Причем здесь Door1 и +12В когда речь идет о реле,Door это ведь СМК двери или датчик прохода турникета.

Если хочется заморочится, то проэмулируй работу прибора со считывателем, пересылаяя Ориону идентификатор с достаточным уровнем прав. Эмулировать приборы - реально, что и доказал КЭС.

Изменено пользователем ferrum

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Anthon    0

Задача у меня такая: Есть одноразовые пропуска на территорию, ну тобишь для посторонних лиц, делать им проксимити-карты смысла нет, придумали наносить на одноразовые пропуска штрих коды, дальше свой считыватель, ну и подружить все это хотел через комп, свая база данных, учет посторонних лиц и т.д.! Короче основная задача открыть турникет с постороннего считывателя через Bolid-контроллер! А вообще можно же как-то через rs232 управлять реле на прямую?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

Вроде все просто, согласуй какой нибудь управляющий сигнал компорта с входом контроллера "Открывание по кнопке". Свой\чужой решение примает твоё ПО, в зависимости от данных баркодсканера, при успехе дергаешь за линию компорта - турникет открывается. соответственно все временные пропуска регистрируются Орионом одинаково "Кнопка", а учет проходов ведешь в своей программе.

В этом случае неплохо было бы предусмотреть ввод в ПО информации с датчика прохода. А то пропуск приложат, а не пройдут. А в твоей базе - человек находится внутри!! И "ты" поидее обязан его искать с охраной, по просроку по времени. Может он где то в яму упал по незнанке. А так прохода небыло - пропуск в девственном состоянии.

Повторяю, напрямую управлять реле нельзя, это не реле контрольного прибора и не релейный блок - команды "Включить, включить на время и др." он незнает. Максимум что можно, это имитировать АРМ "Орион" и командовать "Разрешить доступ" централизованно, но для этого Оперативная задача должна быть ВЫКЛЮЧЕНА и соответственно нужно знать часть протокола .

Не понимаю почему не хочешь через оперативную задачу сделать, чистый программизм никакого железа

Изменено пользователем ferrum

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14
Может знает кто, как выдернуть инфу о состоянии шлейфов?

Voila...

Получаем состояние ШС

Запрос: Адр Кол 0 25 ШС 0 CRC

Ответ: Адр Кол 26 ШС ССТ CRC

где ССТ - состояние шлейфа

Например : 109 -Снят, 24 - Взят, 3 -Тревога, 17-Невзятие

Получаем значение АЦП

Запрос: Адр Кол 0 27 ШС 0 CRC

Ответ: Адр Кол 28 ШС АЦП CRC

пс Пробывал с прибором Сигнал-20П Smd v.2.02

Изменено пользователем ferrum

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

ferrum, сдается мне, что твой ребус мало кому поможет. :umnik2: Я так понимаю, запросы ты взял с uprog? Они там фиксированные, ответы Сигнала-20 на них-тоже. Если же "слушать" RS-485 "разговора" С2000 с Сигналом-20, там будут совсем другие посылки. Чтобы добыть истину, байты надо "ксорить", как я писал в 4м посте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

ХА, ты подслушиваешь чужие обмены?

Ну незнаю, кому может помочь, но работает, достоверные данные о ШС получаю, уже можно Сигнал использовать с собоственным ПО.

Снифание обменов скорее будет полезным взломщикам, чем людям прикручивающим болидовские железяки в свою систему.

Я ,например, не передавал бы(еслиб протокол был мой) состояние ШС без причины, запрашивал бы признак изменения состояния ШС прибора с последнего опроса. Если б признак получал, то тогда бы запросил нужные ШС, а так чего просто так забивать интерфейс.

пс Uprog не опрашивает состояние ШС, взял у пр. Shleifes

Изменено пользователем ferrum

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

Я бы ,например, не передавал бы(еслиб протокол был мой) состояние ШС без причины, запрашивал бы признак изменения состояния ШС прибора с последнего опроса.

Так и есть. Если состояние шлейфов неизменно, от Сигналов передаются только посылки, подтверждающие присутствие прибора. Про Uprog -это я перепутал по запарке, действительно Shleifes запрашивает. Снифер я делал, бесполезная вещь, т.к. неизвестно состояние шлейфов (реле) на момент запуска снифера, можно только отловить события. Именно поэтому я и заморочился с эмуляцией СП1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ferrum    14

КЭС, напиши как пульт управляет твоей псевдоСПшкой, какие там обмены

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

Попытаюсь.

Добавляем в конфигурацию С2000 (через pprog) новый прибор, делаем его СП1, версия не имеет значения, присваиваем ему адрес, например 50.

После этого контроллер будет периодически запрашивать этот прибор . Здесь я делаю маленькое отступление: везде, где будут встречаться указания кодов посылок, будет иметься ввиду "проксоренная" последовательность. Пример: принята последовательность 178;6;45;46;47;48;31;. Байты считаем слева направо от 1. Получается: 1й байт(178)-адрес прибора, которому адресован запрос(50) плюс 128;, 2й байт(6)-длина посылки(без CRC), 3-6 байты - собственно запрос, 7байт-CRC.

Теперь необходимо с каждую пару байт "проксорить" между собой. Получится последовательность из (х*х-х)/2 байт,где х- число исходных байт, в нашем случае их 4.

Вот процедурка для такой обработки:

Procedure.s detect(xyz.s)
Dim xvrem.c(0)
rez.s=""

For a=3 To CountString(xyz.s, ";")-1
ReDim xvrem.c(a-3)
xvrem(a-3)=Val(StringField(xyz.s, a, ";"))
Next a


For b=0 To a-4
For k=b+1 To a-4
rez.s+Str(xvrem.c(!xvrem.c(k))+";"
st+1
Next k

Next b
ProcedureReturn rez.s
EndProcedure

Debug detect("178;6;45;46;47;48;31;")

На выходе процедура выдаст "3;2;29;1;30;31;" (в нашем примере). Вот это и есть "голая правда" протокола Болид!

Теперь, собственно о "разговоре" С2000 с СП1.

Пока прибор не обнаружен, С2000 посылает запрос "1;0;254;1;255;254;".

Дальше необходимо отметить, что в СП1 имеется счетчик , инкременирующийся при каждой новой передаче (не совсем так, об этом позже)

он используется при формировании ответа.

Следующие строчки я переписывал несколько раз, книга получается! давайте я выложу исходник своей недоделанной, но рабочей версии эмулятора, написана на PureBasic 4.10. ну и скомпилированный вариант.болид1.rar

Будут вопросы (а они будут!), отвечу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nekto    1

На выходе процедура выдаст "3;2;29;1;30;31;" (в нашем примере).

И что с этим делать , проксоренным...

Пример не работает что-то( . Пульт не обнаруживает ваш эмуль и команды вкл. реле непроходят.

Из листинга -

If adrabs=77  ;почему-то с этим адресом приходится менять нормальный CRC на 252

Потому что Болид неиспользует расчет CRC8 с помощью полинома. У них таблица изменена намеренно, вот вы и натыкаетесь на эти грабли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    906

Не обнаруживает, потому что это не реализовано, там ответ надо формировать соответствующий, надо вручную сконфигурить в pprog' е.

Задержку перед ответом надо поставить >=1мс (у меня работает с значениями 1-5). Программа не закончена, сейчас не имею возможности разбираться, только после 20го (по заезду на вахту).

О какой таблице речь? CRC вычисляется программно, в запросах от контроллера несоответствий вычисленного и принятого замечено не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас