Skip to content

Trifecta bridge — beta 4

Pre-release
Pre-release

Choose a tag to compare

@smellyspice smellyspice released this 26 Aug 20:50
· 21 commits to espnow-ip-bridge since this release

Trifecta repeater firmware (real LoRa + ESP-NOW bridge + IP bridge, all at once) — beta 4.

Built from commit 18599bb3 on the espnow-ip-bridge branch. Covers Heltec V3, Heltec V4, and Xiao S3 WIO.

This build has debug logging enabled (BRIDGE_DEBUG, MESH_DEBUG, MESH_PACKET_LOGGING, WIFI_DEBUG_LOGGING) — noisier serial output than a normal release, in exchange for full visibility into bridge routing decisions. Pairs with watch_boards.py below.

What's new since beta 3

  • Much better delivery reliability for ESP-NOW-only companions (e.g. the LoRa-less S3-Zero) with a marginal RF link to their paired repeater. Root-caused via live timing instrumentation: at normal desk range, some exchanges needed several retries to get a MAC-layer ACK back — a real RF margin issue, not a routing bug. The ESP-NOW send retry ceiling is raised from 4 to 12 attempts (with a matching timeout budget) — each retry is cheap (~15-20ms), so a slower success now replaces what used to be a visible timeout error.
  • Fixed: the IP bridge's DTLS handshake could hang forever if the peer disappeared mid-handshake (network switch, IP address change), requiring a manual reboot to recover. Now times out after 30s and retries automatically, same as any other connection failure.
  • New: the IP bridge's heartbeat ping now defers by a tick when the ESP-NOW bridge has been active recently, on dual-bridge boards — avoids the heartbeat competing with an inbound ESP-NOW frame's ACK timing for the shared radio.
  • New: get bridge.channel now shows the radio's actual live WiFi channel alongside the configured value, flagging a mismatch explicitly — useful since ESP-NOW and any WiFi-STA use (the IP bridge) share one physical radio.
  • watch_boards.py: new b hotkey dumps IP/ESP-NOW bridge status (WiFi status, IP status, live channel) from every connected board at once; new c hotkey toggles watching companion boards too (skipped by default since they speak a different protocol) — useful for seeing a companion's own debug output live, at the cost of some undecodable binary noise mixed in.

Repeaters (Xiao S3 WIO, Heltec V3, Heltec V4)

Which file to flash:

  • -merged.bin — for a blank/fresh board. Flash at offset 0x0:
    esptool.py --chip esp32s3 write_flash 0x0 <file>-merged.bin
  • plain .bin (no -merged suffix) — app-only, for upgrading a board that's already running MeshCore. Preserves identity, WiFi credentials, and BLE bonds. Flash at offset 0x10000:
    esptool.py --chip esp32s3 write_flash 0x10000 <file>.bin

After flashing, configure over the standard MeshCore serial CLI (set bridge.channel, set bridge.secret, set wifi.ssid, set wifi.pwd, set ip.host, etc.) — no custom tooling needed.

Monitoring multiple boards at once

python3 watch_boards.py

Auto-detects every connected board, connects to all of them, and streams their debug output live in one terminal. Press n to dump neighbors.all, b to dump bridge status, c to toggle watching companion boards, from every connected board at once. See the script's own --help for details.

Full writeup, use cases, and setup details: https://smellyspice.github.io/MeshCore/

This is an unmerged personal fork, not reviewed by MeshCore maintainers — a developer/beta release for testers who want to help shake it out, not something to run on a mesh anyone actually depends on. This build specifically also ships with debug logging left on, which is noisier and slightly heavier than a real release build. If your mesh matters to you or to other people using it, wait for something further along than this. See the writeup for known limitations before flashing.