Умный дом держится на сообщениях: датчик сообщает температуру, выключатель — состояние, шлюз — событие. Если каждое устройство общается напрямую с каждым, получается хаос из соединений и паролей. 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 и мост. Такой порядок избавляет от ситуации, когда «умный дом» перестаёт отвечать после первого же обновления пароля.