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 false

2. Через 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 (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 (сообщение, нода пропала, датчик сработал)

Варианты интеграции

  1. MQTT-сенсоры в YAML — ручная настройка, полный контроль
  2. HACS-интеграция (meshtastic/home-assistant) — автоматическое создание сенсоров
  3. 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Глобальная

Источники