Умный дом держится на сообщениях: датчик сообщает температуру, выключатель — состояние, шлюз — событие. Если каждое устройство общается напрямую с каждым, получается хаос из соединений и паролей. MQTT-брокер решает это как почтовое отделение: издатель кладёт сообщение в топик, подписчик забирает его оттуда. Mosquitto — самый распространённый брокер для таких задач на Linux.

Зачем нужен брокер

MQTT работает по модели publish/subscribe. Клиент публикует сообщение в топик вида home/kitchen/temperature, а брокер рассылает его всем подписчикам. Издатель не знает, кто слушает, и не хранит список получателей. Это снижает связность и позволяет менять устройства, не перенастраивая остальные.

У протокола три уровня качества обслуживания (QoS). QoS 0 — «отправил и забыл», QoS 1 гарантирует доставку хотя бы раз, QoS 2 — ровно один раз. Для телеметрии обычно хватает первого, для команд включения — QoS 1 или 2.

  • Retained-сообщение хранится в брокере и сразу отдаётся новому подписчику.
  • Last Will сообщает о внезапном отключении устройства.
  • Сессия с clean session false копит сообщения для спящего клиента.
  • Топики образуют иерархию, а знаки + и # служат для подстановки.

Установка и базовая настройка

В Debian и Ubuntu пакет ставится из репозитория. С версии 2.0 брокер по умолчанию слушает только localhost и не принимает анонимные подключения — это разумная защита, которую не стоит отключать ради удобства.

sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable --now mosquitto
sudo systemctl status mosquitto
sudo journalctl -u mosquitto -n 30 --no-pager

Конфигурация хранится в /etc/mosquitto/mosquitto.conf и подключаемых файлах из conf.d. Явно задайте listener, файл паролей и ACL. Журналирование в systemd удобнее файла: записи попадают в общий журнал и ротируются автоматически.

listener 1883 192.168.10.10
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl
persistence true
persistence_location /var/lib/mosquitto/
log_dest journal
max_queued_messages 1000

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

Заведите отдельного пользователя для Home Assistant, для каждого датчика и для моста. Так при компрометации одного устройства не придётся менять пароли во всей системе. Файл паролей создаётся с флагом -c, а последующие записи добавляются без него.

sudo mosquitto_passwd -c /etc/mosquitto/passwd homeassistant
sudo mosquitto_passwd /etc/mosquitto/passwd sensor_kitchen
sudo chown root:mosquitto /etc/mosquitto/passwd
sudo chmod 640 /etc/mosquitto/passwd

ACL ограничивает топики. Правила до первой строки user относятся к анонимным клиентам, и оставлять их не стоит. Шаблон pattern с %u подставляет имя пользователя и удобен для однотипных устройств.

user homeassistant
topic readwrite home/#

user sensor_kitchen
topic write home/kitchen/temperature

pattern readwrite devices/%u/state

Проверка обмена

Подписка и публикация из консоли — самый быстрый способ проверить брокер и права. Флаг -v показывает топик рядом с payload, -d печатает служебный обмен. Если команда молча висит, значит сообщение не пришло, а не «сломался вывод».

mosquitto_sub -h 192.168.10.10 -u homeassistant -P 'пароль' -t 'home/#' -v
mosquitto_pub -h 192.168.10.10 -u sensor_kitchen -P 'пароль' \
  -t home/kitchen/temperature -m 21.4 -q 1
mosquitto_sub -h 192.168.10.10 -u homeassistant -P 'пароль' \
  -t '$SYS/broker/clients/connected' -v

Служебные топики $SYS дают число клиентов, объём сообщений и аптайм. Забытое retained-сообщение удаляется публикацией пустого payload с флагом -r: подписчики получат очистку, а брокер перестанет отдавать старое значение.

TLS для сети и моста

Внутри доверенного VLAN можно обойтись паролем, но трафик по Wi-Fi лучше шифровать. Самоподписанный сертификат подходит для домашней сети, если клиенты получают копию CA. Для Mosquitto задайте отдельный listener на 8883.

sudo openssl req -new -x509 -days 3650 -nodes \
  -keyout /etc/mosquitto/certs/server.key \
  -out /etc/mosquitto/certs/server.crt \
  -subj "/CN=mqtt.home.lan"
listener 8883 192.168.10.10
cafile /etc/mosquitto/certs/server.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
tls_version tlsv1.2

Мост между брокерами

Если дача и квартира находятся в разных сетях, поднимать единую сеть не обязательно. Достаточно соединить брокеры мостом: один подписывается на топики другого и пересылает их. Направление задаётся словом in или out, а QoS ограничивает поток.

connection dacha
address 192.168.20.10:1883
topic home/# out 1
remote_username bridge
remote_password пароль
bridge_cafile /etc/mosquitto/certs/server.crt
restart_timeout 20

Диагностика

При проблемах остановите службу и запустите брокер вручную с флагом -v: вывод покажет, какой клиент и с какими правами подключается. Проверьте, что порт слушается на нужном интерфейсе, а не только на loopback, и что межсетевой экран не режет 1883.

sudo mosquitto -c /etc/mosquitto/mosquitto.conf -v
sudo journalctl -u mosquitto -n 50 --no-pager
sudo ss -ltnp | grep -E '1883|8883'
mosquitto_sub -d -h 127.0.0.1 -t test -v

Ошибка «not authorised» почти всегда означает неверный ACL или отсутствие пользователя в password_file. Ошибка TLS означает несовпадение имени в сертификате или просроченную дату. Проверяйте это до того, как менять конфигурацию устройства.

Отдельная история — устройства на батарейках. Они подключаются редко, поэтому сессию им продлевают, а интервал опроса увеличивают. Если датчик пропадает из сети, сначала смотрите его Last Will и число переподключений, а уже потом трогайте настройки брокера.

Чек-лист

  • Анонимный доступ выключен, у каждого устройства свой пароль.
  • ACL ограничивает только нужные топики.
  • Порт 1883 недоступен из интернета.
  • Retained-сообщения проверены и не содержат мусора.
  • Файлы паролей и ACL скопированы отдельно от брокера.
  • Настроены резервная копия конфигурации и ротация журналов.

Итог

Mosquitto — небольшой, но полноценный брокер: он держит сотни устройств на слабом железе и не требует базы данных. Настройка сводится к трём вещам — слушающий интерфейс, пароли и ACL. Начните с локального контура, проверьте обмен через консольные клиенты, затем добавьте TLS и мост. Такой порядок избавляет от ситуации, когда «умный дом» перестаёт отвечать после первого же обновления пароля.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте