Skip to content

MeshCore Companion bearer (Phase H1, #154) - #161

Merged
M0LTE merged 1 commit into
masterfrom
meshcore-bearer
Jun 30, 2026
Merged

MeshCore Companion bearer (Phase H1, #154)#161
M0LTE merged 1 commit into
masterfrom
meshcore-bearer

Conversation

@M0LTE

@M0LTE M0LTE commented Jun 30, 2026

Copy link
Copy Markdown
Collaborator

What

Phase H1 (#154): a MeshCore Companion-radio bearer for DAPPS, integrated behind the IDappsBackhaul / IBackhaulInbox seam and proven on air between two Heltec V3s. Built on the standalone PoC + characterisation in poc/MeshCorePoc/.

Highlights

  • New dapps.meshcore library: serial driver (MeshCoreClient), binary channel-data transport reusing the real BackhaulMessageCodec + Packetiser, zstd shared-dictionary compression, airtime governor (TxBudget), watchdog/recovery via CP2102 DTR/RTS hard-reset (MeshCore: radio liveness watchdog + reset/recovery in the driver #160), device control + region presets.
  • MeshCoreCompanionBackhaul : IDappsBackhaul + MeshCoreInbound → IBackhaulInbox, with broadcast-coalescing and LinkSourceCallsign-based sender identity.
  • Host integration: MeshCoreBearer + hosted service registered in Program.cs before the AGW catch-all; DAPPS_MESHCORE_* config via SystemOptions + DbStartup seeding; additive BackhaulRoute.MeshCoreChannel hint (positive bearer selection).
  • dapps.meshcore.soak on-air soak harness driving the real bearer through the real seam.

Validation

  • Full solution builds clean (0 warnings / 0 errors).
  • 12 new bearer unit tests + 42 seam tests pass.
  • 10-minute on-air soak: every message compressed to 1 LoRa packet, governor held ~0.6% duty, watchdog reset + recovery under live traffic (~4 s, graceful back-pressure), both links ended Healthy.

Scope / follow-ups

Inbound is fully wired. Outbound is selected for routes carrying a MeshCore channel hint; wiring that hint onto neighbour rows (#155), adaptive airtime + channel-monitoring (#157), dictionary versioning, end-to-end reliability, and deployment models B/C (#158) are tracked follow-up issues under #137.

Inert unless MeshCoreEnabled=true — no behaviour change for existing bearers; BackhaulRoute change is additive.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KLbwvhE2cKCe8WPZNg8k17

Carry DAPPS BackhaulMessages over a MeshCore radio's private channel,
integrated behind the IDappsBackhaul / IBackhaulInbox seam.

New project dapps.meshcore:
- MeshCoreClient: Companion USB-serial protocol (framing, opcodes, the
  MSG_WAITING -> SYNC_NEXT pull model, device control).
- MeshCoreChannelTransport: binary channel-data carriage reusing the real
  BackhaulMessageCodec + Packetiser; per-frame nonce (mesh dedup) and zstd
  shared-dictionary compression.
- TxBudget: hard self-enforced airtime governor (good-citizen control).
- MeshCoreLink: opens/configures the radio and watchdogs it, recovering a
  hung companion via a CP2102 DTR/RTS hard reset (#160).
- MeshCoreCompanionBackhaul (IDappsBackhaul) + MeshCoreInbound (-> IBackhaulInbox),
  with broadcast-coalescing and LinkSourceCallsign-based sender identity.
- Region/device control (uk-narrow / uk-test / eu-legacy).

Host integration:
- MeshCoreBearer + MeshCoreBearerService registered before the AGW catch-all;
  inert unless MeshCoreEnabled=true.
- DAPPS_MESHCORE_* config via SystemOptions + DbStartup seeding.
- BackhaulRoute gains an additive MeshCoreChannel hint (positive bearer selection).

Also: dapps.meshcore.soak (on-air soak harness driving the real bearer through
the real seam) and poc/MeshCorePoc (the standalone PoC + characterisation this
is built on).

Validated: full solution builds clean; 12 new bearer unit tests + 42 seam tests
pass; 10-minute on-air soak between two Heltec V3s (compression to 1 packet/msg,
governor ~0.6% duty, watchdog reset+recovery under load, links Healthy).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KLbwvhE2cKCe8WPZNg8k17
@M0LTE
M0LTE merged commit b6b1657 into master Jun 30, 2026
4 checks passed
@M0LTE
M0LTE deleted the meshcore-bearer branch June 30, 2026 23:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant