MQTT в Meshtastic
MQTT — протокол передачи сообщений через интернет. В Meshtastic работает как двунаправленный мост между LoRa-mesh и интернетом.
Что даёт
- MQTT-шлюз — стационарная нода с Wi-Fi публикует все пакеты из эфира в MQTT-брокер и принимает обратно
- Мост между сетями — два удалённых mesh-острова (например, в разных городах) объединяются через интернет в одну сеть
- Мониторинг — батарея, GPS, телеметрия всех нод в реальном времени
- Интеграция — Home Assistant, Node-RED, Telegram-боты, Grafana
- Резервный канал — если LoRa заглушена, сообщения идут через интернет
Два способа подключения к MQTT
1. Через Wi-Fi (на самой ноде)
Нода подключается к Wi-Fi и напрямую соединяется с MQTT-брокером. Wi-Fi и BLE взаимоисключающие — пока нода на Wi-Fi, приложение по Bluetooth не подключится.
# В настройках MQTT: proxy_to_client_enabled = false
meshtastic --port $PORT --set mqtt.proxy_to_client_enabled false2. Через Bluetooth-прокси (через телефон)
Нода отправляет MQTT-трафик телефону по BLE, а телефон пересылает его в интернет. Wi-Fi на ноде не нужен, BLE продолжает работать.
# В настройках MQTT: proxy_to_client_enabled = true
meshtastic --port $PORT --set mqtt.proxy_to_client_enabled trueПодходит для мобильных нод и nRF52 (у которых нет Wi-Fi).
Архитектура gateway-ноды
Любая нода с Wi-Fi (ESP32) может стать шлюзом. Остальные ноды не нуждаются в настройке MQTT — gateway сам видит их пакеты в эфире.
[Мобильная нода] ──LoRa──→ [Gateway-нода] ──Wi-Fi──→ [MQTT-брокер]
CLIENT CLIENT_BASE + GW │
┌──────▼──────┐
│ Home Assist │
│ Node-RED │
│ Telegram │
└─────────────┘
Рекомендованная роль для шлюза
Приём пакетов не зависит от роли — любая роль слышит эфир одинаково. Для MQTT-шлюза подходят CLIENT, CLIENT_BASE или CLIENT_MUTE. ROUTER и ROUTER_LATE добавляют обязательную ретрансляцию, что увеличивает airtime без пользы для шлюза.
Uplink и Downlink
- Uplink (
uplink_enabled) — mesh → MQTT. Пакеты из эфира публикуются в брокер. - Downlink (
downlink_enabled) — MQTT → mesh. Пакеты из брокера передаются в эфир. - Настраиваются на каждый канал отдельно.
Мост между удалёнными сетями
MQTT позволяет объединить два mesh-острова через интернет:
Город А Город Б
[Нода 1] ──LoRa──→ [GW A] [GW B] ──LoRa──→ [Нода 3]
[Нода 2] ──LoRa──↗ │ │ ──LoRa──→ [Нода 4]
▼ ▼
┌──────────────────────────┐
│ MQTT-брокер │
└──────────────────────────┘
Для пользователей выглядит как единая mesh-сеть. Но это не улучшение радио-покрытия — если интернет пропал, связь между городами пропадает тоже.
Структура MQTT-топиков
msh/RU/2/
├── e/ ← protobuf (зашифрованные)
│ └── LongFast/!nodeId
├── json/ ← JSON (для HA, Node-RED)
│ └── LongFast/!nodeId
│ ├── текст, телеметрия, позиция, nodeinfo
│ └── traceroute, neighborinfo, detection sensor
└── stat/!nodeId ← статистика шлюза
- Protobuf — зашифрованы ключом канала, нативный формат mesh
- JSON — не зашифрованы, удобны для HA/Node-RED. Работают только на ESP32 (не nRF52)
Интеграция с Home Assistant
Что можно
- Сенсоры: батарея, напряжение, SNR/RSSI, температура, uptime каждой ноды
- Карта: GPS-позиции всех нод на карте HA
- Уведомления: новое сообщение в mesh → push на телефон; батарея < 20% → алерт
- Отправка сообщений: из HA dashboard прямо в mesh
- Автоматизации: триггеры по событиям mesh (сообщение, нода пропала, датчик сработал)
Варианты интеграции
- MQTT-сенсоры в YAML — ручная настройка, полный контроль
- HACS-интеграция (meshtastic/home-assistant) — автоматическое создание сенсоров
- Node-RED — визуальные workflow, гибкие сценарии
Настройка gateway-ноды
Баг #9107 (firmware 2.7.15): MQTT-настройки не сохраняются если менять одновременно с
mqtt.enabled. Workaround — 3 отдельных шага с ребутом между каждым. GitHub Issue
# Wi-Fi
meshtastic --port $PORT \
--set network.wifi_ssid "<SSID>" \
--set network.wifi_psk "<PASSWORD>" \
--set network.wifi_enabled true
# После ребута BLE отключится. Дальше можно управлять через TCP:
# meshtastic --host <IP> ...
# Шаг 1: Отключить MQTT
meshtastic --port $PORT --set mqtt.enabled false
# Ждать ребут ~35 сек
# Шаг 2: Настроить параметры (MQTT выключен)
meshtastic --port $PORT \
--set mqtt.address "<BROKER_IP>" \
--set mqtt.username "<USER>" \
--set mqtt.password "<PASSWORD>" \
--set mqtt.encryption_enabled true \
--set mqtt.json_enabled true \
--set mqtt.tls_enabled false
# Ждать ребут ~35 сек
# Шаг 3: Включить MQTT
meshtastic --port $PORT --set mqtt.enabled true
# Ждать ребут ~35 сек
# Uplink/downlink на каждый канал
meshtastic --port $PORT \
--ch-set uplink_enabled true --ch-index 0 \
--ch-set downlink_enabled true --ch-index 0
# Рекомендуемые LoRa-настройки для шлюза
meshtastic --port $PORT \
--set lora.ignore_mqtt true \
--set lora.config_ok_to_mqtt true \
--set neighbor_info.enabled true \
--set mqtt.map_reporting_enabled trueСовет: Если USB serial timeout’ит после ребута — использовать TCP:
meshtastic --host <IP>. CLI версия должна быть ≥2.7.8 для прошивки 2.7.15.
Появление на карте без MQTT
Не обязательно настраивать MQTT на каждой ноде. Достаточно двух настроек:
# Разрешить соседним шлюзам пересылать твои данные в MQTT
meshtastic --port $PORT --set lora.config_ok_to_mqtt true
# Включить отправку позиции на каналах с uplink
meshtastic --port $PORT --ch-index 0 --ch-set module_settings.position_precision 14Если в радиусе есть хотя бы один шлюз с настроенным MQTT — твоя нода появится на карте автоматически.
Брокер: публичный vs свой
| Публичный (mqtt.meshtastic.org) | Свой (Mosquitto) | |
|---|---|---|
| Настройка | нулевая | нужен сервер |
| Приватность | нет — всё в открытом доступе | полная |
| Zero-hop | да — пакеты не ретранслируются дальше | нет ограничений |
| LongFast uplink | запрещён | можно |
| Координаты | обрезаны (10-16 бит) | полные |
| TLS | да | настраиваемо |
Для приватной сети — свой Mosquitto на Raspberry Pi или VPS.
Ограничения
- Wi-Fi и BLE взаимоисключающие на ESP32 — включив Wi-Fi, потеряешь Bluetooth (подключение телефона)
- JSON не зашифрован — для приватности свой брокер + TLS
- Gateway должен быть стационарным (постоянный Wi-Fi)
- Канал 0 (LongFast) нельзя аплинкить на публичный брокер
- MQTT не улучшает LoRa-покрытие — это параллельный канал через интернет, не усиление радио
- NodeDB >100 нод деградирует Wi-Fi на ESP32 — пинг вырастает до 1000+ мс, TCP-соединения таймаутят. Лечится ребутом ноды. В firmware v2.7.19 добавлен graduated NodeInfo scaling для смягчения проблемы
MQTT vs LoRa-роутер
| Способ расширения | Через LoRa (ROUTER) | Через MQTT (Gateway) |
|---|---|---|
| Нужен интернет | нет | да |
| Увеличивает радио-покрытие | да | нет |
| Связь между городами | нет | да |
| Надёжность | высокая (автономный) | зависит от Wi-Fi |
| Мониторинг/HA | нет | да |
Региональные брокеры
Рязань (RZN_Meshtastic)
- Адрес:
109.196.164.62 - Порт:
1883(MQTT, без TLS) - Дашборд: RZN_Meshtastic Dashboard — карта, ноды, трассировки (powered by Malla)
- Статистика (март 2026): ~371 нода, 135 активных, 23 шлюза
onemesh.ru (федеративная сеть)
- Адрес:
mqtt.onemesh.ru - Порт:
1883 - Пароль:
onecat - Root:
msh/RU/<REGION>(напримерmsh/RU/RZNдля Рязани) - Карта: map.onemesh.ru
- Username-режимы:
onemesh— uplink only, downlink блокируется на брокереonemeshz— downlink zero-hop (пакеты не ретранслируются)onemeshd— полный downlink (не рекомендуется — загружает эфир)
- Map report: precision 11 (~729м, приватность), interval 3600s
С username onemesh флаг downlink_enabled: true на ноде безвреден — брокер всё равно не отдаёт downlink.
Карты mesh-сети
На картах отображаются только ноды, подключённые к MQTT (напрямую или через соседний шлюз) и с включённой отправкой позиции. Остальные ноды невидимы — реальное количество устройств в mesh-сети может быть значительно больше, чем показывает карта.
| Карта | Покрытие |
|---|---|
| map.onemesh.ru | Россия (onemesh.ru) |
| meshtastic.taubetele.com | Москва |
| meshtastic.liamcottle.net | Глобальная — можно проверить, подключилась ли нода к MQTT |
| meshmap.net | Глобальная |