Audited against meshcore-spec and fixed all compliance gaps:
- Fix trace hash size encoding: use 1<<(flags&3) not (flags&3)+1
- Reject reserved path hash_size_code 3 per spec Section 3
- Minimum packet size 3 bytes (was 2)
- Add MAX_PACKET_PAYLOAD (184) and min payload (1) validation
- Tighten payload minimums: ANON_REQ≥51, encrypted≥20, group≥19,
multipart≥2
- Add node_type 0 ("none") to NODE_TYPES
- Fix node_type fallback display (was "node=type=14", now "node=0x0e")
Add packet quality warnings for likely-corrupt frames:
- decode_meshcore_packet returns (str, list[str]) with quality warnings
- ADVERT: flag bad node_type, bad UTF-8 in name, future/bad timestamps
- Combine content warnings with low-SNR signal at display layer
- Warnings stack: one flag = maybe, multiple = high confidence corrupt
Update test corpus and generators for tightened validation rules.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
MeshCore Example
This is a protocol implementation built on top of DongLoRa. The DongLoRa firmware itself is protocol-agnostic — it just gives you a LoRa radio pipe. MeshCore is one of many possible protocols you can run over it.
What's here
- meshcore_rx.py — MeshCore packet decoder, Watchman mesh health reporter
- channels.csv — 276 known MeshCore channels (Public + hashtag channels)
- corpus/ — Test vectors for MeshCore packet decoders
Usage
uv run examples/meshcore/meshcore_rx.py [PORT]
Connects to a DongLoRa device, configures the radio for the MeshCore frequency/modulation, and decodes received packets in real time.
Running the test corpus
uv run examples/meshcore/corpus/validate.py