Умный дом своими руками. Часть вторая: описание протокола
Продолжение цикла статей об умном доме. Начало было здесь.
Протокол состоит из четырех частей:
Поле |
Длина |
Постоянное |
Стартовые байты |
2 |
F0FF |
Пакет данных |
До 24 |
- |
Чек сумма |
1 |
- |
Стоповые байты |
2 |
F0FE |
Стартовые байты – передаются всегда в начале пакета, имеют всегда одно и тоже значение F0FF. Служат для разбора поступивших данных и разделения потока данных на пакеты.
Пакет данных – непосредственно сами полезные данные, могут иметь длину до 24 байт и не могут быть пустыми. Значение 24 обусловлено ограничения буфера
Чек сумма – рассчитывает по принципу контрольной суммы по AppNote 27 от Maxim. Исторически был использован от первого устройства который работал с
Стоповые байты – передаются всегда в конце пакета данных, имеют всегда одно и тоже значение F0FE. Служат для разбора поступивших данных и разделения потока данных на пакеты.
По
Для двухбайтных данных в Пакете данных сначала идет младший, потом старший байт.
Применяется следующий общий принцип формирования протокола:
- собирается Пакет данных;
- рассчитывается CRC для собранного пакета данных;
- дописывается стартовый байт;
- дописываем стоповый байт.
Далее описываются все части Пакета данных.
Структура Пакета данных
Поле |
Длина |
Постоянное |
ID устройства (передатчика) |
2 |
- |
ID устройства (приёмника)
|
2 |
- |
Команда |
1 |
- |
Параметры команды |
до 19 |
- |
ID устройства (передатчика) – представляет собой два байта, содержащие уникальный идентификатор устройства, передавшего данные. Не может быть пустым или иметь значение равное нулю. Идентификатор устройства задается в прошивке и должен быть уникальным в рамках всей сети.
ID устройства (приёмника) - представляет собой два байта, содержащие уникальный идентификатор устройства, которому предназначены данные. Не может быть пустым, но может содержать идентификатор 0000, это считается широковещательной передачей, адресованной всем устройствам, но такие команды устройства по умолчанию не обрабатывают.
Команда – представляет собой один байт, характеризующий назначение Пакета данных, принципа и структуры разбора Параметров Пакета данных. Для каждого действия имеет уникальное значение. Например, запрос температуры и ответ содержащий температуру будут иметь разные значения в поле Команда. Это позволяет реализовать уникальный обработчик для каждого Пакета данных в зависимости от кода Команды.
Параметры команды
Структура пакета данных
ID устройства (2 байта) |
ID устройства (2 байта) |
Команда (1 байт) |
Параметры (длина до 19 байт) |
Структура ID устройства:
Тип канала + тип устройства (1 байт) 8-ой бит: 0-Rs485; 1-радиоканал; Остальные 7 бит: Тип устройства |
Уникальный номер (1 байт) |
Тип устройства (красным выделено реализованое):
Ретранслятор: 00000001b = 01h
Сценарист: 00000010b = 02h
Гигрометр (влажность): 00000011b = 03h
Контроллер DS18b20: 00000100b = 04h
Модули реле: 00000101b = 05h
Rs485 пульт с ЖКИ: 00000110b = 06h
Диммер: 00000111b = 07h
IR приёмник: 00001000b = 08h
Logger: 00001001b = 09h
Barometr: 00001010b = 0Ah
Структура Команда (DEC)
Код команды (DEC) |
Команда |
Параметры команды |
Длина параметра (байты) |
1 |
Квитанция (подтверждение получения пакета и взятие его в исполнение) |
CRC подтверждаемой команды |
1 |
2 |
Запрос на присутствие (Ping) |
Нет |
|
3 |
Ответ на присутствие (Pong) |
Нет |
|
4 |
Запрос значений температуры с датчиков |
ROM датчика или пусто для всех датчиков |
до 8 байт |
5 |
Ответ со значением температуры с датчиков |
ROM датчика + Значение температуры[4] |
до 12 байт |
6 |
Запрос значения задержки опроса датчиков |
нет |
|
7 |
Ответ со значением задержки опроса датчиков |
Кол-во секунд от 0 до 65535 |
2 |
8 |
Установить значение задержки опроса датчиков |
Кол-во секунд от 0 до 65535 |
2 |
9 |
Запрос значения скорость передачи данных |
нет |
|
10 |
Ответ со значением скорость передачи данных |
Значение скорости от 9600 до 65535 |
2 |
11 |
Установить скорость передачи данных (по умолчанию 9600 бод) |
Значение скорости от 9600 до 65535 |
2 |
12 |
Включить вывод отладочных сообщений в шину |
Нет |
|
13 |
ВЫключить вывод отладочных сообщений в шину |
нет |
|
14 |
Запрос количества найденных DS18X20 |
нет |
нет |
15 |
Количество найденных DS18X20 |
Количество датчиков |
1 |
16 |
Запрос статистики работы устройства |
Нет |
нет |
17 |
Ответ со статистикой |
|
12 |
18 |
Запрос на пересканирование DS18X20 |
нет |
нет |
19 |
Ответ при разрядившейся батарее у датчика с батарейным питанием |
нет |
|
21 |
Запросить значение влажности |
нет |
|
22 |
Ответ со значением влажности |
ROM датчика[8] + % влажности воздуха[2] |
10 |
23 |
Запрос атмосферного давление |
нет |
нет |
24 |
Ответ атмосферного давление |
ROM датчика[8] + % давление в мм. Ртутного столба[2] |
1 |
25 |
запрос напряжения на питающей батарее устройства |
Нет |
нет |
26 |
выдача напряжения на питающей батарее устройства |
ROM датчика[8] + Напряжение питания *10 |
10 |
99 |
Отладочное сообщение |
|
4 |
Примеры
Все примеры даны для реальных устройств, чтобы было понимание конкретики. В описании всех команд (таблицы) не указано поле со стартовым, стоповым байтами и crc (для сокращения размера документа). В пакете, эти байты приведены.
Все запросы и ответы приведены для формата, который использует
Квитанция (подтверждение на запрос)
ID устройства (передатчика) (2 байта) |
ID устройства (приёмника) (2 байта) |
Команда (1 байт) |
CRC (1 байт) |
0201h |
0401h |
01h |
08h |
Rs485, сценарист |
Контроллеру ds18b20 |
квиток |
Crc команды |
Пакет: $F0$FF$02$01$04$01$01$08$F0$FE
Ping устройства «контроллер ds18b20» от Logger
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
0901h |
0401h |
02h |
Logger |
Rs485, контроллер ds18b20 |
Ping (запрос)
|
Пакет: $F0$FF$02$01$04$01$02$EA$F0$FE
Ответ на «Пинг» устройства от контроллер ds18b20 на Logger
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
0401h |
0901h |
02h |
Rs485, контроллер ds18b20 |
Logger |
Ping (ответ) |
Пакет: $F0$FF$04$01$02$01$02$A7$F0$FE
Запрос на отправку температуры с датчиков ds18b20
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
Значение |
0201h |
0401h |
04h |
00h |
Сценарист |
Rs485, контроллер ds18b20 |
Температура
|
Получить температуру со всех датчиков |
Пакет: $F0$FF$02$01$04$01$04$00$3D$F0$FE
Отправка температуры от ds18b20
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
Параметр |
Значение |
crc |
0401h |
0000h |
05h |
28f2602402000022 |
e204 |
34h |
Rs485, контроллер ds18b20 |
всем |
Ответ с температурой
|
28f2602402000022 |
E204(HEX) |
|
Пакет: $F0$FF$04$01$00$00$05$28$f2$60$24$02$00$00$22$e2$04$31$F0$FE
Установка задержки опроса датчиков температуры ds18b20
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
Параметр |
Значение |
0201h |
0401h |
05h |
08h |
2800h |
Сценарист |
Rs485, контроллер ds18b20 |
Получить/установить задержку опроса датчиков
|
Установить значение задержки опроса датчиков |
0028h=40d секунд |
Пакет: $F0$FF$02$01$04$01$08$28$00$4F$F0$FE
Установка скорости передачи данных в 1920 бод
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
Значение |
0201h |
0401h |
0Bh |
4B00h |
Сценарист |
Rs485, контроллер ds18b20 |
Установить скорость передачи данных
|
19200 бод |
Пакет: $F0$FF$02$01$04$01$0B$00$4B$7A$F0$FE
Включить вывод отладки в USART
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
0201h |
0401h |
0Ch |
Сценарист |
Rs485, контроллер ds18b20 |
Включить вывод отладки
|
Пакет: $F0$FF$02$01$04$01$0C$F5$F0$FE
Выключить вывод отладки в USART
ID устройства (передатчика) (4 байта) |
ID устройства (приёмника) (4 байта) |
Тип переменной (1 байт) |
0201h |
0401h |
0Dh |
Сценарист |
Rs485, контроллер ds18b20 |
ВЫключить вывод отладки
|
Пакет: $F0$FF$02$01$04$01$0D$AB$F0$FE