传输:LoRa 模块 UART 透传,9600 8N1;帧为二进制、小端序。CRC-16/CCITT-FALSE(poly 0x1021,init 0xFFFF,xorout 0)。
| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0–1 | sync | bytes | AA 55 |
| 2 | version | u8 | 1 |
| 3 | type | u8 | 1 = DATA |
| 4 | node_id | u8 | 1–255 |
| 5–6 | seq | u16 | 0–65535,16 位 |
| 7 | flags | u8 | bit0 低电量,bit1 传感器故障 |
| 8–9 | temp_c_x100 | i16 | 23.45°C → 2345 |
| 10–11 | humidity_x100 | u16 | 55.20% → 5520 |
| 12–13 | soil_x100 | u16 | 41.30% → 4130 |
| 14–15 | battery_mv | u16 | 3600 |
| 16–17 | crc16 | u16 | 对偏移 2–15 计算 |
示例(node=1, seq=258, 23.45°C, 55.2%, 41.3%, 3600mV):
AA 55 01 01 01 02 01 00 29 09 90 15 22 10 10 0E 17 C0
CRC 由代码生成;不要手算。
示例 ACK(node=1, seq=258):
AA 55 01 02 01 02 01 00 D6 24
| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0–1 | sync | bytes | AA 55 |
| 2 | version | u8 | 1 |
| 3 | type | u8 | 2 = ACK |
| 4 | node_id | u8 | 原节点 |
| 5–6 | seq | u16 | 原序号 |
| 7 | status | u8 | 0 = OK |
| 8–9 | crc16 | u16 | 对偏移 2–7 计算 |
- 节点发 DATA,等 ACK ≤600ms;失败重试 ≤2 次,然后深睡。
- 网关校验 CRC;新
(node_id, seq)记录并回 ACK;重复帧仍回 ACK,但不重复入库。 - 16 位序号:60 秒上报可连续约 45 天不回绕;长期部署可加 boot/session id。
- 掉电/复位:节点用 RTC memory 保存 seq;长期断电后序号可能重置,网关可加时间窗/会话字段。
- Node:
buildDataFrame、crc16_ccitt、waitForAck、深睡。 - Gateway:有缓冲的状态机按 sync/type 找帧,CRC 通过后回 ACK 并打印 JSON。
- 两端 CRC/字段顺序必须与
protocol.py一致;改协议同步三处(Python、node、gateway)。
{"node":1,"seq":258,"temp_c":23.45,"humidity_pct":55.20,"soil_pct":41.30,"battery_mv":3600}