增加断网保存数据到FLASH,恢复联网重新补发,并加上标志位
This commit is contained in:
90
README.md
90
README.md
@@ -4,6 +4,12 @@
|
||||
|
||||
本设备是一个分布式采集网关,支持通过 MQTT 远程控制 MODBUS RTU 轮询参数,并定期上报设备状态信息。
|
||||
|
||||
**新增功能**:
|
||||
- ✅ **离线数据存储**:网络断开时自动存储数据到Flash
|
||||
- ✅ **自动补传**:网络恢复后自动补传离线数据到MQTT服务器
|
||||
- ✅ **SPIFFS文件系统**:ESP-IDF原生支持,稳定可靠
|
||||
- ✅ **8MB存储容量**:可存储约11小时离线数据(注意:SPIFFS最小文件4KB)
|
||||
|
||||
## SNTP 时间同步
|
||||
|
||||
设备内置 SNTP(Simple 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 测试
|
||||
|
||||
|
||||
Reference in New Issue
Block a user