ELXSoftware

ELX-MQTT Broker

Документация

От первого запуска до соединения двух установок мостом. Тот же текст доступен внутри самого брокера, без интернета.

Установка

Брокер — один исполняемый файл. На Linux пакет Debian дополнительно заводит юнит systemd, создаёт рабочий каталог и запускает службу; на Windows файл работает оттуда, куда вы его положили.

Debian / Ubuntu, amd64
wget https://elxsoftware.com/download/elxmqttbroker-linux-amd64
sudo install -m 755 elxmqttbroker-linux-amd64 /usr/local/bin/elxmqttbroker
sudo elxmqttbroker --install-service
sudo systemctl enable --now elxmqttbroker

Для 32- и 64-разрядных ARM-плат всё то же самое — возьмите arm64 или armhf. Что именно у платы, скажет uname -m: aarch64 — это arm64, armv7l — armhf.

Windows
Запустите установщик или распакуйте портативную сборку и откройте elxmqttbroker.exe.
Панель откроется по адресу http://127.0.0.1:8567
Вход по умолчанию: admin / admin
Смените пароль до того, как машину станет видноПервая учётная запись — admin / admin, чтобы первый запуск не требовал настройки. Смените её в панели раньше, чем машина станет доступна откуда-то, кроме вашего стола.

Первый запуск

  1. Откройте http://<адрес>:8567 и войдите.
  2. Смените пароль администратора в меню профиля.
  3. Заведите в разделе Пользователи учётную запись для своих устройств и дайте ей нужные топики — список прав сначала пуст, а пустой список означает отсутствие доступа.
  4. Подключите один клиент и посмотрите, как он появится в Клиентах: это разом подтверждает адрес, порт и пароль.
  5. Опубликуйте пробное сообщение из раздела Публикация и убедитесь, что подписчик его получил.
Если клиент не подключаетсяЛента событий в панели прямо называет причину — неверный пароль, запрещённый топик, несовпадение версии протокола или ошибка TLS. Это быстрее, чем читать журналы самого клиента.

Пользователи и права

У каждой учётной записи есть список правил. Правило — это фильтр топиков, вид доступа (подписка, публикация или оба) и вердикт: разрешить или запретить. Не разрешено ничего, что не написано: запись без правил подключится и не сможет сделать ничего.

ПравилоЧто означает
sensors/# · подписка · разрешитьМожет читать всю ветку датчиков
sensors/kitchen/+ · публикация · разрешитьМожет писать в любой топик одним уровнем ниже kitchen
devices/$u/# · оба · разрешитьМожет всё внутри своей ветки и ничего снаружи
# · оба · запретитьЯвно запрещает всё, что не разрешено выше

Подстановка $u раскрывается в имя учётной записи при подключении. Одно правило поэтому обслуживает тысячу устройств вместо тысячи правил: каждое видит только своё поддерево.

Порядок важенПравила проверяются сверху вниз, и побеждает первое совпавшее. Широкий запрет, поставленный выше узкого разрешения, полностью его закрывает — это обычная причина того, что право «не работает».

Откуда берутся учётные записи

Брокер может держать свой список или спрашивать у чего-то другого. Источник переключается на ходу, без перезапуска, поэтому новый способ можно проверить, пока старый ещё обслуживает.

  • Встроенный. Учётные записи в собственной базе брокера. Подходит для нескольких десятков устройств.
  • MariaDB / MySQL. Ваша таблица, запрос к ней пишется в настройках. Подходит, когда реестр устройств уже где-то есть.
  • SQLite. Файл той же структуры — для системы, которая держит свои данные локально.
  • CSV. Обычный файл, перечитываемый при изменении. Удобно для фиксированного списка, который формирует другой инструмент.
  • JWT. Устройство предъявляет подписанный токен вместо пароля; брокер проверяет подпись и берёт права из его полей.
  • HTTP. Брокер спрашивает вашу службу, можно ли этому клиенту подключиться, и служба отвечает. Всё, что вы уже сделали — блокировка устройств, тарифы, квоты, — начинает действовать без дублирования.

TLS

Укажите брокеру сертификат и ключ — на порту 8883 поднимется шифрованный слушатель; та же пара может использоваться и панелью. Для закрытой сети брокер умеет выпустить самоподписанную пару сам, и этого достаточно, чтобы пароли не ходили по проводу открытым текстом.

Проверить сертификат из командной строки
openssl s_client -connect broker.example.com:8883 -servername broker.example.com </dev/null | head -20
Самоподписанные сертификаты и клиентыКлиент, который проверяет сертификаты, откажется от самоподписанного, пока ему не скажут доверять. Либо добавьте сертификат в хранилище доверенных на стороне клиента, либо возьмите настоящий, — а выключить проверку целиком значит лишить TLS смысла.

Мосты

Мост — это постоянное соединение с другим брокером и список топиков, которые через него переносятся. Направление задаётся для каждого топика: наружу отдаёт местные сообщения, внутрь забирает удалённые, оба делает и то и другое.

  • С любой стороны можно добавить префикс, чтобы сообщения с удалённого объекта приходили под site-b/… и никогда не сталкивались с местными.
  • Защита от петель не даёт отправить обратно сообщение, которое пришло через мост.
  • Разорванное соединение восстанавливается с растущей паузой; очередь тем временем продолжает копиться.
  • TLS и пароли настраиваются для каждого моста отдельно, поэтому у двух объектов могут быть разные сертификаты.
Мост или общая сеть?Мост соединяет двух брокеров через интернет, явно перечисляя, что именно пересекает границу. Если же нужно, чтобы сами машины оказались в одной сети, это другая задача — смотрите ELX-VNetwork.

Отложенная публикация

Публикация в $delayed/<секунды>/<топик> отдаёт брокеру сообщение, которое надо доставить позже. Оно сохраняется, переживает перезапуск и видно в панели, где его можно отменить до срабатывания.

Выключить свет через пять минут
mosquitto_pub -h broker -t '$delayed/300/home/light/kitchen' -m 'off'

Синтаксис совпадает с EMQX, поэтому скрипты, написанные под тот брокер, работают без правок.

Ограничение трафика

Два механизма для разных бед. Ведро токенов на соединение не даёт одному клиенту залить брокер. Правила по топикам решают другую задачу — устройство просто слишком старательное: вместо того чтобы его отключить, поток прореживается до нужной частоты с сохранением самого свежего значения.

ПравилоДействие
sensors/+/raw · 1 в секундуНе чаще сообщения в секунду на топик, побеждает самое новое
debug/# · отбрасыватьОтбрасывается брокером, подписчики этого не видят
Соединение · 200 в секундуПревысивший клиент придерживается, затем отключается

REST API

Панель — клиент того же API, которым можете пользоваться и вы. Создайте токен в настройках, решите, можно ли ему писать, и вызывайте из своей системы.

Завести устройство из скрипта
curl -X POST https://broker.example.com/api/users \
  -H 'Authorization: Bearer <токен>' \
  -H 'Content-Type: application/json' \
  -d '{"name":"sensor-42","password":"...","acl":[{"filter":"devices/sensor-42/#","access":"both","allow":true}]}'
Токены только на чтениеСистеме мониторинга нужна статистика, а не возможность удалять пользователей. Выдайте ей токен только на чтение — и вопрос снимется сам.

Что переживает перезапуск

  • Сохранённые сообщения — последнее значение каждого топика, который просил его сохранить.
  • Постоянные сессии — подписки клиентов, подключившихся с выключенным clean_session.
  • Очереди сообщений QoS 1 и 2 для таких сессий, пока клиента нет.
  • Отложенные сообщения, срок которых ещё не наступил.
  • Пользователи, права, мосты, правила и настройки.

Всё это лежит в одном файле SQLite. Резервная копия брокера — копия этого файла; переезд на другую машину — перенос его туда.

Когда что-то не так

СимптомКуда смотреть
Клиент подключается и тут же отваливаетсяПароль или список прав, запрещающий всё. Лента событий называет причину.
Сообщения публикуются, но никто их не получаетПрава публикующего разрешают запись, а права подписчика не разрешают чтение этого фильтра.
Сохранённое значение не возвращается после перезапускаХранение выключено или рабочий каталог недоступен на запись пользователю службы.
Устройство переподключается по кругуДва клиента с одинаковым идентификатором — каждое соединение выбивает другое.
Клиент с TLS жалуется на сертификатСамоподписанный сертификат, которому клиент не доверяет, или имя, не совпадающее с сертификатом.
Панель недоступна с другой машиныПанель слушает адрес петли; смените адрес привязки в настройках.

Частые вопросы

Где журнал?
На Linux — journalctl -u elxmqttbroker -f. На Windows — окно консоли или файл журнала рядом с исполняемым файлом, когда брокер работает службой.
Как перенести брокер на другую машину?
Остановите службу, скопируйте файл SQLite и сертификаты, запустите брокер на новой машине. Клиентам нужен только новый адрес.
Могут ли два брокера использовать одну базу?
Нет. Каждый брокер владеет своим файлом. Чтобы соединить две установки, используйте мост — он для этого и существует.
Обязательно ли выставлять панель в интернет?
Нет, и лучше не надо. Привяжите её к внутреннему адресу и ходите через частную сеть или SSH-туннель.

Рядом в разделе