Зачем вам вообще сдался Meshtastic с ИИ?
Давайте честно: в 2026 году интернет есть почти везде. Но "почти" — это как "беременна чуть-чуть". Когда вы в походе, на даче с мертвым мобильным оператором, или в зоне чрезвычайной ситуации, мессенджеры не работают. Meshtastic решает проблему связи: LoRa-радио передает сообщения на десятки километров без вышек и сим-карт. Но что, если вам нужен не просто "Привет, как слышно?", а умный советчик, который работает вообще без интернета?
Тут и вступает локальная LLM на ноутбуке. Вы берете модель вроде Phi-4-mini от Microsoft (3.8B параметров) или Llama 3.2 3B от Meta, запускаете через Ollama, и получаете персонального ассистента, который работает от батареи и не утекает в облака. А теперь соедините это с Meshtastic — и у вас распределенная сеть разумных узлов, где каждый может задать вопрос нейросети по радиоканалу.
Звучит как киберпанк? Нет, это пятое воскресенье после обеда любого DevOps-инженера, который устал от облачных вендоров. Поехали.
Проблема: у вас есть LoRa-меш, но он тупой
Meshtastic умеет пересылать короткие текстовые сообщения, трекинг, телеметрию. Но это просто транспорт. Вы не можете сказать узлу "напиши сочинение про грибы" или "переведи это на суахили". Даже если повесить на узел ESP32 с Wi-Fi, он не потянет тяжелую LLM — памяти 4 МБ, ребята.
Решение: ноутбук с локальной LLM становится шлюзом. Вы подключаете к нему Heltec ESP32 (или любой другой Meshtastic-совместимый девайс) через USB или Serial, ловите сообщения из LoRa-сети, отправляете их в Ollama, получаете ответ и шлете обратно. Весь трафик — по воздуху, без интернета.
Важно: для работы вам понадобится как минимум 8 ГБ ОЗУ на ноутбуке (лучше 16). Phi-4-mini жрет около 4 ГБ, Llama 3.2 3B — около 3 ГБ. Если памяти мало, берите Qwen2.5-1.5B-Instruct (1 ГБ) — хватит для простых диалогов.
Железо и софт: что брать
Я не люблю списки "вам понадобится" длиной в экран, но без базы никак. Вот минимум:
- Ноутбук — любой x86 с Linux (Ubuntu 24.04 LTS) или Windows 11 (WSL2). Mac тоже подойдет, но с ARM могут быть нюансы с Ollama — хотя с версии 0.5 они решены.
- Radio-модуль — Heltec WiFi LoRa 32 V3 (наиболее популярный), LilyGo T-Beam, или любой другой ESP32 с чипом SX1262/SX1276.
- Meshtastic прошивка — последняя стабильная (на май 2026 — 2.5.x).
- Ollama — версия 0.5.3 или новее. Ставится одной командой.
- Модель — рекомендую
phi4-mini:3.8b-instruct-q4_K_M(баланс скорости и качества) илиllama3.2:3b-instruct-q4_K_M. - Python 3.11+ — скрипт-мост, который слушает Serial порт и обращается к Ollama.
Зачем Python? Потому что Meshtastic предоставляет HTTP API (через Serial), но я предпочитаю прямой доступ к прошивке через pySerial. Это дает контроль над парсингом сообщений.
Пошаговый план (терпение, будет много кода)
1 Прошиваем Meshtastic-узел
Скачайте прошивку с официального флешера (да, есть Web-инструмент на ESP32, работает отлично). Выбирайте плату Heltec WiFi LoRa 32 V3, скорость UART 115200. После прошивки подключайте USB к ноутбуку — появится порт вроде /dev/ttyACM0 (Linux) или COM3 (Windows).
2 Настраиваем Meshtastic на взаимодействие
Подключаемся к узлу через Meshtastic CLI:
pip install meshtastic
meshtastic --port /dev/ttyACM0 --set-own-url meshtastic.local
Но нам нужно, чтобы узел передавал все входящие текстовые сообщения в Serial. Включите Serial.output и Serial.console:
meshtastic --port /dev/ttyACM0 --set serial_output true
meshtastic --port /dev/ttyACM0 --set serial_console true
После этого узел будет дублировать все принятые LoRa-сообщения в Serial. Именно их мы будем ловить.
Типичная ошибка: скорость порта. Если после прошивки узел перестал отвечать, проверьте baudrate. По умолчанию 115200, но некоторые сборки ставят 921600. Исправляется через меню конфигурации.
3 Устанавливаем Ollama и модель
Ollama ставится одной командой (Linux/Mac):
curl -fsSL https://ollama.com/install.sh | sh
На Windows — скачайте установщик с официального сайта (версия 0.5.3). После установки запустите сервис и скачайте модель:
ollama pull phi4-mini:3.8b-instruct-q4_K_M
Проверьте, что работает:
ollama run phi4-mini:3.8b-instruct-q4_K_M "Привет"
4 Пишем мост: Serial → Ollama → Serial
Здесь начинается магия. Нам нужен Python-скрипт, который читает из Serial, парсит сообщение (исключая системные пакеты), отправляет текст в Ollama API, получает ответ и отправляет обратно через Serial (узел сам разошлет его по LoRa).
Сначала установите зависимости:
pip install pyserial requests
Теперь сам скрипт meshtastic_llm_bridge.py:
import serial
import requests
import time
import re
SERIAL_PORT = '/dev/ttyACM0' # подставьте свой
BAUD = 115200
OLLAMA_URL = 'http://localhost:11434/api/generate'
MODEL = 'phi4-mini:3.8b-instruct-q4_K_M'
def send_to_llm(prompt):
payload = {
'model': MODEL,
'prompt': prompt,
'stream': False
}
resp = requests.post(OLLAMA_URL, json=payload, timeout=60)
return resp.json()['response']
def main():
ser = serial.Serial(SERIAL_PORT, BAUD, timeout=1)
print(f"Listening on {SERIAL_PORT}...")
while True:
line = ser.readline().decode('utf-8', errors='ignore').strip()
if not line:
continue
# Фильтруем только сообщения от пользователей (формат "!1a2b3c text" или "text")
# В реальности парсинг сложнее, но для демо так:
if 'text=' in line:
# Извлекаем текст после 'text='
match = re.search(r'text=([^,]+)', line)
if match:
user_msg = match.group(1)
print(f"Received: {user_msg}")
llm_resp = send_to_llm(user_msg)
print(f"LLM: {llm_resp}")
# Отправляем ответ в Serial (узел отправит его через LoRa)
ser.write(f"{llm_resp}\n".encode('utf-8'))
time.sleep(0.1)
if __name__ == '__main__':
main()
Предупреждение: парсинг Serial вывода Meshtastic — это ад. Формат не документирован, может меняться. Лучше использовать библиотеку meshtastic для Python: она подписывается на события. Но для первого запуска сойдет и regex.
5 Тестируем всю цепочку
Запустите скрипт, возьмите второй Meshtastic-узел (или смартфон с приложением Meshtastic) и отправьте сообщение на узел, подключенный к ноутбуку. Если все настроено правильно, через 10-30 секунд (зависит от размера модели и скорости LoRa) вы получите ответ от LLM.
Не ждите скорости ChatGPT. LoRa-пакет может быть максимум 512 байт, и отправка ответа даже в 1000 символов займет несколько секунд. А генерация на Phi-4-mini на CPU занимает 2-5 секунд на токен. Итог: 20-40 секунд на ответ. Но оно работает офлайн!
Нюансы и грабли, на которые я наступил
- Длина сообщения. Meshtastic режет сообщения длиннее ~240 байт. Если ответ LLM больше, придется разбивать и отправлять частями с паузой. Или использовать каналы с более высоким MTU (но это редкость).
- Конфликт портов. Если вы используете WSL2 на Windows, USB-порт может не пробрасываться. Используйте
usbipdили переходите на Ubuntu в VirtualBox. - Зависание Ollama. Если модель потребляет всю память, сервис умирает. Добавьте в скрипт проверку здоровья и перезапуск.
- Безопасность. Любой в радиусе действия может отправлять запросы вашей LLM. Если вы не хотите получать спам, реализуйте белый список ID узлов.
Как улучшить систему (если есть время)
Базовый мост — это весело, но для продакшена нужно:
- Потоковая генерация. Используйте
stream=Trueв Ollama и отправляйте токены по мере генерации — снизит задержку до первого слова. - Кеширование контекста. Храните историю диалога для каждого узла, чтобы LLM помнила, о чем речь.
- MQTT вместо Serial. Если у вас несколько узлов, поднимите MQTT брокер и подключите скрипт к нему — это масштабируемее.
- Легкая модель для быстрых ответов. Qwen2.5-0.5B-Instruct отвечает за 0.5 секунды, но тупее. Используйте роутинг: короткие вопросы — быстрая модель, сложные — тяжелая.
Также советую глянуть мою статью про AI-агента на LoRa для умного дома — там похожая архитектура, но с Home Assistant. А если хотите упростить запуск локальных LLM, обратите внимание на One-Click установщик.
FAQ по теме (чтобы не гуглить)
| Вопрос | Ответ |
|---|---|
| Можно ли использовать Raspberry Pi вместо ноутбука? | Да, но лучше Pi 5 с 8 ГБ памяти. Модель Phi-4-mini на нем будет работать, но медленно (2-3 токена/сек). |
| Сколько узлов может обслуживать один ноутбук? | Теоретически неограниченно, но Serial не резиновый. Реально — десяток, если не спамят одновременно. |
| Поддерживает ли Meshtastic шифрование? | Да, AES-256. Если включено, скрипт получит только зашифрованный текст — надо расшифровывать через API узла. |
| Как обновлять модель без перезапуска? | Ollama поддерживает горячую замену: просто запросите другую модель в payload. В скрипте можно повесить команду !model llama3.2. |
В итоге получилась децентрализованная распределенная нейросеть, работающая на радиосвязи. Да, медленно. Да, костыльно. Но в момент, когда интернет ляжет, а вам нужно передать сообщение через лес с помощью LoRa и получить осмысленный ответ от ИИ, вы будете чертовски рады, что собрали эту штуку. Не благодарите.