TMesh

Двунаправленный мост Telegram > MQTT > Meshtastic. Виртуальная нода, которая подключается к mesh через MQTT, шифрует сообщения PKI (для устройств) и AES (для каналов). Написан на .NET 8, деплоится через Docker.

  • Репо: samfromlv/tmesh
  • Лицензия: MIT
  • Стек: .NET 8, SQLite, MQTT (TLS), опционально PostgreSQL для аналитики

Чем отличается от других мостов

В отличие от простых Python-мостов (meshtastic-telegram-gateway, meshgram), TMesh:

  • Работает как полноценная виртуальная нода с PKI-шифрованием (не просто форвардер)
  • Поддерживает приватные каналы — группа устройств общается с Telegram как команда
  • Multi-gateway routing — маршрутизация через ближайший шлюз к устройству
  • Delivery tracking — статус доставки через emoji-реакции в Telegram
  • Key pinning — защита от MITM-атак через привязку публичных ключей
  • Требует свой MQTT-брокер и webhook endpoint (сложнее в настройке)

Сравнение с другими мостами: Telegram и Meshtastic

Архитектура

Telegram ←─webhook─→ [TProxy] ←─MQTT─→ [TBot] ←─MQTT─→ [Gateway ноды] ←─LoRa─→ [Mesh]

Два сервиса:

  • TBot — основной: шифрование, очередь сообщений, БД, маршрутизация, команды бота
  • TProxy — webhook-прокси: принимает обновления от Telegram, публикует в MQTT

Требования

  • MQTT-брокер с QoS 1 (Mosquitto, HiveMQ, EMQX) — подробнее о настройке в MQTT в Meshtastic
  • Telegram-бот (через @BotFather)
  • Gateway-ноды Meshtastic с “OK to MQTT” — нужна минимум одна
  • Публичный HTTPS-endpoint для Telegram webhook
  • Docker / Docker Compose (или .NET 8 Runtime)

Деплой

git clone https://github.com/samfromlv/tmesh.git
cd tmesh
# Сгенерировать PKI-ключи виртуальной ноды
dotnet run --project TMesh/TBot -- /generatekeys
# Скопировать и заполнить конфиги
cp TMesh/TBot/appsettings.sample.json TMesh/TBot/appsettings.json
# Запуск
docker-compose up -d

Ключевые параметры конфига

ПараметрОписание
MqttAddress / MqttPortАдрес MQTT-брокера (8883 для TLS)
MqttUseTlsTLS для MQTT (рекомендуется)
TelegramApiTokenТокен бота
TelegramUpdateWebhookUrlURL для Telegram webhook (через TProxy)
MeshtasticNodeIdID виртуальной ноды (int64)
MeshtasticPublicKeyBase64 / PrivateKeyBase64PKI-ключи (генерируются через /generatekeys)
MeshtasticPrimaryChannelPskBase64PSK основного канала (AQ== = default LongFast)
GatewayNodeIdsСписок ID gateway-нод
OutgoingMessageHopLimitЛимит хопов (по умолчанию 7)
MeshtasticMaxOutgoingMessagesPerMinuteRate limit (30/мин)

Команды бота

Пользовательские

КомандаОписание
/add_device !aabbcc11Зарегистрировать устройство в текущем чате
/add_channelЗарегистрировать приватный канал (не LongFast)
/remove_device !aabbcc11Удалить устройство из текущего чата
/remove_channel <ID>Удалить канал из текущего чата
/remove_device_from_all_chats !aabbcc11Удалить устройство из всех чатов
/remove_channel_from_all_chats <ID>Удалить канал из всех чатов
/statusСписок зарегистрированных устройств и каналов
/status MyDeviceФильтр по имени
/positionПоследние GPS-позиции на карте
/promote_to_gateway !aabbcc11Повысить устройство до MQTT-шлюза
/demote_from_gateway !aabbcc11Снять роль шлюза

Админские (после /admin <пароль>)

КомандаОписание
add_gateway !aabbcc11Добавить шлюз + получить MQTT-учётные данные
remove_gateway !aabbcc11Удалить шлюз
list_gatewaysСписок шлюзов
remove_node !aabbcc11Полное удаление ноды из БД

Отслеживание доставки

Бот ставит emoji-реакции на сообщения в Telegram:

РеакцияСтатус
✍️Создано
👀В очереди
🕊️Подтверждено MQTT
👌Доставлено на устройство
👎Ошибка доставки
🤷Неизвестный статус

Аналитика (опционально)

PostgreSQL 12+ собирает позиции устройств, утилизацию каналов и эфира. Контент сообщений не хранится.

Источники