Команда mosquitto_sub -h 192.168.1.10 -t "sensors/#" молча зависает без единого сообщения — типичная первая проблема при работе с MQTT-клиентом в Linux, и в большинстве случаев причина кроется в неправильном адресе брокера, закрытом порту 1883 или фильтрах bind_address на стороне сервера. Прежде чем искать сложные причины, проверьте доступность брокера простой командой ping и убедитесь, что порт отвечает.
MQTT — легковесный протокол обмена сообщениями по модели «издатель-подписчик», который стал стандартом для IoT-устройств, домашней автоматизации и телеметрии. В Linux-экосистеме доступно несколько зрелых клиентов: от консольных утилит mosquitto-clients до графических приложений вроде MQTT Explorer и MQTTX. В этом материале разберём установку, базовые команды, настройку TLS и диагностику типовых ошибок подключения.
Какие MQTT-клиенты доступны в Linux
Выбор инструмента зависит от задачи. Для отладки в терминале и скриптов автоматизации подходят консольные утилиты, а для визуального анализа дерева топиков удобнее GUI-приложения.
- 🖥️ mosquitto-clients — консольные утилиты
mosquitto_pubиmosquitto_subот проекта Eclipse Mosquitto, стандарт де-факто для командной строки. - 📊 MQTT Explorer — графический клиент с древовидным отображением топиков и историей сообщений, распространяется как AppImage и через Snap.
- ⚡ MQTTX — кроссплатформенный клиент от команды EMQX, есть и GUI-версия, и CLI (
mqttx-cli). - 🐍 paho-mqtt — библиотека Eclipse Paho для Python, подходит для написания собственных скриптов и демонов.
Если вам нужно лишь разово проверить, публикует ли датчик данные, консольного клиента достаточно. Для постоянного мониторинга шины с десятками топиков графический инструмент сэкономит много времени.
Установка mosquitto-clients в популярных дистрибутивах
Пакет с клиентскими утилитами называется по-разному в зависимости от дистрибутива. В Debian и Ubuntu установка выполняется из стандартного репозитория:
sudo apt update
sudo apt install mosquitto-clients
В Fedora пакет входит в состав основного проекта, а в Arch Linux клиентские утилиты идут вместе с пакетом mosquitto. После установки проверьте доступность команд:
mosquitto_sub --help
mosquitto_pub --help
☑️ Первичная настройка MQTT-клиента
Обратите внимание: пакет mosquitto-clients содержит только клиентов. Если вам нужен ещё и локальный брокер, устанавливайте пакет mosquitto отдельно.
Базовые команды: публикация и подписка
Подписка на топик выполняется командой mosquitto_sub. Флаг -h задаёт адрес брокера, -t — топик, а символ # работает как многоуровневая маска:
mosquitto_sub -h 192.168.1.10 -t "home/#" -v
Флаг -v выводит имя топика вместе с сообщением — без него при подписке на маску вы не увидите, откуда пришли данные. Публикация сообщения выглядит так:
mosquitto_pub -h 192.168.1.10 -t "home/lamp/state" -m "ON"
Полезные дополнительные флаги: -u и -P задают логин и пароль, -p — нестандартный порт, -q — уровень QoS (0, 1 или 2), а -r публикует сообщение с флагом retained, чтобы брокер хранил его для будущих подписчиков.
⚠️ Внимание: передача пароля флагом -P в открытом виде оставляет его в истории shell и списке процессов. Для чувствительных сред используйте файл с учётными данными или переменные окружения с ограниченными правами доступа.
Графические клиенты: MQTT Explorer и MQTTX
Консоль незаменима в скриптах, но при анализе незнакомой MQTT-шины удобнее видеть всё дерево топиков сразу. MQTT Explorer строит иерархию топиков в реальном времени, показывает историю значений и позволяет публиковать сообщения из интерфейса. В Linux приложение обычно доступно как AppImage или через Snap:
sudo snap install mqtt-explorer
Альтернатива — MQTTX от разработчиков брокера EMQX. Помимо настольной версии есть консольный вариант mqttx-cli, который поддерживает одновременные подключения к нескольким брокерам и сохранение профилей. Точные команды установки зависят от формата пакета, поэтому сверяйтесь с официальной документацией проекта.
Оба инструмента поддерживают подключение с авторизацией и TLS. При первом запуске GUI-приложения в headless-окружении (сервер без графики) они не заработают — используйте их на десктопной системе, а на сервере оставайтесь на консольных утилитах.
Сравнение популярных MQTT-клиентов
| Клиент | Интерфейс | Сильная сторона | Кому подойдёт |
|---|---|---|---|
| mosquitto-clients | Консоль | Минимальные зависимости, работа в скриптах | Администраторам, для автоматизации |
| MQTT Explorer | GUI | Дерево топиков и история значений | Анализу незнакомых систем |
| MQTTX | GUI + CLI | Несколько подключений, профили | Разработчикам IoT-приложений |
| paho-mqtt | Библиотека Python | Полный контроль из кода | Написанию демонов и интеграций |
TLS-шифрование и аутентификация
Открытый порт 1883 передаёт данные в незашифрованном виде, включая логин и пароль. Для подключения через TLS обычно используется порт 8883, а клиенту нужно указать CA-сертификат:
mosquitto_sub -h broker.example.com -p 8883 \
--cafile /etc/ssl/certs/ca-certificates.crt \
-u "user" -P "password" -t "telemetry/#"
Если брокер использует самоподписанный сертификат, укажите путь к файлу CA, которым он подписан. Для взаимной аутентификации (клиентский сертификат) добавляются флаги --cert и --key.
⚠️ Внимание: флаг --insecure отключает проверку сертификата и делает соединение уязвимым для атаки «человек посередине». Используйте его только для временной диагностики в изолированной сети, никогда — в рабочем окружении.
Проверка TLS-соединения без MQTT-клиента
Командой openssl s_client -connect broker.example.com:8883 можно проверить цепочку сертификатов брокера до запуска MQTT-клиента. Если handshake завершается ошибкой, проблема в сертификате, а не в настройках клиента.
Диагностика типовых ошибок подключения
Когда клиент не подключается или молчит, идите от сети к приложению. Сначала проверьте, слушает ли брокер порт:
nc -zv 192.168.1.10 1883
- 🔌 Connection refused — брокер не запущен, слушает другой порт или привязан только к localhost (параметр bind_address или listener в конфигурации).
- 🔑 Not authorized (код возврата 5) — неверные логин/пароль либо пользователю запрещён доступ к топику правилами ACL.
- ⏱️ Таймаут без ответа — порт закрыт файрволом; проверьте правила
ufwилиiptablesна стороне брокера. - 📭 Подписка есть, сообщений нет — издатель публикует в другой топик; подпишитесь на
#, чтобы увидеть весь трафик.
Добавьте флаг -d к mosquitto_sub — он включает отладочный вывод, где видны этапы рукопожатия и коды ошибок протокола. Если подписка на # показывает чужие системные топики вроде $SYS/, значит брокер доступен без авторизации — это повод срочно настроить аутентификацию.
FAQ: частые вопросы про MQTT-клиентов в Linux
Чем отличается пакет mosquitto от mosquitto-clients?
Пакет mosquitto — это брокер (сервер), который принимает и маршрутизирует сообщения. Пакет mosquitto-clients содержит только клиентские утилиты mosquitto_pub и mosquitto_sub для подключения к уже работающему брокеру.
Можно ли запустить MQTT-клиент как фоновый сервис?
Да. Обычно пишут небольшой скрипт на Python с библиотекой paho-mqtt или shell-обёртку вокруг mosquitto_sub и оформляют её как systemd-юнит. Утилиты командной строки сами по себе демонами не являются.
Почему mosquitto_sub сразу завершается с ошибкой «Connection refused»?
Наиболее вероятные причины: брокер не запущен, слушает другой порт или привязан только к интерфейсу localhost. Проверьте порт командой nc -zv адрес 1883 и конфигурацию брокера на стороне сервера.
Как подписаться сразу на все топики брокера?
Используйте многоуровневую маску: mosquitto_sub -h адрес -t "#" -v. Учтите, что на загруженном брокере поток сообщений будет очень большим, а доступ к системным топикам $SYS/ может быть ограничен ACL.
Есть ли MQTT-клиент для Linux без графического интерфейса, кроме mosquitto?
Да: консольный mqttx-cli от EMQX, утилита mqttui с интерактивным TUI-интерфейсом, а также библиотеки для скриптов — paho-mqtt для Python и gmqtt для асинхронного кода.