增加断网保存数据到FLASH,恢复联网重新补发,并加上标志位

This commit is contained in:
Wang Beihong
2026-02-02 00:31:52 +08:00
parent 86b2425e93
commit d56c730cfe
19 changed files with 1853 additions and 52 deletions

View File

@@ -4,6 +4,12 @@
本设备是一个分布式采集网关,支持通过 MQTT 远程控制 MODBUS RTU 轮询参数,并定期上报设备状态信息。
**新增功能**
-**离线数据存储**网络断开时自动存储数据到Flash
-**自动补传**网络恢复后自动补传离线数据到MQTT服务器
-**SPIFFS文件系统**ESP-IDF原生支持稳定可靠
-**8MB存储容量**可存储约11小时离线数据注意SPIFFS最小文件4KB
## SNTP 时间同步
设备内置 SNTPSimple Network Time Protocol时间同步功能在网络连接成功后会自动同步系统时间。
@@ -393,6 +399,89 @@ mqtt_start_device_status_task(10000); // 10000ms = 10秒
mqtt_update_report_interval(5000); // 5秒
```
## 离线数据存储
### 功能特性
设备支持离线数据存储功能,确保网络断开时数据不丢失:
- **自动检测**实时监测网络状态通过MQTT连接状态
- **离线存储**网络断开时自动存储数据到Flash
- **自动补传**网络恢复后自动补传离线数据到MQTT服务器
- **LittleFS文件系统**:提供断电保护和磨损均衡
- **8MB存储容量**可存储约11小时离线数据
### 存储容量
| 数据类型 | 数据量 | 可存储时长 |
|---------|--------|----------|
| MODBUS数据 | 200字节/条1秒/次) | 约11小时注意SPIFFS最小文件4KB |
### 工作流程
#### 正常模式(网络在线)
```
数据产生 → 直接发布到MQTT → 不存储
```
#### 离线模式(网络断开)
```
数据产生 → 存储到Flash SPIFFS → 等待网络恢复
```
#### 补传模式(网络恢复)
```
检测网络恢复 → 读取最旧数据 → 发布到MQTT → 删除已传数据 → 继续下一条
```
### 存储结构
```
/flash/
├── data/
│ ├── modbus/ # MODBUS采集数据
│ │ ├── 1738452345.json # 时间戳命名
│ │ └── ...
│ └── status/ # 设备状态数据
│ └── ...
└── index.json # 索引文件
```
### 日志示例
#### 存储离线数据
```
I (xxxx) mqtt_esp: Network is offline, stopping offline data upload
I (xxxx) mqtt_esp: Storing offline data (type=1, size=256)
I (xxxx) OFFLINE_STORAGE: Storage usage: 512 / 8388608 bytes (0.0%)
```
#### 补传离线数据
```
I (xxxx) mqtt_esp: Network is online, starting offline data upload
I (xxxx) mqtt_esp: Found 10 offline data files, uploading...
I (xxxx) mqtt_esp: Publishing offline data (type=1, size=256)
I (xxxx) mqtt_esp: Offline data published successfully, msg_id=12345
```
### 存储策略
- **自动循环覆盖**最多存储10,000个文件超出自动删除最旧数据
- **时间戳排序**:按时间戳顺序补传,确保数据时间顺序
- **原子写入**:使用临时文件+重命名机制
- **断电保护**SPIFFS提供基本的断电保护
### 注意事项
1. **首次启动**会自动初始化并挂载SPIFFS文件系统
2. **空间管理**:存储满后自动循环覆盖最旧数据
3. **补传速率**:每秒处理一条数据,避免阻塞新数据上传
4. **Flash寿命**SPIFFS无磨损均衡建议定期格式化
5. **最小文件限制**SPIFFS最小文件4KB小文件会浪费空间
6. **格式化**:如需清空所有数据,可调用 `flash_spiffs_format()`
详细文档请参考:[离线数据存储和补传功能说明](docs/OFFLINE_STORAGE.md)
## 注意事项
1. **轮询间隔最小为 100ms**,设置更小的值会被拒绝
@@ -400,6 +489,7 @@ mqtt_update_report_interval(5000); // 5秒
3. **从机地址范围 1-247**0 为广播地址
4. **通道号只能是 0 或 1**
5. 首次发送指令后会自动启动轮询任务
6. **离线存储容量约11小时**,超出会循环覆盖最旧数据
## 使用 mosquitto_cli 测试