Опрос и управление устройствами компании Болид по протоколу Орион.

Библиотека написана на языке C++. Предназначена для разработки приложений для опроса и управления устройствами компании Болид по зашифрованному протоколу Орион.

Реализованный в библиотеке функционал в настоящее время позволяет:

  • Получать информацию о событиях приборов;
  • По запросу получать общее или расширенное состояние шлейфов, выходов и приборов;
  • Управлять взятием и снятием зон с охраны;
  • Управлять включением и выключением реле;
  • Получать данные счетчиков;
  • Получать данные о температуре, влажности и т.д.;
  • Получать коды проксимити-карт при событиях СКУД;
  • Получать информацию о типах и версиях приборов.

Скачать библиотеку Ceres.
Задать вопрос по библиотеке Ceres в телеграм.

Обмен данными с приборами компании Болид производится по «зашифрованному» протоколу «Орион». Для работы библиотеки требуется буфер, который вы можете создать любым, удобным вам способом. Рекомендуемый размер буфера — 100 байт.

Применяемые термины:

Открытый адрес — адрес устройства на шине «Орион», определяемый для устройств через UProg.

Закрытый адрес — адрес устройства используемый для работы по протоколу «Орион». Закрытый адрес формируется из открытого поднятием старшего бита открытого адреса. Т.к. максимальное количество адресов 127 (0x7F), просто выполняем XOR с 0x80. Например: о.а. = 2, тогда з.а. = 0x02^0x80 = 0x82, или о.а. = 78, тогда з.а. = 0x4E^0x80 = 0xCE.

Глобальный ключ — ключ, размерностью 1 байт, устанавливаемый для каждого устройства, для работы по протоколу «Орион». Глобальный ключ, при необходимости, можно менять в процессе опроса.

Ниже приведено описание функций и констант библиотеки.

Константы

Размеры буферов

CERES_SIZE_CARD_CODE определяет размер буфера для хранения кода проксимити-карты.
CERES_SIZE_STATES_ARRопределяет размер буфера для хранения кодов состояния шлейфов.

Приборы

CERES_SIZE_DEV_NAMES_ARR определяет размер буфера для хранения имён и свойств приборов.
CERES_DEV_TYPE[CERES_SIZE_DEV_NAMES_ARR][3] массив содержащий свойства приборов согласно С2000-М вер. 4.14
[0] Тип прибора;
[1] Количество шлейфов;
[2] Количество реле.

CERES_DEV_NAMES[CERES_SIZE_DEV_NAMES_ARR] массив содержащий названия приборов согласно С2000-М вер. 4.14

События

CERES_EVENT_DESC_ARR[256] массив содержащий имена событий на кириллице.
CERES_EVENT_DESC_TRNSLT_ARR[256] массив содержащий транслит имен событий на латинице.
CERES_EVENT_TYPE_ARR[256] массив содержащий привязку события к определенным константами CERES_ET_… типам.

Типы событий

CERES_ET_COMMON общее событие
CERES_ET_ALARM событие тревога
CERES_ET_ARM событие взятие / снятие
CERES_ET_TROUBLE событие неисправность
CERES_ET_RECOVERY событие восстановление
CERES_ET_RELAY событие реле (выхода)
CERES_ET_ACCESS событие СКУД
CERES_ET_TECH событие техлоногическое

Общее для всех функций.
Во всех функциях, использующих буфер:

unsigned char* frame // указатель на буфер
int* len // указатель на переменную, хранящую количество принятых или подготовленных для передачи, после формирования запроса, байт.

Для всех функций, формирующих запросы или производящих анализ ответов:

unsigned char* addr_o //указатель на открытый адрес
unsigned char* addr_s //указатель на закрытый адрес
unsigned char* global_key //указатель на глобаный ключ

Внимание!
После запроса переход на зашифрованный протокол обмена «Орион», необходимо использовать закрытый адрес.

Функции, начинающиеся с «ceres_q_«, формируют последовательность байт запроса и помещают его в буфер [frame], при этом в переменную [len] сохраняется количество байт, подготовленных к передаче.

Функции, начинающиеся с «ceres_r_«, проверяют достоверность полученных данных и, за некоторым исключением, сохраняют по переданным указателям запрошенные данные.

Получения типа и версии устройства.

/** Запрос для получения информации о устройстве.
* @return void
*/
void ceres_q_dev_info(unsigned char* frame, int* len, unsigned char* addr_o);
 
 
/** Анализ ответа на запрос для получения информации о устройстве.
* @param unsigned char* type_dest - указатель на переменную для сохранения типа устройства.
* @param unsigned char* ver_dest - указатель на переменную для сохранения версии устройства.
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_dev_info(unsigned char* frame, int* len, unsigned char* addr_o, unsigned char* type_dest, unsigned char* ver_dest);

Переход на зашифрованный протокол обмена «Орион».

/** Запрос на переход на зашифрованный протокол обмена.
* @return void
*/
void ceres_q_sec_begin(unsigned char* frame, int* len, unsigned char* addr_o, unsigned char* global_key);
 
 
/** Анализ ответа на запрос на переход на зашифрованный протокол обмена.
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_sec_begin(unsigned char* frame, int* len, unsigned char* addr_o, unsigned char* global_key);

Общее состояние шлейфа, выхода или прибора.

Для получения состояния(й) необходимо создать буфер размером 5 байт, или использовать значение, определенное в CERES_SIZE_STATES_ARR. Полученные значения будут сохранены в этот буфер, а в переменную obtain_dest будет сохранено количество полученных состояний. Для получения состояния прибора необходимо передать zone равным нулю.

Внимание!
В любом случае буфер states_dest и obtain_dest сначала заполняются нулями.

/** Запрос на получение общего состояния шлейфа, выхода или прибора.
* @param unsigned char zone - номер шлейфа или выхода.
* @return void
*/
void ceres_q_state_simp(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);
 
 
/** Анализ ответа на запрос на получение общего состояния шлейфа, выхода или прибора.
* @param unsigned char zone	- номер шлейфа или выхода.
* @param int* obtain_dest - указатель на переменную для сохранения количества полученных состояний.
* @param unsigned char states_dest[CERES_SIZE_STATES_ARR] - указатель на буфер для сохранения состояний.
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_state_simp(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone, int* obtain_dest, unsigned char states_dest[CERES_SIZE_STATES_ARR]);

Расширенное состояние шлейфа, выхода или прибора.

Для получения состояния(й) необходимо создать (использовать созданный ранее) буфер размером 5 байт, или использовать значение, определенное в CERES_SIZE_STATES_ARR. Полученные значения будут сохранены в этот буфер, а в переменную obtain_dest будет сохранено количество полученных состояний. Для получения состояния прибора необходимо передать zone равным нулю.

Внимание!
В любом случае буфер states_dest и obtain_dest сначала заполняются нулями.

/** Запрос на получение расширенного состояния шлейфа, выхода или прибора.
* @param unsigned char zone - номер шлейфа или выхода.
* @return void
*/
void ceres_q_state_ext(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);
 
 
/** Анализ ответа на запрос на получение расширенного состояния шлейфа, выхода или прибора.
* @param unsigned char zone - номер шлейфа или выхода.
* @param int* obtain_dest - указатель на переменную для сохранения количества полученных состояний.
* @param unsigned char states_dest[CERES_SIZE_STATES_ARR] - указатель на буфер для сохранения состояний.
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_state_ext(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone, int* obtain_dest, unsigned char states_dest[CERES_SIZE_STATES_ARR]);

Получение события прибора.

Для получения события прибора необходимо более 2-х шагов, в отличие от других запросов.

1. Сформировать запрос на чтение события с помощью функции ceres_q_read_event(…) и отправить его прибору;

2. Получив ответ, с помощью функции ceres_xxx_event_type(…), где ххх — тип прибора, получить тип события, определяемяй коннстантами CERES_ET_… и код события для дальнейшей обработки или значение, говорящее что событий нет;

3.1. В случае если событие есть — обработать ответ в зависимости от типа события и типа прибра, получив полезные данные. Сформировать запрос на загрузку следующего события с помощью функции ceres_q_load_event(…) и отправить его прибору. Внимание! Ответа от прибора не будет. Если ведется опрос одного прибора рекомендуется небольшой тайм-аут.

3.2. Если события нет, переходим к пункту 1.

Чтение события прибора.

/** Запрос на чтение события прибора.
* @return void
*/
void ceres_q_read_event(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key);

Загрузка следующего события прибора.

/** Запрос на загрузку следующего события прибора.
* @return void
*/
void ceres_q_load_event(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key);

Обработка событий для С2000-КДЛ.

Получение типа и кода события.

/** Анализ ответа на запрос на чтение события прибора, получение типа и кода события.
* @param int* event_type_dest - указатель на переменную для сохранения типа события.
* @param unsigned char* event_dest - указатель на переменную для сохранения кода события.
* @return
* 0 - данные обработаны, есть событие.
* 1 - данные обработаны, событий нет.
* -1 - ошибка принятых данных.
*/
char ceres_09_event_type(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, int* event_type_dest, unsigned char* event_dest);

Получение данных о событии типа CERES_ET_ACCESS.

Для получения кода проксимити-карты необходимо создать (использовать созданный ранее) буфер размером 10 байт, или использовать значение, определенное в CERES_SIZE_CARD_CODE. Полученный код проксимити-карты будет сохранен в этот буфер.

/** Получение данных о событии типа CERES_ET_ACCESS.
* @param unsigned char code_dest[CERES_SIZE_CARD_CODE] - указатель на буфер для сохранения кода проксимити-карты.
* @param unsigned char* event_dest - указатель на переменную для сохранения кода события.
* @return
* void
*/
void ceres_09_event_access(unsigned char* frame, unsigned char* event_dest, unsigned char code_dest[CERES_SIZE_CARD_CODE]);

Получение данных о событии типа CERES_ET_RELAY.

/** Получение данных о событии типа CERES_ET_RELAY.
* @param unsigned char* relay_dest - указатель на переменную для сохранения номера реле (выхода).
* @param unsigned char* program_dest - указатель на переменную для сохранения номера программы управления.
* @param unsigned char* event_dest - указатель на переменную для сохранения кода события.
* @return
* void
*/
void ceres_09_event_relay(unsigned char* frame, unsigned char* event_dest, unsigned char* relay_dest, unsigned char* program_dest);

Получение данных о простых событиях.

/** Получение данных о простых событиях.
* @param unsigned char* zone_dest - указатель на переменную для сохранения номера зоны.
* @param unsigned char* event_dest - указатель на переменную для сохранения кода события.
* @return
* void
*/
void ceres_09_event_common(unsigned char* frame, unsigned char* event_dest, unsigned char* zone_dest);

Взятие шлейфа под охрану.

/** Запрос на взятие шлейфа под охрану.
* @param unsigned char zone - номер шлейфа.
* @return void
*/
void ceres_q_zone_arm(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);
 
 
/** Анализ ответа на запрос на взятие шлейфа под охрану.
* @param unsigned char zone - номер шлейфа или выхода.
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_zone_arm(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);

Снятие шлейфа с охраны.

/** Запрос на снятие шлейфа с охраны.
* @param unsigned char zone - номер шлейфа.
* @return void
*/
void ceres_q_zone_disarm(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);
 
 
/** Анализ ответа на запрос на снятие шлейфа с охраны.
* @param unsigned char zone - номер шлейфа.
* @return
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_zone_disarm(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);

Включить реле (активировать выход).

/** Запрос на включение реле.
* @param unsigned char relay - номер реле (выхода).
* @return void
*/
void ceres_q_relay_on(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char relay);
 
 
/** Анализ ответа на запрос на включение реле.
* @param unsigned char relay- номер реле (выхода).
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_relay_on(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char relay);

Выключить реле (деактивировать выход).

/** Запрос на выключение реле.
* @param unsigned char relay - номер реле (выхода).
* @return void
*/
void ceres_q_relay_off(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char relay);
 
 
/** Анализ ответа на запрос на выключение реле.
* @param unsigned char relay - номер реле (выхода).
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_relay_off(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char relay);

Запрос информации о шлейфе в Unicode строку.

Данные запросы применяется для получения информации:

  • о температуре и влажности получаемых от С2000-ВТ,
  • о напряжении, токе и т.д. от РИП12-RS,
  • и т.д.
 
/*Версия 1*/
 
/** Запрос информации о шлейфе в Unicode строку.
* @param unsigned char zone - номер шлейфа.
* @return void
*/
void ceres_q_adc_v1(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);
 
 
/** Анализ ответа на запрос информации о шлейфе в Unicode строку.
* @return
* Указатель на строку данных, в случае успеха.
* null - ошибка принятых данных.
*/
unsigned char* ceres_r_adc_v1(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key);
 
 
/*Версия 2*/
 
/** Запрос информации о шлейфе в Unicode строку.
* @param unsigned char zone - номер шлейфа.
* @return void
*/
void ceres_q_adc_v2(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);
 
 
/** Анализ ответа на запрос информации о шлейфе в Unicode строку.
* @return
* Указатель на строку данных, в случае успеха.
* null - ошибка принятых данных.
*/
unsigned char* ceres_r_adc_v2(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key);

Для удобства реализованы 2 функции для извлечения значений типа long int и double из полученной Unicode строки.

/** Извлекает знаковое значение типа long int из Unicode строки.
* @param long int* dest - указатель на переменную для сохранения значения.
* @return void
*/
void ceres_extract_adc(unsigned char* frame, int* len, long int* dest);
 
/** Извлекает значение типа double из Unicode строки.
* @param double* dest - указатель на переменную для сохранения значения.
* @return void
*/
void ceres_extract_adc(unsigned char* frame, int* len, double* dest);

Запрос данных счетчика.

/** Запрос данных счетчика.
* @param unsigned char zone - адрес счетчика (номер зоны).
* @return void
*/
void ceres_q_counter(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone);
 
 
/** Анализ ответа на запрос данных счетчика.
* @param unsigned char zone - адрес счетчика (номер зоны).
* @param long long unsigned int* - указатель на переменную для сохранения значения счетчика.
* @return
* 0 - успешно.
* -1 - ошибка принятых данных.
*/
char ceres_r_counter(unsigned char* frame, int* len, unsigned char* addr_s, unsigned char* global_key, unsigned char zone, long long unsigned int* counter_dest);

Текстовые значения.

/** Получение строки с названием прибора. Кириллица.
* @param unsigned char event - тип прибора.
* @return 
* Указатель на строку данных.
*/
const char* ceres_name_dev(unsigned char type);
 
/** Получение строки с именем события. Кириллица.
* @param unsigned char event - код события.
* @return 
* Указатель на строку данных.
*/
const char* ceres_name_event(unsigned char event);
 
/** Получение строки с именем события. Латиница. Транслит.
* @param unsigned char event - код события.
* @return 
* Указатель на строку данных.
*/
const char* ceres_name_event_trnslt(unsigned char event);

Оцените пожалуйста статью:

ПечальноТак себеНе плохоХорошоОтличная статья! (Пока оценок нет)
Загрузка...

Добавить комментарий