Reticulum ESP-NOW Mesh

Overview

ESP-NOW based mesh networking firmware for ESP32 microcontrollers, providing Reticulum network connectivity through BLE and UART interfaces. Enables off-grid, encrypted mesh communication using Sideband, Columba, and other Reticulum-compatible applications.

Phone (Sideband)     ESP32 Client       ESP32 Retranslator     ESP32 Client      Phone
     |                   |                    |                    |              |
     |---BLE (KISS)----->|---ESP-NOW v2------->|---ESP-NOW v2------>|---BLE------->|
     |                   |    802.11 LR       |    802.11 LR      |              |
     |<--BLE (KISS)------|<--ESP-NOW v2--------|<--ESP-NOW v2------|<--BLE--------|

Three firmware types work together:

All nodes use ESP-NOW v2.0 with 1470-byte payloads and 802.11 Long Range mode for up to 500m line-of-sight range.

Supported Hardware

BoardChipDisplayBLEClientRetranslatorUART
ESP32-C3 + OLEDESP32-C3SSD1306 72x405.0YesYesYes
LilyGO T-DisplayESP32ST7789 135x2404.2YesYesYes
ESP32-S3 DevKitCESP32-S3None5.0YesYesYes
ESP32 DevKitESP32None4.2YesYesYes
ESP32-WROVER DevKitESP32None4.2YesYes (4MB PSRAM)Yes
ESP32-CAMESP32None4.2YesYes (2MB PSRAM)Yes
ESP32-C6 DevKitCESP32-C6None5.0YesYesYes
ESP32-S2 SaolaESP32-S2NoneNoNoYesYes

ESP32-S3 Retranslator PSRAM Variants

ModulePSRAMBusMax PathsEnvironment
N16R8, N8R88 MBOctal SPI4096retranslator_s3_r8
N4R2, N8R2, N16R22 MBQuad SPI1024retranslator_s3_r2
N4, N8, N16None--128retranslator_s3

Firmware Types

BLE Client

Bridges a phone running Sideband/Columba (via BLE) to the ESP-NOW mesh. Emulates RNode over Nordic UART Service (NUS) with KISS framing. Phone runs the full Reticulum stack; the device is a transparent radio modem.

Retranslator

Runs the full microReticulum transport stack. Learns paths from announces, rebroadcasts announces, and forwards packets between nodes. Purely infrastructure -- no user-facing messaging capability. Invisible to Sideband/Columba users but extends mesh range.

RNode UART

Same as BLE client but communicates over USB serial at 921600 baud instead of BLE. For connecting a PC or laptop running Reticulum directly via USB cable. No BLE dependency, simpler and more reliable than wireless link.

Quick Start

Prerequisites

pioarduino Platform Required -- This project uses the pioarduino fork of the Espressif 32 platform (Arduino Core 3.x / ESP-IDF 5.5) for ESP-NOW v2.0 support (1470-byte payloads). The official PlatformIO platform does not support ESP-NOW v2. The fork is configured in platformio.ini and downloaded automatically on first build. If the toolchain install fails on Windows (MSYS2/MinGW), download manually from espressif/crosstool-NG. See full docs for details.

Build and Flash

# Build for ESP32-C3 BLE client (default)
pio run -e client_c3

# Flash to connected board
pio run -e client_c3 -t upload

# Flash to specific port
pio run -e client_c3 -t upload --upload-port COM24

# Monitor serial output
pio device monitor

Configuration

All settings are in include/board_config.h:

SettingDefaultDescription
ESPNOW_CHANNEL13WiFi channel (1-13). All nodes must match.
ESPNOW_LONG_RANGE1802.11 LR mode. 1=enabled (~500m), 0=standard (~200m).
REANNOUNCE_INTERVAL_MS1800000Transport node re-announce interval (30 minutes). Configurable per-environment via build flag. Auto-reboots on low heap (<40KB).

User Controls

BLE Client

ActionDurationResult
Double-tap BOOT2 quick tapsToggle display + LEDs on/off (saved to NVS)
Hold BOOT2+ secondsEnter BLE pairing mode

Retranslator

ActionDurationResult
Double-tap BOOT2 quick tapsToggle display + LEDs on/off (saved to NVS)
Hold BOOT5+ secondsFactory reset (erases identity and paths)

RNode UART

ActionDurationResult
Double-tap BOOT2 quick tapsToggle display + LEDs on/off (saved to NVS)

LED flashes on packet activity (TX/RX). Serial port runs KISS protocol at 921600 baud.

BLE Pairing

  1. Flash BLE client firmware and power on the board
  2. Device advertises as RNode XXXX (XXXX = last 2 bytes of MAC)
  3. In Sideband: Settings > Connectivity > enable "Connect via RNode"
  4. Hardware > RNode > check "Device requires BLE" > Scan
  5. Select the device -- a 6-digit PIN appears on the display
  6. Enter PIN on phone -- connection established
On boards without a display, the PIN is printed to serial console every 10 seconds. Connect via USB at 115200 baud to see it.

To pair with a different phone, hold BOOT for 2+ seconds. This clears existing bonds and restarts advertising.

Host Connection Setup

RNode UART (uart_* firmware)

Add to Reticulum config (~/.reticulum/config):

[[ESP-NOW RNode]]
  type = RNodeInterface
  port = /dev/ttyUSB0    # Linux
  # port = COM11         # Windows
  speed = 921600

Serial Bridge (serial_* firmware)

Add to Reticulum config (~/.reticulum/config):

[[ESP-NOW Bridge]]
  type = SerialInterface
  port = /dev/ttyUSB0    # Linux
  # port = COM11         # Windows
  speed = 921600

Serial Bridge has zero protocol overhead — maximum throughput, no handshake.

Display Screens

SSD1306 OLED (72x40, ESP32-C3)

RNode booting...
Boot
RNode C6D4 TX: 1234 RX: 5678 32.5 C
Client -- Connected
RNode C6D4 TX: 0 RX: 0 28.1 C
Client -- Disconnected
RNode C6D4 PAIRING... Connect from phone now
Client -- Pairing Mode
PAIR PIN: 474567
Client -- PIN Display
TRANSPORT TX: 167 RX: 4521 31.2 C
Retranslator

ST7789 TFT (135x240, T-Display)

RNode C6D4 TX: 1234 RX: 5678 32.5 C BLE OK
TFT Client -- Connected
PAIR PIN: 474567
TFT Client -- PIN Display

Factory Reset

Retranslator only. Hold BOOT button for 5 seconds:

  1. NVS data cleared (display preferences, initialization flag)
  2. Filesystem formatted (Reticulum identity and learned paths erased)
  3. LED turns red during process
  4. Device reboots and generates new transport identity
This operation is irreversible. The retranslator will appear as a new node on the mesh after reset.

Build Environments

Client (BLE Bridge) -- 5 environments

EnvironmentBoardDisplay
client_c3ESP32-C3SSD1306 OLED
client_tdisplayT-DisplayST7789 TFT
client_s3ESP32-S3None (RGB LED)
client_esp32ESP32None
client_c6ESP32-C6None

Retranslator (Transport) -- 9 environments

EnvironmentBoardDisplayPaths
retranslator_c3ESP32-C3SSD130648
retranslator_c3_debugESP32-C3SSD130648
retranslator_tdisplayT-DisplayST778948
retranslator_s3_r8ESP32-S3None4096
retranslator_s3_r2ESP32-S3None1024
retranslator_s3ESP32-S3None128
retranslator_esp32ESP32None128
retranslator_esp32_debugESP32None128
retranslator_wroverESP32-WROVERNone4096
retranslator_wrover_debugESP32-WROVERNone4096
retranslator_espcamESP32-CAMNone1024
retranslator_espcam_debugESP32-CAMNone1024
retranslator_c6ESP32-C6None48
retranslator_s2ESP32-S2None48

RNode UART & Serial Bridge -- 6 environments

EnvironmentBoardDisplay
uart_c3ESP32-C3SSD1306 OLED
uart_tdisplayT-DisplayST7789 TFT
uart_s3ESP32-S3None
uart_esp32ESP32None
uart_c6ESP32-C6None
uart_s2ESP32-S2None

Performance

Event-Driven Architecture

All firmware types use event-driven main loops instead of busy polling. The CPU sleeps during idle periods and wakes instantly when mesh data arrives:

BLE Throughput Optimization

FeatureValueEffect
MTU517 bytes509-byte notification payloads
Data Length Extension251 bytes~10x fewer link-layer packets
2M PHYC3/S3/C6Doubles air-time speed
Connection interval15-30msFaster than phone default
FragmentationMTU-awareLarge packets split correctly

Real-world BLE throughput with WiFi+BLE coexistence: 30-60 KB/s. This exceeds typical Reticulum traffic requirements.

Known Limitations

Troubleshooting

ProblemSolution
BLE device not visibleOn Android 15+, enable "Show unsupported BLE devices" in Developer Options. Hold BOOT 2s to re-enter pairing mode.
Sideband: "no unpaired RNodes"Unpair from Android Bluetooth settings first, then scan again in Sideband with "Device requires BLE" checked.
Display stays blackDouble-tap BOOT -- display may be toggled off (state persisted across reboots).
Serial output garbledCheck baud rate: 115200 for monitor, 921600 for UART client. Ensure CR+LF line endings.
ESP-NOW nodes not connectingAll nodes must use same ESPNOW_CHANNEL and ESPNOW_LONG_RANGE setting. Check range.
Factory reset not triggeringHold BOOT for full 5 seconds. LED turns red when reset activates. Only available on retranslator firmware.
Board stuck after partial flashHold BOOT, press RESET, release BOOT to enter download mode. Reflash.

Обзор

Прошивка mesh-сети на основе ESP-NOW для микроконтроллеров ESP32, обеспечивающая подключение к сети Reticulum через BLE и UART. Позволяет организовать автономную зашифрованную mesh-связь с использованием Sideband, Columba и других Reticulum-совместимых приложений.

Телефон (Sideband)   ESP32 Клиент        ESP32 Ретранслятор     ESP32 Клиент       Телефон
     |                   |                    |                    |              |
     |---BLE (KISS)----->|---ESP-NOW v2------->|---ESP-NOW v2------>|---BLE------->|
     |                   |    802.11 LR       |    802.11 LR      |              |
     |<--BLE (KISS)------|<--ESP-NOW v2--------|<--ESP-NOW v2------|<--BLE--------|

Три типа прошивки работают совместно:

Поддерживаемое оборудование

ПлатаЧипДисплейBLEClientRetranslatorUART
ESP32-C3 + OLEDESP32-C3SSD1306 72x405.0ДаДаДа
LilyGO T-DisplayESP32ST7789 135x2404.2ДаДаДа
ESP32-S3 DevKitCESP32-S3Нет5.0ДаДаДа
ESP32 DevKitESP32Нет4.2ДаДаДа
ESP32-WROVER DevKitESP32Нет4.2ДаДа (4 МБ PSRAM)Да
ESP32-CAMESP32Нет4.2ДаДа (2 МБ PSRAM)Да
ESP32-C6 DevKitCESP32-C6Нет5.0ДаДаДа
ESP32-S2 SaolaESP32-S2НетНетНетДаДа

Варианты ESP32-S3 с PSRAM

МодульPSRAMШинаМакс. маршрутовОкружение
N16R8, N8R88 МБOctal SPI4096retranslator_s3_r8
N4R2, N8R2, N16R22 МБQuad SPI1024retranslator_s3_r2
N4, N8, N16Нет--128retranslator_s3

Типы прошивки

BLE Client

Мост между телефоном с Sideband/Columba (через BLE) и ESP-NOW mesh. Эмулирует RNode через Nordic UART Service (NUS) с KISS-кадрированием. Телефон выполняет полный стек Reticulum; устройство -- прозрачный радиомодем.

Retranslator

Выполняет полный транспортный стек microReticulum. Изучает маршруты из анонсов, ретранслирует анонсы и перенаправляет пакеты между узлами. Чисто инфраструктурный -- невидим для пользователей Sideband/Columba, но расширяет зону покрытия mesh.

RNode UART

Аналогичен BLE клиенту, но взаимодействует через USB Serial на скорости 921600 бод. Для подключения ПК или ноутбука с Reticulum напрямую через USB кабель.

Быстрый старт

Требуется платформа pioarduino -- Проект использует форк pioarduino платформы Espressif 32 (Arduino Core 3.x / ESP-IDF 5.5) для поддержки ESP-NOW v2.0 (1470 байт). Официальная платформа PlatformIO не поддерживает ESP-NOW v2. Форк настроен в platformio.ini и загружается автоматически. При ошибке установки тулчейна на Windows (MSYS2/MinGW) скачайте вручную с espressif/crosstool-NG. Подробности в полной документации.
# Сборка для ESP32-C3 BLE клиента
pio run -e client_c3

# Прошивка на подключенную плату
pio run -e client_c3 -t upload

# Прошивка на конкретный порт
pio run -e client_c3 -t upload --upload-port COM24

Настройка

Все параметры в include/board_config.h:

ПараметрПо умолчаниюОписание
ESPNOW_CHANNEL13WiFi канал (1-13). Все узлы должны совпадать.
ESPNOW_LONG_RANGE1Режим 802.11 LR. 1=включен (~500 м), 0=стандарт (~200 м).
REANNOUNCE_INTERVAL_MS1800000Интервал реанонса транспортного узла (30 минут). Настраивается через флаг сборки. Авто-перезагрузка при низкой куче (<40 КБ).

Управление кнопками

BLE клиент

ДействиеДлительностьРезультат
Двойное нажатие BOOT2 быстрых нажатияВкл/выкл дисплей и светодиоды (сохраняется)
Удержание BOOT2+ секундыРежим BLE сопряжения

Ретранслятор

ДействиеДлительностьРезультат
Двойное нажатие BOOT2 быстрых нажатияВкл/выкл дисплей и светодиоды (сохраняется)
Удержание BOOT5+ секундСброс к заводским настройкам

UART клиент

ДействиеДлительностьРезультат
Двойное нажатие BOOT2 быстрых нажатияВкл/выкл дисплей и светодиоды (сохраняется)

Светодиод мигает при активности пакетов (TX/RX). Последовательный порт работает по протоколу KISS на 921600 бод.

Сопряжение BLE

  1. Прошейте BLE клиент и включите плату
  2. Устройство рекламирует себя как RNode XXXX (XXXX = последние 2 байта MAC)
  3. В Sideband: Настройки > Подключение > включите "Connect via RNode"
  4. Hardware > RNode > отметьте "Device requires BLE" > Scan
  5. Выберите устройство -- 6-значный PIN появится на дисплее
  6. Введите PIN на телефоне -- соединение установлено
На платах без дисплея PIN выводится в Serial каждые 10 секунд. Подключитесь через USB на 115200 бод.

Настройка подключения к ПК

RNode UART (прошивка uart_*)

Добавьте в конфиг Reticulum (~/.reticulum/config):

[[ESP-NOW RNode]]
  type = RNodeInterface
  port = /dev/ttyUSB0    # Linux
  # port = COM11         # Windows
  speed = 921600

Serial Bridge (прошивка serial_*)

Добавьте в конфиг Reticulum (~/.reticulum/config):

[[ESP-NOW Bridge]]
  type = SerialInterface
  port = /dev/ttyUSB0    # Linux
  # port = COM11         # Windows
  speed = 921600

Serial Bridge имеет нулевые протокольные накладные расходы — максимальная пропускная способность.

Экраны устройств

SSD1306 OLED (72x40, ESP32-C3)

RNode C6D4 TX: 1234 RX: 5678 32.5 C
Клиент -- подключен
PAIR PIN: 474567
Клиент -- PIN
TRANSPORT TX: 167 RX: 4521 31.2 C
Ретранслятор

Сброс к заводским настройкам

Только для ретранслятора. Удерживайте кнопку BOOT 5 секунд:

  1. Данные NVS очищаются
  2. Файловая система форматируется (идентификатор и маршруты удаляются)
  3. Светодиод загорается красным
  4. Устройство перезагружается и генерирует новый идентификатор
Операция необратима. Ретранслятор появится в сети как новый узел.

Производительность

Событийная архитектура

Все типы прошивок используют событийные циклы. CPU спит в простое и мгновенно просыпается при поступлении данных:

Оптимизация BLE

ФункцияЗначениеЭффект
MTU517 байт509 байт полезной нагрузки
Data Length Extension251 байт~10x меньше LL-пакетов
2M PHYC3/S3/C6Удвоение скорости в эфире
Интервал соединения15-30 мсБыстрее дефолта телефона
ФрагментацияС учетом MTUБольшие пакеты разбиваются корректно

Реальная пропускная способность BLE при сосуществовании WiFi+BLE: 30-60 КБ/с.

Известные ограничения

Решение проблем

ПроблемаРешение
BLE устройство не видноНа Android 15+ включите "Показывать неподдерживаемые BLE устройства" в настройках разработчика. Удерживайте BOOT 2 сек для режима сопряжения.
Sideband: "no unpaired RNodes"Удалите сопряжение в настройках Bluetooth Android, затем сканируйте снова с отмеченным "Device requires BLE".
Дисплей не работаетДвойное нажатие BOOT -- дисплей может быть выключен (состояние сохраняется).
Узлы ESP-NOW не соединяютсяВсе узлы должны быть на одном канале (ESPNOW_CHANNEL) с одинаковой настройкой LR режима.
Плата завислаУдерживайте BOOT, нажмите RESET, отпустите BOOT для входа в режим загрузки. Перепрошейте.
^