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) |
MqttUseTls | TLS для MQTT (рекомендуется) |
TelegramApiToken | Токен бота |
TelegramUpdateWebhookUrl | URL для Telegram webhook (через TProxy) |
MeshtasticNodeId | ID виртуальной ноды (int64) |
MeshtasticPublicKeyBase64 / PrivateKeyBase64 | PKI-ключи (генерируются через /generatekeys) |
MeshtasticPrimaryChannelPskBase64 | PSK основного канала (AQ== = default LongFast) |
GatewayNodeIds | Список ID gateway-нод |
OutgoingMessageHopLimit | Лимит хопов (по умолчанию 7) |
MeshtasticMaxOutgoingMessagesPerMinute | Rate 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+ собирает позиции устройств, утилизацию каналов и эфира. Контент сообщений не хранится.