Зима кончается, и это повод подвести очередную черту и рассказать, что нового появилось в 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).

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

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

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

Комментарии (2)


  1. multiadmin
    15.02.2019 16:21

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

    Напрашивается вполне логичный вопрос.

    Если злоумышленник перехватил пакет с подписью, а потом сам через некоторое время отсылает этот пакет, то что будет?

    Пакет будет принят, как подлинный?


    1. dzavalishin Автор
      15.02.2019 16:25

      На уровне подписи — да. Но именно поэтому среди планируемых TTR-ов есть дата-время и уже сейчас есть номер пакета. Для защиты от быстрого повтора достаточно номера пакета — можно держать историю принятых пакетов на какое-то время. Для защиты от повтора с длинной задержкой можно опираться на время отправки и отвергать всё, что оправлено, например, более 5 сек тому назад. Конечно, все эти сущности тоже покрыты подписью и не могут быть подменены. Спасибо за вопрос, нужно будет сделать в документации описание.