Зима кончается, и это повод подвести очередную черту и рассказать, что нового появилось в MQTT/UDP.
Для начала, ссылки на предыдущие введение и статью.
Спасибо всем, кто с интересом отреагировал и отдельно тем, кто делился мыслями. Вы мне очень помогли с подходом к цифровой подписи. Итак, что изменилось по крупному:
Ну и многое по мелочи: интеграция с OpenHAB, конфиг-файлы и логгинг, проверка совместимости с облачным MQTT сервисом, сделан тестовый пример для Wemos D1 (NodeMCU), сделан тестовый пример для atmega128+ethernet (не ардуино), сделан пример протокольного коннектора на Яве (CCU825), сделан пример информера-контроллера в desktop tray (наконец-то я могу включать свет в комнате в два клика мышки:), и ещё разное.
Теперь по порядку.
Мне стало тесно в рамках пакета MQTT. Я добавил к его пакету хвостовые добавки в виде тег-длина-контент, в которые теперь можно класть необходимые данные. На сегодня это id пакета, id пакета, на который мы отвечаем (для QoS, это ещё в работе) и цифровая подпись, если включена. Планируется также дата-время в миллисекундах момента измерения величины и момента отправки пакета (как паллиатив моменту измерения), ну и далее возможны произвольные расширения в рамках размера UDP пакета.
(SVG не вставляется, иллюстрация вот тут)
Это уже работает везде кроме Lua. (Вообще, Lua меня разочаровал, и держит его только NodeMCU, и то — попробую там перейти на Питон).
К этому весу я подходить боялся, но после появления теговых расширений всё стало достаточно просто. Отправляемый пакет подписывается по стандарту HMAC MD5 (другие я счёл слишком длинными для коротеньких UDP пакетов), на входе делается проверка. Принимать или нет пакет без подписи — оставлено на откуп прикладному коду. Правда, в Яве есть свитч «отвергать всё неподписанное», но это, кажется, максимализм.
По сути всё опять просто: есть десктопная программа (ява, работает везде), которая делает запрос (пакет SUBSCRIBE) на топик определённого вида (
Теперь можно добавить настройки под архитектуру (toolchain) и glue код для целевой ОС или монитора. Это проверено на трёх конфигурациях — unix/cygwin (./configure), mingw и NUT/OS (без configure).
Ну и, наверное, на сегодня всё. Для деталей нет времени, но если будет интерес — напишу подробнее.
Документация по проекту, паче чаяния, пока вполне актуальна, и там прилично написано. Извините за отсутствие русского языка, но времени на это всё очень мало, хочется переводить опираясь на инфраструктуру, а какого-то приемлемого публичного сервиса (онлайн-редактора) для перевода абзац в абзац я пока не нашёл.
Ну и сам репозиторий.
Для начала, ссылки на предыдущие введение и статью.
Спасибо всем, кто с интересом отреагировал и отдельно тем, кто делился мыслями. Вы мне очень помогли с подходом к цифровой подписи. Итак, что изменилось по крупному:
- Появился механизм гибкого расширения протокола: 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 пакетов), на входе делается проверка. Принимать или нет пакет без подписи — оставлено на откуп прикладному коду. Правда, в Яве есть свитч «отвергать всё неподписанное», но это, кажется, максимализм.
Дистанционная конфигурация
По сути всё опять просто: есть десктопная программа (ява, работает везде), которая делает запрос (пакет SUBSCRIBE) на топик определённого вида (
$SYS/conf/#
). Все узлы, которые умеют дистанционно конфигурироваться отвечают текущими значениями конфигурируемых параметров. Программа из этого синтезирует простенький UI с именами и полями ввода, юзер меняет настройки, обратно улетают команды на обновление. Вся инфраструктура в библиотеках, со стороны прикладного кода нужно только выдать список параметров и уметь их записать/прочитать в файл или NVRAM.Архитектуры и системно-зависимый код для Си
Теперь можно добавить настройки под архитектуру (toolchain) и glue код для целевой ОС или монитора. Это проверено на трёх конфигурациях — unix/cygwin (./configure), mingw и NUT/OS (без configure).
Ну и, наверное, на сегодня всё. Для деталей нет времени, но если будет интерес — напишу подробнее.
Документация по проекту, паче чаяния, пока вполне актуальна, и там прилично написано. Извините за отсутствие русского языка, но времени на это всё очень мало, хочется переводить опираясь на инфраструктуру, а какого-то приемлемого публичного сервиса (онлайн-редактора) для перевода абзац в абзац я пока не нашёл.
Ну и сам репозиторий.
multiadmin
Напрашивается вполне логичный вопрос.
Если злоумышленник перехватил пакет с подписью, а потом сам через некоторое время отсылает этот пакет, то что будет?
Пакет будет принят, как подлинный?
dzavalishin Автор
На уровне подписи — да. Но именно поэтому среди планируемых TTR-ов есть дата-время и уже сейчас есть номер пакета. Для защиты от быстрого повтора достаточно номера пакета — можно держать историю принятых пакетов на какое-то время. Для защиты от повтора с длинной задержкой можно опираться на время отправки и отвергать всё, что оправлено, например, более 5 сек тому назад. Конечно, все эти сущности тоже покрыты подписью и не могут быть подменены. Спасибо за вопрос, нужно будет сделать в документации описание.