WiFi OTA обновление Meshtastic

Удалённое обновление прошивки Meshtastic по WiFi без физического доступа к устройству. Работает только на ESP32 (не nRF52).

Принцип работы

ESP32 имеет две партиции для приложений: app0 (ota_0) и app1 (ota_1). Основная прошивка Meshtastic работает в app0. В app1 записывается OTA-загрузчик (firmware-ota-wifi), который умеет принимать новую прошивку по WiFi через протокол ArduinoOTA.

Процесс обновления:

  1. Meshtastic получает команду --reboot-ota и перезагружается в партицию app1
  2. OTA-загрузчик подключается к WiFi и ждёт прошивку
  3. espota.py отправляет новый firmware по сети
  4. OTA-загрузчик записывает его в app0 и перезагружается обратно в Meshtastic

Требования

  • ESP32 с WiFi (Heltec V4, T-Beam и др.)
  • WiFi настроен и работает на ноде
  • OTA-загрузчик записан в партицию app1 (ota_1)
  • Компьютер в той же WiFi-сети (или есть маршрут до ноды)

Подготовка OTA-загрузчика

Из GitHub-релиза (рекомендуемый, firmware ≥2.7.19)

Скачать mt-esp32s3-ota.bin со страницы релиза. Записать:

esptool --port /dev/cu.usbmodemXXXX write-flash 0x650000 mt-esp32s3-ota.bin

Project name должен быть MeshtasticOTA (без дефиса). Старый bleota-s3.bin (Meshtastic-OTA с дефисом) не поддерживает WiFi OTA.

Сборка из исходников (устаревший метод)

git clone https://github.com/meshtastic/firmware-ota-wifi.git
cd firmware-ota-wifi
pio run -e esp32s3

Результат: .pio/build/esp32s3/firmware.bin (~614 КБ, вписывается в партицию ota_1 = 640 КБ).

Доступные окружения: esp32, esp32s3, esp32c3 — выбирать по чипу устройства.

Запись в партицию

Адрес ota_1 для Heltec V4 (16MB, BIGDB_16MB): 0x650000.

esptool --chip esp32s3 --port /dev/cu.usbmodemXXXX \
  write-flash 0x650000 firmware-ota-wifi/.pio/build/esp32s3/firmware.bin

Можно записать одновременно с основной прошивкой:

esptool --chip esp32s3 --port /dev/cu.usbmodemXXXX write-flash \
  0x00 firmware-heltec-v4-<VER>.bin \
  0x650000 firmware-ota-wifi/.pio/build/esp32s3/firmware.bin \
  0xc90000 littlefs-heltec-v4-<VER>.bin

Настройка WiFi для OTA

OTA-загрузчик берёт WiFi-credentials из NVS (namespace ota-wifi). Если Meshtastic уже настроен с WiFi — credentials могут быть доступны автоматически. Если нет, нужно прописать вручную через NVS перед использованием OTA.

Процесс обновления

Метод 1: meshtastic CLI (рекомендуемый, firmware ≥2.7.19)

Начиная с v2.7.19 Meshtastic CLI умеет делать OTA одной командой:

meshtastic --host <IP> --ota-update <path-to-firmware.bin>

Использовать .bin (НЕ .factory.bin). CLI сам перезагружает ноду в OTA-режим, отправляет прошивку по TCP:3232, нода перезагружается обратно.

Требования:

  • OTA-загрузчик на партиции 0x650000 должен быть mt-esp32s3-ota.bin из GitHub-релиза (project name MeshtasticOTA)
  • НЕ использовать старый bleota-s3.bin — у него project name Meshtastic-OTA (с дефисом), WiFi OTA не поддерживается
  • Скачать правильный бинарь: на странице релиза → mt-esp32s3-ota.bin (~620 КБ)

Метод 2: espota.py (ручной)

Шаг 1: Перезагрузка в OTA-режим

meshtastic --host <IP> --reboot-ota

Устройство перезагрузится в партицию ota_1 (OTA-загрузчик). Экран покажет статус подключения к WiFi.

Шаг 2: Отправка прошивки

espota.py -i <IP> -f firmware-heltec-v4-<VER>.bin

espota.py входит в состав Arduino/PlatformIO. Обычно находится в ~/.platformio/packages/framework-arduinoespressif32/tools/espota.py.

Шаг 3: Автоматическая перезагрузка

После успешной записи устройство перезагрузится обратно в app0 с новой прошивкой.

Адреса партиций

Для Heltec V4 (ESP32-S3, 16MB flash, схема BIGDB_16MB):

ПартицияТипАдресРазмер
app0 (ota_0)Meshtastic firmware0x100006.25 МБ
app1 (ota_1)OTA WiFi loader0x6500006.25 МБ
spiffsLittleFS0xc900003.375 МБ

Factory-образ (firmware.factory.bin) включает bootloader и пишется на 0x00, перекрывая app0.

Ограничения

  • OTA обновляет только firmware в app0. LittleFS и сам OTA-загрузчик не обновляются по WiFi.
  • WiFi и BLE на ESP32 взаимоисключающие. Пока нода подключена к WiFi, BLE (приложение на телефоне) недоступен.
  • OTA-загрузчик должен знать WiFi-credentials. Если WiFi сеть сменилась — обновить credentials можно только физически.
  • Размер firmware не должен превышать размер партиции app0 (6.25 МБ для 16MB flash).
  • Если OTA-процесс прерван (потеря связи, питания) — устройство останется в OTA-загрузчике до следующей попытки или ручной перезагрузки.

Troubleshooting

  • OTA-загрузчик не подключается к WiFi: проверить credentials в NVS, проверить что SSID и пароль корректны
  • espota.py не находит устройство: убедиться что компьютер и нода в одной подсети, проверить firewall
  • После OTA нода не загружается: прошивка повреждена или несовместима. Нужен физический доступ для erase-flash и перезаписи

См. также