Allexin / ASNPSmartHouse

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ЧЕРНОВИК
Uart Settings:
Baud Rate: 19200
Parity: No Parity
Stop bit: One Stop
Data Size: 8 bit

Используемые типы:
безнаковый байт - основной тип используемый в пакетах строка - uint8_t длина строки, массив uint8_t[длина строки]

Структура команды:
INFO
ADDRESS
DATA_LENGTH
DATA
CHECKSUM

INFO - информация о пакете. Биты считаются справа налево.
1 - бит четности(количество установленных битов должно быть четным)
2 - бит приоритета(0 - отправляем если можем, 1 - отправляем всегда)
3 - бит типа адреса(0 - персональный адрес, 1 - групповой адрес)
4 - бит события(0 - обычный пакет, 1 - событие)
5,6,7.8 - не используются.
ADDRESS - адрес устройства или группы, которому предназначается команда. 0x00 - броадкаст. Если пакет является событием - адрес должен содержать собственный адрес устройства. Как будто он отправляет пакет самому себе.
DATA_LENGTH - длина данных. Значение от 1 до 255.
DATA - данные размером DATA_LENGTH
CHECKSUM - простая чек сумма. Равняется сумме всех байт пакета, кроме самой чексуммы

Команды

0x00 PING
0x01 PONG
0x02 LOG
0x20 REQUEST_INFO
0x21 RESPONSE_INFO
0x22 GET_VARIABLES_COUNT
0x23 RESPONSE_VARIABLES_COUNT
0x24 GET_VARIABLES
0x25 RESPONSE_VARIABLES
0x26 GET_VARIABLES
0x27 RESPONSE_VARIABLE
0x28 SET_VARIABLE
0x29 SUBSCRIBE_TO_VARIABLE
0x2A EVENT_VARIABLE_CHANGED

Маршрутизация

Широковещательные пакеты отправляются всем устройствам. Остальные пакеты отправляются только на устройства, у которых указан соответствующий адрес. Либо если пакет является событием - тем, кто подписался на адрес отправителя. Любое устройство может подписаться на любые адреса. Подписаться в лоб на все 255 адресов плохая идея, сводящая на нет всю концепцию маршрутизации.
Устройство должно отправить пакет подписки(PONG) при включении, а также при получении широковещательного пакета PING

Системные пакеты

Широковещательные пакеты(адрес 0x00) с первым байтом данных равным 0 - являются системными пакетами и обрабатываются особым образом, зависящим от конкретного пакета.

Специализированные пакеты

Пакет PING

0x03 0x00 0x03 0x00 0x00 0x01 0x06
Пакет с высоким приоритетом(0x03), широковещательный(0x00), 3 байт данных(0x03), служебные команды(0x00), команда PING(0x00), версия данных(0x01), контрольная сумма(0x06)
При получении данного пакета устройство должно отправить пакет PONG

Пакет PONG

0x03 0x00 < data length> 0x00 0x01 0x01 < personal addresses count> < addresses> < group addresses count> < addresses> < subscribe addresses count> < addresses> < checksum>
Пакет с высоким приоритетом(0x03), широковещательный(0x00), с данными размером(data length), служебные команды(0x00), команда PONG(0x01), версия данных(0x01), количество адресов устройств(personal addresses count), список адресов(addresses), количество адресов груп(group addresses count), список адресов(addresses), количество адресов подписок(subscribe addresses count), список адресов(addresses), контрольная сумма(checksum)
Пакет содержит список адресов, пакеты для которых устройство желает получать. personal addresses - адреса устойство(в том числе собственный адрес устройства) group addresses - адреса групп, к которым устройство причесляет себя subscribe addressed - адреса устройств, события с которых устройство будет получить Если адресов больше, чем дозволяет размер протокола - допустимо отослать несколько пакетов.
Первым адресом в списке всегда должен быть собственный адрес устройства.
Пакет PONG должен отправляться с задержкой при включении устройства или при получении PING.
Задержка должна быть равна 20мс * адрес устройства
Протокол позволяет обрабатывать одновременное получение данных от множества источников, но буффер имеет ограниченный размер. Соответственно, если большое количество устройств одновременно откликнуться на PING или будут одновременно включены и сразу отправят PONG - часть пакетов может потеряться, что крайне не желательно в случае данного пакета.

Дополнительные пакеты

Пакет REQUEST_INFO

0x03 < slave address> 0x04 0x00 0x20 0x01 < host address> < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(slave address), 3 байта данных(0x04), служебные команды(0x00), команда REQUEST_INFO(0x20), версия данных(0x01), адрес отправителя(host address) контрольная сумма(checksum)
При получении данного пакета, если адрес устройства соответствует переданному, устройство должно ответить пакетом INFO на адрес host address

Пакет RESPONSE_INFO

0x03 < host address> < data length> 0x00 0x21 0x01 < slave address> < device type length> < device type[]> < description length> < description[]> < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(host address), данные длинной(data length), служебные команды(0x00), команда RESPONSE_INFO(0x21), версия данных(0x01), адрес отправителя(slave address), строка с типом устройства(str length, str[]), строка с описанием устройства(str length, str[]), контрольная сумма(checksum)
В этом пакете устройство сообщает свой тип и дается краткое описание. Тип - строка без спецсимволов и пробелов, предназначенная для идентефикации устройства и подбора протокола для работы с ним. Описание не стандартизировано и может содержать любую информацию в любом виде(в том числе в бинарном).

Пакет LOG

0x03 0x00 <data length+3> 0x00 0x02 0x01 0x06
Пакет с высоким приоритетом(0x03), широковещательный(0x00), data length+2 байт данных, служебные команды(0x00), команда LOG(0x02), версия данных(0x01), data - данные лога, контрольная сумма(0x06)
data length не больше 200. Если в sendLog передать строку длиной больше 200 - она обрежется до этой длины. Пакеты LOG отправляются устройством только если переменная LOG_ENABLE(uint8_t) больше 0. При каждом запуске устройства данная переменная уменьшается на 1. Если мы хотим получать лог только до следующего перезапуска - прописываем 1. И после перезапуска отправка логов прекратится.

Принципы управления устройством

Все взаимодействия между устройствами организуется через чтение и запись переменных. Переменная может быть одного из трех видов:

  1. config - переменная используется для настройки поведения и хранится в EEPROM
  2. state - переменная определяет некое поведение устройства и хранится в RAM
  3. command - переменная нигде не хранится и может быть только записана Переменная может быть readonly, writeonly и readwrite

Типы переменных

название-размер-enum index
uint8_t 1 1
uint8_t 1 беззнаковое целое
uint16_t 2 2
uint16_t 2 беззнаковое целое
ufixfloat16 2 3
uint8_t 1 беззнаковая целая часть
uint8_t 1 беззнаковая дробная часть
fixfloat16 2 4
uint8_t 1 целая часть со знаком
uint8_t 1 беззнаковая дробная часть
string16 16 5
uint8_t[16] 16 строка длинной 16 символов. Если строка меньше 16 символов - остальные символы забиваются нулями
link 20 6
uint8_t 1 флаг адрес является групповым(1) или персональным(0)
uint8_t 1 адрес устройства
string16 16 название поля
uint8_t 1 номер слота
uint8_t 1 ожидаемый тип(для валидации)

#Пакеты управления переменными

Пакет GET_VARIABLES_COUNT

Запрашивает количество всех переменных, которые доступны для внешнего доступа у устройства
0x03 < device address> 0x04 0x00 0x22 0x01 < self address> < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(device address), 4 байта данных(0x04), служебные команды(0x00), команда GET_VARIABLES_COUNT(0x22), версия данных(0x01), адрес отправителя(self address) контрольная сумма(checksum)

Пакет RESPONSE_VARIABLES_COUNT

Возвращает количество переменных, которые доступны для внешнего доступа у устройства
0x03 < device address> 0x05 0x00 0x23 0x01 < self address> < count> < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(device address), 5 байт данных(0x05), служебные команды(0x00), команда RESPONSE_VARIABLES_COUNT(0x23), версия данных(0x01), адрес отправителя(self address), количество переменных(count), контрольная сумма(checksum)

Пакет GET_VARIABLES

Запрашивает подробную информацию о переменных, начиная с определенной
0x03 < device address> 0x05 0x00 0x24 0x01 < self address> < start index> < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(device address), 5 байт данных(0x05), служебные команды(0x00), команда GET_VARIABLES(0x24), версия данных(0x01), адрес отправителя(self address), переменная начиная с которой нужно отправлять переменные(start index), контрольная сумма(checksum)

Пакет RESPONSE_VARIABLES

Возвращает подробную информацию о переменных, начиная с запрошенной и заканчивая последней(или столько, сколько уместится в пакет)
0x03 < device address> < data length> 0x00 0x25 0x01 < self address> < start index> < last index> [ variables] < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(device address), размер данных(data length), служебные команды(0x00), команда RESPONSE_VARIABLES(0x25), версия данных(0x01), адрес отправителя(self address), первая переменная в списке(start index), последняя переменная в списке(last index), список переменных в формате variable_info [ variables],контрольная сумма(checksum)

Пакет GET_VARIABLE

Запрашивает значение переменной
0x03/0x06 < device/group address> < data length> 0x00 0x26 0x01 < self address> < variable_info> < checksum>
Пакет с высоким приоритетом(0x03 или 0x06), для устройства с адресом(device/group address), размер данных(data length), служебные команды(0x00), команда GET_VARIABLES(0x26), версия данных(0x01), адрес отправителя(self address), переменная (variable_info)(вместо количества слотов содержит индекс слота из которого следует прочитать значение),контрольная сумма(checksum)

Пакет RESPONSE_VARIABLE

Запрашивает значение переменной
0x03 < device address> < data length> 0x00 0x27 0x01 < self address> < variable_info> < variable> < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(device address), размер данных(data length), служебные команды(0x00), команда RESPONSE_VARIABLE(0x27), версия данных(0x01), адрес отправителя(self address), переменная (variable_info)(вместо количества слотов содержит индекс слота из которого прочитано значение), содержимое переменное в зависимости от типа(variable),контрольная сумма(checksum)

Пакет SET_VARIABLE

Устанавливает значение переменной
0x03 < device address> < data length> 0x00 0x28 0x01 < variable_info> < variable> < checksum>
Пакет с высоким приоритетом(0x03), для устройства с адресом(device address), размер данных(data length), служебные команды(0x00), команда SET_VARIABLE(0x28), версия данных(0x01), переменная (variable_info)(вместо количества слотов содержит индекс слота в который следует установить значение), содержимое переменное в зависимости от типа(variable),контрольная сумма(checksum)

Пакет SUBSCRIBE_TO_VARIABLE

Запрашивает/отменяет подписку на изменение переменной
0x03/0x06 < device/group address> < data length> 0x00 0x29 0x01 < variable_info> < subscribe> < priority> < checksum>
Пакет с высоким приоритетом(0x03/0x06), для устройства с адресом(device/group address), размер данных(data length), служебные команды(0x00), команда SUBSCRIBE_TO_VARIABLE(0x29), версия данных(0x01), переменная (variable_info), флаг подписки(1) или отписки(0)(), флаг важности подписки(priority), контрольная сумма(checksum)

Пакет EVENT_VARIABLE_CHANGED

Информирование подписчиков о том, что переменная была изменена
Приоритет выбирается на основе запросов подспичиков, если есть хотя бы один кто хочет максимальный приоритет - шлется по максимуму. < package_info> < device address> < data length> 0x00 0x2A 0x01 < variable_info> < variable> < checksum>
Пакет события с приоритетом в зависимости от подписки(package_info), адрес устройства(device address), размер данных(data length), служебные команды(0x00), версия данных(0x01), команда EVENT_VARIABLE_CHANGED(0x2A), переменная (variable_info)(вместо количества слотов содержит индекс изменившегося слота), содержимое переменной(variable),контрольная сумма(checksum)

Описание структуры variable_info

string16 - название переменной uint8_t - тип переменной uint8_t - количество слотов в переменной(количество элементов в массиве)

About

License:GNU General Public License v3.0


Languages

Language:C++ 95.6%Language:QMake 2.5%Language:Java 1.4%Language:Python 0.3%Language:C 0.3%