Описание протокола и что именно наблюдает swarm
MQTT брокер находится по адресу: x.ks.ua с портом 9001 для WS либо 1883 для TCP. Без сертификатов.
У всех топиков есть префикс из полученного ранее токена. Токеном является MAC адрес HUB
Устройство будет общатся только через свой токен:
/{token}/{cmd}
Чтение запись указывается со стороны устройства:
- R - Устройство будет публиковать данные в данный топик, но не будет подписано на него
- W - Устройство подпишется на данный топик, но не публикует в него
- RW - Устройство подписывается и публикует в данный топик
- E - Устройство подписывается и публикует в данный топик, выполняем топик, указанное действие выполняется только если в данный топик публикуется название топика.
Название | R/W/RW/E | Тип данных | описание |
---|---|---|---|
/reg | W | uint32_t | Регистрация устройства на сервере |
/hub | RW | uint32_t | Поиск хаба по ID устройства |
/{token}/time | W | uint32_t | Сервер обновляет время на хабе и всех подключенных устройствах . Завершает регистрацию устройства |
/{token}/lqi | R | int32_t | Отдает уровень сигнала (Link Quality information) |
/{token}/lifetime | W | uint32_t | Максимальное время между отправкой статуса устройством. Указано в секундах. По-умолчанию 60 сек. |
/{token}/info | R | uint32_t | Данные о подключенном хабе, отправляются после регистрации, отдает список подключенных устройств |
/{token}/status | R | uint32_t | Текущее состояние устройства. Хранит число событий с момента регистрации |
/{token}/ping | E | Простой запрос, что бы убедится, что девайс еще с нами,девайсы всегда возвращает "OK" | |
/{token}/error | W | uint32_t | Номер ошибки хаба |
/{token}/{instance-id}/{reg} | RW | uint32_t | Доступ к регистрам. По умолчанию данное устройство имеет instance-id = reg[0] |
/{token}/{instance-id}/type | RE | uint32_t | Тип устройства |
/{token}/{instance-id}/version | E | char[128] | Версия устройства, максимальный размер строки: 128 байт |
/{token}/{instance-id}/status | R | uint32_t | Статус устройтсва (какое количество событий произошло с момента регистрации) |
/{token}/{instance-id}/read | RW | {uint32_t; uint8_t} | Чтение памяти устройства (расписание, итд), По умолчанию данное устройство имеет instance-id = reg[0] |
/{token}/{instance-id}/write | RW | {uint32_t; base64} | Запись памяти устройства По умолчанию данное устройство имеет instance-id = reg[0] |
/{token}/{instance-id}/reset | RW | uint32_t | Сброс устройства в состояние по-умолчанию (то же 31 бит, 8-го регистра) (0/1). |
Для сброса необходимо опубликовать значение instance-id |
Топик /hub используется для поиска устройства без знания токена хаба, пример:
111222345 => /hub # Клиент отправляет серийный номер устройства на броке
/hub => aa:bb:cc:dd:ee:ff # Хаб который содержит данное устройство отвечает со своим токеном
Передача значений регистров всегда происходит в формате беззнакового 32 битного числа (uint32) пример:
/b8:27:eb:f2:97:2c/21032420/11 => 1106352370
Каждый регистр отвечает за разный функционал, для получения функционального значения необходимо произвести приведение типов. На данный момент, описание типов и функционального назначения выполняется в файле 'devices.json'
Используемые типы в devices.json
Название | Параметры | Описание |
---|---|---|
int | step - Размер приращения (Шаг) | Знаковое число, в конвертации не нуждается. |
minimum - Минимальное значение | Пример: 12345 => 12345 | |
maximum - Максимальное значение | ||
unixtime | - | Время в секундах от 01.01.1970 00:00:00 |
Пример: 1627260919 => Mon Jul 26 2021 00:55:19 GMT+0000 | ||
float | step - Размер приращения (Шаг) | Число с плавающей запятой IEE754 |
minimum - Минимальное значение | Пример: 1106352370 => 30.1996803284 | |
maximum - Максимальное значение | см: https://www.h-schmidt.net/FloatConverter/IEEE754.html | |
bitfield | bits - Описание битов | Битовое значение. В описании битов указывается назначение (name) и возможность изменения (readonly) |
Пример: 72 => 0100 1000 => Включен 3-ий и 6-ой бит (8 + 64 = 72) |
Устройство описывается в файле devices.json и имеет следующую структуру:
{
"Тип устройства (int)" : {
"name" : "Имя типа устройства, пример 'Терморегулятор'",
"regs" : [ // Описание регистров устройства
{
"id": "Номер регистра (int)",
"name": "Функциональное назначение регистра",
"readonly": "Регистр только для чтения или нет",
"type": { // Тип данных
"name": "Название типа данных"
...
}
},
...
]
}
}