MQTT-UDP, предвесенние итоги: дистанционная конфигурация и цифровая подпись

в 12:06, , рубрики: C, IoT, mqtt, openhab, python, smart home, программирование микроконтроллеров, Разработка для интернета вещей, умный дом

Зима кончается, и это повод подвести очередную черту и рассказать, что нового появилось в MQTT/UDP.

Для начала, ссылки на предыдущие введение и статью.

Спасибо всем, кто с интересом отреагировал и отдельно тем, кто делился мыслями. Вы мне очень помогли с подходом к цифровой подписи. Итак, что изменилось по крупному:

  • Появился механизм гибкого расширения протокола: Tagged Tail Records, TTRs
  • На его базе сделана схема цифровой подписи пакетов
  • Сделан механизм дистанционной конфигурации компонент
  • Поднят полный цикл CI: сборка, юнит-тесты, сквозные тесты протокола (4*4 языка программирования)
  • Реализация на Си теперь поддерживает разные архитектуры и умеет интегрироваться с разными ОС и мониторами.
  • Есть публичные пакеты для Питона и Луа, хотя, конечно, они уже устарели.

Ну и многое по мелочи: интеграция с OpenHAB, конфиг-файлы и логгинг, проверка совместимости с облачным MQTT сервисом, сделан тестовый пример для Wemos D1 (NodeMCU), сделан тестовый пример для atmega128+ethernet (не ардуино), сделан пример протокольного коннектора на Яве (CCU825), сделан пример информера-контроллера в desktop tray (наконец-то я могу включать свет в комнате в два клика мышки:), и ещё разное.

Теперь по порядку.

Тегированные Хвостовые Записи

Мне стало тесно в рамках пакета MQTT. Я добавил к его пакету хвостовые добавки в виде тег-длина-контент, в которые теперь можно класть необходимые данные. На сегодня это id пакета, id пакета, на который мы отвечаем (для QoS, это ещё в работе) и цифровая подпись, если включена. Планируется также дата-время в миллисекундах момента измерения величины и момента отправки пакета (как паллиатив моменту измерения), ну и далее возможны произвольные расширения в рамках размера UDP пакета.

(SVG не вставляется, иллюстрация вот тут)

Это уже работает везде кроме Lua. (Вообще, Lua меня разочаровал, и держит его только NodeMCU, и то — попробую там перейти на Питон).

Цифровая подпись

К этому весу я подходить боялся, но после появления теговых расширений всё стало достаточно просто. Отправляемый пакет подписывается по стандарту HMAC MD5 (другие я счёл слишком длинными для коротеньких UDP пакетов), на входе делается проверка. Принимать или нет пакет без подписи — оставлено на откуп прикладному коду. Правда, в Яве есть свитч «отвергать всё неподписанное», но это, кажется, максимализм.

Дистанционная конфигурация

image

По сути всё опять просто: есть десктопная программа (ява, работает везде), которая делает запрос (пакет SUBSCRIBE) на топик определённого вида ($SYS/conf/#). Все узлы, которые умеют дистанционно конфигурироваться отвечают текущими значениями конфигурируемых параметров. Программа из этого синтезирует простенький UI с именами и полями ввода, юзер меняет настройки, обратно улетают команды на обновление. Вся инфраструктура в библиотеках, со стороны прикладного кода нужно только выдать список параметров и уметь их записать/прочитать в файл или NVRAM.

Архитектуры и системно-зависимый код для Си

Теперь можно добавить настройки под архитектуру (toolchain) и glue код для целевой ОС или монитора. Это проверено на трёх конфигурациях — unix/cygwin (./configure), mingw и NUT/OS (без configure).

Ну и, наверное, на сегодня всё. Для деталей нет времени, но если будет интерес — напишу подробнее.

Документация по проекту, паче чаяния, пока вполне актуальна, и там прилично написано. Извините за отсутствие русского языка, но времени на это всё очень мало, хочется переводить опираясь на инфраструктуру, а какого-то приемлемого публичного сервиса (онлайн-редактора) для перевода абзац в абзац я пока не нашёл.

Ну и сам репозиторий.

Автор: dzavalishin

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js