Files
DD3-LoRa-Bridge-MultiSender/README.md

89 lines
2.2 KiB
Markdown

# DD3-LoRa-Bridge-MultiSender
Unified firmware for LilyGO T3 v1.6.1 (ESP32 + SX1276 + SSD1306) running as either:
- `Sender`: reads meter values and sends binary batches over LoRa.
- `Receiver`: accepts batches, ACKs with optional time, publishes to MQTT/web.
## Protocol (minimal)
Frame format:
`[msg_kind:1][dev_id_short:2][payload...][crc16:2]`
`msg_kind`:
- `0`: `BATCH_UP` (Sender -> Receiver)
- `1`: `ACK_DOWN` (Receiver -> Sender)
Removed from protocol:
- protocol version field
- payload type field
- MeterData JSON/compressed LoRa path
- standalone TimeSync packets
CRC16 validation is still required on every frame.
## Payloads
### 1) `BATCH_UP`
- Uses existing binary batch/chunk transport.
- `sample_count == 0` is valid and means `SYNC_REQUEST`.
### 2) `ACK_DOWN` (7 bytes)
- `flags` (`u8`): bit0 = `time_valid`
- `batch_id` (`u16`, big-endian)
- `epoch_utc` (`u32`, big-endian)
Receiver sets:
- `time_valid=1` only when receiver time is authoritative and sane.
- Otherwise `time_valid=0` and `epoch_utc=0`.
## Time bootstrap safety
Sender starts with:
- `g_time_acquired=false`
- no real sampling/batching
- periodic `SYNC_REQUEST` every `SYNC_REQUEST_INTERVAL_MS` (default `15000ms`)
Sender only accepts time from `ACK_DOWN` if:
- `time_valid == 1`
- `epoch_utc >= 2026-02-01 00:00:00 UTC` (`MIN_ACCEPTED_EPOCH_UTC = 1769904000`)
Only then:
- system time is set
- `g_time_acquired=true`
- normal 1 Hz sampling + batch transmit starts
This guarantees no pre-`2026-02-01` epoch reaches MQTT or SD/DB paths.
## Receiver behavior
On `BATCH_UP`:
1. Decode batch/chunks.
2. Send `ACK_DOWN` immediately.
3. If `sample_count == 0`: treat as `SYNC_REQUEST`, do not publish MQTT/update stats.
4. Else decode and publish samples as normal.
## Sender/Receiver debug logs (`SERIAL_DEBUG_MODE`)
Sender:
- `sync: request tx batch_id=%u`
- `ack: rx ok batch_id=%u time_valid=%u epoch=%lu set=%u`
- `ack: timeout batch_id=%u retry=%u`
Receiver:
- `ack: tx batch_id=%u time_valid=%u epoch=%lu samples=%u`
## Removed hardware dependency
DS3231 RTC support was removed:
- no RTC files
- no RTC init/load/set logic
- no `ENABLE_DS3231` flow
## Build
```bash
pio run -e lilygo-t3-v1-6-1
pio run -e lilygo-t3-v1-6-1-test
```