增加断网保存数据到FLASH,恢复联网重新补发,并加上标志位
This commit is contained in:
432
docs/OFFLINE_STORAGE.md
Normal file
432
docs/OFFLINE_STORAGE.md
Normal file
@@ -0,0 +1,432 @@
|
||||
# 离线数据存储和补传功能说明
|
||||
|
||||
## 功能概述
|
||||
|
||||
本设备支持离线数据存储功能,当网络断开时,数据会自动存储到Flash文件系统中;当网络恢复后,数据会自动补传到MQTT服务器。
|
||||
|
||||
## 系统架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ 应用层 │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ MODBUS数据 设备状态 MQTT客户端 │
|
||||
│ │ │ │ │
|
||||
│ ▼ ▼ ▼ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 离线数据管理模块 │ │
|
||||
│ │ (OFFLINE_STORAGE 组件) │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
│ │ │ │
|
||||
│ ▼ │ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ SPIFFS文件系统 │ │
|
||||
│ │ (FLASH_SPIFS 组件) │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
│ │ │ │
|
||||
│ ▼ │ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 16MB Flash存储区 │ │
|
||||
│ │ (8MB可用) │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## 分区表配置
|
||||
|
||||
```csv
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, 0x9000, 0x6000,
|
||||
phy_init, data, phy, 0xf000, 0x1000,
|
||||
factory, app, factory, 0x10000, 2MB,
|
||||
storage, data, spiffs, 0x210000,8MB,
|
||||
```
|
||||
|
||||
- **storage分区**:8MB,用于离线数据存储
|
||||
- **挂载点**:`/flash`
|
||||
- **文件系统**:SPIFFS
|
||||
|
||||
## 存储容量估算
|
||||
|
||||
| 参数 | 数值 |
|
||||
|------|------|
|
||||
| Flash总容量 | 16MB |
|
||||
| 存储分区大小 | 8MB |
|
||||
| MODBUS数据量 | 200字节/条(1秒/次) |
|
||||
| 每小时数据量 | 720KB |
|
||||
| 可存储时长 | 约11小时 |
|
||||
|
||||
**注意**:SPIFFS最小文件大小为4KB,200字节的文件实际占用4KB空间,因此实际可存储的时长会更短。建议将多条数据合并到一个文件中存储以提高空间利用率。
|
||||
|
||||
## 文件组织结构
|
||||
|
||||
```
|
||||
/flash/
|
||||
├── data/
|
||||
│ ├── modbus/ # MODBUS采集数据
|
||||
│ │ ├── 1738452345.json # 时间戳命名
|
||||
│ │ ├── 1738452346.json
|
||||
│ │ └── ...
|
||||
│ └── status/ # 设备状态数据
|
||||
│ ├── 1738452345.json
|
||||
│ └── ...
|
||||
└── index.json # 索引文件
|
||||
```
|
||||
|
||||
## 工作流程
|
||||
|
||||
### 正常模式(网络在线)
|
||||
|
||||
```
|
||||
数据产生
|
||||
↓
|
||||
检测网络状态(在线)
|
||||
↓
|
||||
直接发布到MQTT
|
||||
↓
|
||||
不存储
|
||||
```
|
||||
|
||||
### 离线模式(网络断开)
|
||||
|
||||
```
|
||||
数据产生
|
||||
↓
|
||||
检测网络状态(离线)
|
||||
↓
|
||||
存储到Flash SPIFFS
|
||||
↓
|
||||
写入成功
|
||||
↓
|
||||
等待网络恢复
|
||||
```
|
||||
|
||||
### 补传模式(网络恢复)
|
||||
|
||||
```
|
||||
检测网络状态(在线)
|
||||
↓
|
||||
检查是否有离线数据
|
||||
↓
|
||||
读取最旧的数据
|
||||
↓
|
||||
发布到MQTT
|
||||
↓
|
||||
发布成功?
|
||||
├─ 是 → 删除该数据 → 继续下一条
|
||||
└─ 否 → 等待重试
|
||||
```
|
||||
|
||||
## API接口
|
||||
|
||||
### FLASH_SPIFS 组件
|
||||
|
||||
#### 初始化文件系统
|
||||
|
||||
```c
|
||||
esp_err_t flash_spiffs_init(void);
|
||||
```
|
||||
|
||||
#### 检查是否挂载
|
||||
|
||||
```c
|
||||
bool flash_spiffs_is_mounted(void);
|
||||
```
|
||||
|
||||
#### 获取存储使用情况
|
||||
|
||||
```c
|
||||
uint32_t flash_spiffs_get_total_size(void);
|
||||
uint32_t flash_spiffs_get_used_size(void);
|
||||
```
|
||||
|
||||
#### 格式化文件系统
|
||||
|
||||
```c
|
||||
esp_err_t flash_spiffs_format(void);
|
||||
```
|
||||
|
||||
### OFFLINE_STORAGE 组件
|
||||
|
||||
#### 初始化存储模块
|
||||
|
||||
```c
|
||||
esp_err_t offline_storage_init(void);
|
||||
```
|
||||
|
||||
#### 存储离线数据
|
||||
|
||||
```c
|
||||
esp_err_t offline_storage_store(const char *data, size_t length, offline_data_type_t data_type);
|
||||
```
|
||||
|
||||
**参数**:
|
||||
- `data`:数据内容(JSON字符串)
|
||||
- `length`:数据长度
|
||||
- `data_type`:数据类型
|
||||
- `OFFLINE_DATA_TYPE_MODBUS`:MODBUS采集数据
|
||||
- `OFFLINE_DATA_TYPE_DEVICE_STATUS`:设备状态数据
|
||||
|
||||
#### 读取最旧的数据
|
||||
|
||||
```c
|
||||
esp_err_t offline_storage_read_oldest(char *buffer, size_t max_len, offline_data_type_t *out_data_type);
|
||||
```
|
||||
|
||||
#### 删除最旧的数据
|
||||
|
||||
```c
|
||||
esp_err_t offline_storage_delete_oldest(void);
|
||||
```
|
||||
|
||||
#### 获取数据数量
|
||||
|
||||
```c
|
||||
uint32_t offline_storage_get_count(void);
|
||||
bool offline_storage_has_data(void);
|
||||
```
|
||||
|
||||
#### 清空所有数据
|
||||
|
||||
```c
|
||||
esp_err_t offline_storage_clear_all(void);
|
||||
```
|
||||
|
||||
### MQTT_ESP 扩展接口
|
||||
|
||||
#### 存储离线数据(内部使用)
|
||||
|
||||
```c
|
||||
esp_err_t mqtt_store_offline(const char *data, size_t length, offline_data_type_t data_type);
|
||||
```
|
||||
|
||||
#### 启动/停止补传任务
|
||||
|
||||
```c
|
||||
BaseType_t mqtt_start_offline_upload_task(void);
|
||||
void mqtt_stop_offline_upload_task(void);
|
||||
```
|
||||
|
||||
## 网络状态检测
|
||||
|
||||
系统通过MQTT连接状态判断网络是否在线:
|
||||
|
||||
| MQTT事件 | 网络状态 | 处理 |
|
||||
|---------|---------|------|
|
||||
| `MQTT_EVENT_CONNECTED` | 在线 | 启动补传任务 |
|
||||
| `MQTT_EVENT_DISCONNECTED` | 离线 | 停止补传任务 |
|
||||
|
||||
## 存储策略
|
||||
|
||||
### 自动循环覆盖
|
||||
|
||||
- **最大文件数限制**:10,000个文件
|
||||
- **触发条件**:当文件数超过限制时,自动删除最旧的数据
|
||||
- **优先级**:按时间戳排序,删除最旧的数据
|
||||
|
||||
### 数据完整性保护
|
||||
|
||||
- **索引文件**:`/flash/index.json` 记录所有文件信息
|
||||
- **原子写入**:使用临时文件+重命名机制
|
||||
- **断电保护**:SPIFFS提供基本断电保护
|
||||
|
||||
### 存储空间管理
|
||||
|
||||
```
|
||||
获取空间使用情况
|
||||
↓
|
||||
检查可用空间
|
||||
↓
|
||||
空间不足?
|
||||
├─ 否 → 正常存储
|
||||
└─ 是 → 删除最旧数据 → 重试
|
||||
```
|
||||
|
||||
## SPIFFS 特性说明
|
||||
|
||||
### 优点
|
||||
- ESP-IDF原生支持,无需额外组件
|
||||
- 代码成熟稳定
|
||||
- 内存占用小(约2KB)
|
||||
- 挂载速度快
|
||||
|
||||
### 缺点
|
||||
- 最小文件大小为4KB,小文件浪费空间
|
||||
- 无磨损均衡,Flash寿命相对较短
|
||||
- 碎片严重,长期使用后性能下降
|
||||
- 不支持目录(所有文件在根目录)
|
||||
|
||||
### 优化建议
|
||||
|
||||
1. **合并多条数据到单个文件**:减少文件数量,提高空间利用率
|
||||
2. **定期格式化**:消除碎片,恢复性能
|
||||
3. **限制文件数量**:避免碎片积累
|
||||
|
||||
## 日志输出
|
||||
|
||||
### 初始化日志
|
||||
|
||||
```
|
||||
I (xxxx) main: Initializing SPIFFS file system...
|
||||
I (xxxx) FLASH_SPIFS: 正在初始化SPIFFS文件系统...
|
||||
I (xxxx) FLASH_SPIFS: SPIFFS文件系统挂载成功
|
||||
I (xxxx) FLASH_SPIFS: 总空间: 8388608 字节
|
||||
I (xxxx) FLASH_SPIFS: 已用空间: 4096 字节
|
||||
I (xxxx) FLASH_SPIFS: 可用空间: 8384512 字节
|
||||
I (xxxx) FLASH_SPIFS: 挂载点: /flash
|
||||
I (xxxx) main: Initializing offline storage module...
|
||||
I (xxxx) main: 离线存储模块初始化完成
|
||||
```
|
||||
|
||||
### 存储日志
|
||||
|
||||
```
|
||||
I (xxxx) mqtt_esp: Storing offline data (type=1, size=256)
|
||||
I (xxxx) OFFLINE_STORAGE: 存储数据: /flash/data/modbus/1738452345.json, 大小: 256 字节
|
||||
I (xxxx) OFFLINE_STORAGE: Storage usage: 4096 / 8388608 bytes (0.0%)
|
||||
W (xxxx) OFFLINE_STORAGE: 注意:SPIFFS最小文件大小为4KB,小文件会占用更多空间
|
||||
```
|
||||
|
||||
### 补传日志
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
## 故障处理
|
||||
|
||||
### Flash空间不足
|
||||
|
||||
**现象**:
|
||||
```
|
||||
E (xxxx) OFFLINE_STORAGE: 无法创建文件
|
||||
```
|
||||
|
||||
**解决**:
|
||||
1. 自动删除最旧的数据
|
||||
2. 格式化存储分区
|
||||
|
||||
### 文件系统损坏
|
||||
|
||||
**现象**:
|
||||
```
|
||||
E (xxxx) FLASH_SPIFS: 挂载失败
|
||||
```
|
||||
|
||||
**解决**:
|
||||
1. 系统会尝试自动修复
|
||||
2. 如修复失败,格式化文件系统
|
||||
3. 检查Flash硬件
|
||||
|
||||
### 数据补传失败
|
||||
|
||||
**现象**:
|
||||
```
|
||||
E (xxxx) mqtt_esp: Failed to publish offline data
|
||||
```
|
||||
|
||||
**解决**:
|
||||
1. 检查网络连接
|
||||
2. 检查MQTT服务器状态
|
||||
3. 数据会保留在Flash中,下次重试
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
### 1. 合并多条数据
|
||||
|
||||
将多条数据合并到一个文件中存储:
|
||||
|
||||
```c
|
||||
// 示例:每100条数据存储为一个文件
|
||||
// 空间利用率:100 * 200字节 / 4096字节 ≈ 4.9%
|
||||
// 单文件存储:100 * 200字节 / 4096字节 = 100%
|
||||
```
|
||||
|
||||
### 2. 降低存储频率
|
||||
|
||||
网络离线时降低存储频率:
|
||||
|
||||
```c
|
||||
// 在线:1秒/次
|
||||
// 离线:10秒/次
|
||||
// 可存储时长:110小时
|
||||
```
|
||||
|
||||
### 3. 选择性存储
|
||||
|
||||
只存储关键数据:
|
||||
|
||||
```c
|
||||
// 只存储异常数据、状态变化
|
||||
// 正常数据丢弃
|
||||
```
|
||||
|
||||
### 4. 定期格式化
|
||||
|
||||
建议每隔1-3个月格式化一次文件系统,消除碎片:
|
||||
|
||||
```c
|
||||
flash_spiffs_format();
|
||||
```
|
||||
|
||||
## 监控和调试
|
||||
|
||||
### 查看存储使用情况
|
||||
|
||||
```c
|
||||
size_t used = 0, total = 0;
|
||||
offline_storage_get_usage(&used, &total);
|
||||
ESP_LOGI(TAG, "Storage: %zu / %zu bytes", used, total);
|
||||
ESP_LOGI(TAG, "Usage: %.1f%%", (used * 100.0) / total);
|
||||
```
|
||||
|
||||
### 查看离线数据数量
|
||||
|
||||
```c
|
||||
uint32_t count = offline_storage_get_count();
|
||||
ESP_LOGI(TAG, "Offline data files: %u", count);
|
||||
```
|
||||
|
||||
### 格式化存储
|
||||
|
||||
```c
|
||||
flash_spiffs_format();
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **首次启动**:会自动格式化文件系统(如果需要)
|
||||
2. **断电保护**:SPIFFS提供基本断电保护,但建议避免频繁断电
|
||||
3. **Flash寿命**:SPIFFS无磨损均衡,建议定期格式化以延长寿命
|
||||
4. **容量限制**:由于SPIFFS最小文件4KB,实际可存储时长会少于理论值
|
||||
5. **补传速率**:每秒处理一条数据,避免阻塞新数据上传
|
||||
6. **碎片问题**:长期使用后性能可能下降,建议定期格式化
|
||||
|
||||
## 后续扩展建议
|
||||
|
||||
1. **数据压缩**:集成zlib压缩,延长存储时长
|
||||
2. **批量存储**:将多条数据合并到一个文件中
|
||||
3. **优先级队列**:重要数据优先补传
|
||||
4. **数据导出**:通过Web界面导出离线数据
|
||||
5. **统计信息**:记录丢失/补传的数据统计
|
||||
6. **智能采样**:根据存储空间动态调整采样率
|
||||
7. **定期维护**:实现自动碎片整理和格式化
|
||||
|
||||
## 与LittleFS对比
|
||||
|
||||
| 特性 | SPIFFS | LittleFS |
|
||||
|------|--------|----------|
|
||||
| 最小文件大小 | 4KB | 0字节 |
|
||||
| 内存占用 | ~2KB | ~4KB |
|
||||
| 磨损均衡 | ❌ 无 | ✅ 自带 |
|
||||
| 断电保护 | ⚠️ 一般 | ✅ 优秀 |
|
||||
| 支持目录 | ❌ 不支持 | ✅ 支持 |
|
||||
| 碎片问题 | ❌ 严重 | ✅ 轻微 |
|
||||
| ESP-IDF支持 | ✅ 原生支持 | ❌ 需第三方组件 |
|
||||
|
||||
**选择建议**:
|
||||
- 如果需要ESP-IDF原生支持且数据量不大 → SPIFFS
|
||||
- 如果需要更好的性能和寿命 → LittleFS(需手动添加组件)
|
||||
214
docs/OFFLINE_STORAGE_TEST.md
Normal file
214
docs/OFFLINE_STORAGE_TEST.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# 离线存储功能测试指南
|
||||
|
||||
## 功能概述
|
||||
|
||||
离线存储功能会在网络断开时自动将数据存储到 Flash 中,并在网络恢复后自动补传数据。
|
||||
|
||||
## 测试步骤
|
||||
|
||||
### 1. 编译并烧录固件
|
||||
|
||||
```bash
|
||||
cd "/home/beihong/esp_projects/Distributed Collector Gateway"
|
||||
idf.py build
|
||||
idf.py flash monitor
|
||||
```
|
||||
|
||||
### 2. 观察启动日志
|
||||
|
||||
系统启动时会显示以下关键日志:
|
||||
|
||||
```
|
||||
I (xxxx) main: Initializing SPIFFS file system...
|
||||
I (xxxx) FLASH_SPIFS: SPIFFS mounted successfully at /flash
|
||||
I (xxxx) FLASH_SPIFS: Total size: 8388608 bytes, Used: 0 bytes
|
||||
I (xxxx) main: Initializing offline storage module...
|
||||
I (xxxx) OFFLINE_STORAGE: Offline storage initialized
|
||||
I (xxxx) main: Offline data upload task started
|
||||
```
|
||||
|
||||
### 3. 测试场景A:网络断开时的数据存储
|
||||
|
||||
**操作步骤:**
|
||||
|
||||
1. 在系统正常运行时,断开网络连接(拔掉网线或断开路由器)
|
||||
2. 观察日志输出,应该看到网络断开的提示
|
||||
3. 等待 MODBUS 数据采集任务产生数据
|
||||
4. 观察日志,应该看到类似以下信息:
|
||||
|
||||
```
|
||||
W (xxxx) MQTT_ESP: Network offline, storing data locally (topic: xxx, len: xxx)
|
||||
I (xxxx) MQTT_ESP: Storing offline data (type=1, size=xxx)
|
||||
I (xxxx) OFFLINE_STORAGE: Stored offline data: /flash/offline/xxxxxx.json
|
||||
I (xxxx) MQTT_ESP: Storage usage: 4096 / 8388608 bytes (0.0%)
|
||||
```
|
||||
|
||||
**预期结果:**
|
||||
- 数据被成功存储到 Flash 中
|
||||
- 显示存储使用情况
|
||||
- 设备继续正常运行,不会因为网络断开而崩溃
|
||||
|
||||
### 4. 测试场景B:网络恢复时的自动补传
|
||||
|
||||
**操作步骤:**
|
||||
|
||||
1. 在测试场景A中存储了一些离线数据后
|
||||
2. 重新连接网络(插上网线或恢复路由器)
|
||||
3. 观察日志输出
|
||||
|
||||
**预期日志:**
|
||||
|
||||
```
|
||||
I (xxxx) MQTT_ESP: Network online, resuming normal operation
|
||||
I (xxxx) MQTT_ESP: Found 5 offline data files, uploading...
|
||||
I (xxxx) MQTT_ESP: Publishing offline data (type=1, size=xxx)
|
||||
I (xxxx) MQTT_ESP: Offline data published successfully, msg_id=xxx
|
||||
I (xxxx) OFFLINE_STORAGE: Deleted offline data: /flash/offline/xxxxxx.json
|
||||
I (xxxx) MQTT_ESP: Storage usage: 32768 / 8388608 bytes (0.4%)
|
||||
```
|
||||
|
||||
**预期结果:**
|
||||
- 系统自动检测到网络恢复
|
||||
- 自动开始上传离线存储的数据
|
||||
- 每次上传成功后删除对应文件
|
||||
- 逐条上传,直到所有离线数据都上传完成
|
||||
|
||||
### 5. 测试场景C:设备状态数据的离线存储
|
||||
|
||||
**操作步骤:**
|
||||
|
||||
1. 断开网络连接
|
||||
2. 等待设备状态上报周期(默认10秒)
|
||||
3. 观察日志输出
|
||||
|
||||
**预期日志:**
|
||||
|
||||
```
|
||||
W (xxxx) MQTT_ESP: Network offline, storing device status locally
|
||||
I (xxxx) MQTT_ESP: Storing offline data (type=2, size=xxx)
|
||||
I (xxxx) OFFLINE_STORAGE: Stored offline data: /flash/offline/xxxxxx.json
|
||||
```
|
||||
|
||||
**预期结果:**
|
||||
- 设备状态数据被正确识别为 OFFLINE_DATA_TYPE_DEVICE_STATUS 类型
|
||||
- 数据成功存储到 Flash
|
||||
|
||||
### 6. 测试场景D:存储空间耗尽
|
||||
|
||||
**操作步骤:**
|
||||
|
||||
1. 持续在网络断开状态下运行设备
|
||||
2. 让 MODBUS 数据持续产生(通过发送 MODBUS 查询命令)
|
||||
3. 观察存储使用率的变化
|
||||
|
||||
**预期日志:**
|
||||
|
||||
```
|
||||
I (xxxx) MQTT_ESP: Storage usage: 8355840 / 8388608 bytes (99.6%)
|
||||
W (xxxx) OFFLINE_STORAGE: Storage nearly full (99.6%), consider clearing old data
|
||||
```
|
||||
|
||||
**预期结果:**
|
||||
- 当存储空间快满时,系统会发出警告
|
||||
- 新数据仍然可以存储,直到空间完全耗尽
|
||||
- 系统继续正常运行
|
||||
|
||||
### 7. 测试场景E:手动清空离线数据
|
||||
|
||||
如果需要手动清空所有离线数据,可以:
|
||||
|
||||
1. 通过串口终端发送清空命令(需要自行实现)
|
||||
2. 或者重新格式化 SPIFFS 文件系统(会删除所有数据)
|
||||
|
||||
**格式化方法:**
|
||||
- 在代码中调用 `flash_spiffs_format()` 函数
|
||||
- 这会清空整个文件系统,包括离线数据和配置
|
||||
|
||||
## MQTT 服务器端验证
|
||||
|
||||
在 MQTT 服务器端(如使用 MQTTX 或 Mosquitto Client):
|
||||
|
||||
1. 订阅设备发布的主题:`CONFIG_MQTT_PUB_TOPIC`(在 sdkconfig 中配置)
|
||||
2. 在网络断开时,应该收不到新数据
|
||||
3. 在网络恢复后,应该收到之前存储的离线数据
|
||||
4. 验证接收到的数据完整性和顺序
|
||||
|
||||
## 常见问题排查
|
||||
|
||||
### 问题1:日志显示 "Failed to store offline data"
|
||||
|
||||
**可能原因:**
|
||||
- SPIFFS 文件系统挂载失败
|
||||
- Flash 存储空间已满
|
||||
- 文件系统错误
|
||||
|
||||
**解决方法:**
|
||||
1. 检查 SPIFFS 初始化日志
|
||||
2. 查看存储使用情况
|
||||
3. 必要时格式化文件系统
|
||||
|
||||
### 问题2:网络恢复后没有自动上传离线数据
|
||||
|
||||
**可能原因:**
|
||||
- 离线上传任务未启动
|
||||
- MQTT 客户端未连接
|
||||
- 网络状态判断错误
|
||||
|
||||
**解决方法:**
|
||||
1. 检查日志中是否有 "Offline data upload task started"
|
||||
2. 确认 MQTT 客户端已连接
|
||||
3. 检查 `g_is_online` 状态
|
||||
|
||||
### 问题3:离线数据上传不完整或丢失
|
||||
|
||||
**可能原因:**
|
||||
- MQTT 发布失败
|
||||
- 文件读取错误
|
||||
- 文件删除时机问题
|
||||
|
||||
**解决方法:**
|
||||
1. 查看日志中的错误信息
|
||||
2. 确认 MQTT 服务器可用
|
||||
3. 检查 Flash 文件完整性
|
||||
|
||||
## 性能测试
|
||||
|
||||
### 存储性能
|
||||
|
||||
- 每条数据存储时间:通常 < 100ms
|
||||
- 支持的数据大小:最大 4096 bytes(单条)
|
||||
- 存储容量:约 8MB(基于分区表配置)
|
||||
|
||||
### 上传性能
|
||||
|
||||
- 每条数据上传时间:取决于网络延迟
|
||||
- 上传间隔:1 秒(在离线上传任务中)
|
||||
- 支持的最大数据条数:约 2000 条(基于平均每条 4KB)
|
||||
|
||||
## 存储容量分析
|
||||
|
||||
基于当前配置:
|
||||
|
||||
- **分区大小**: 8MB
|
||||
- **SPIFFS 开销**: 约 10-20%
|
||||
- **可用空间**: 约 6.4-7.2MB
|
||||
- **最小文件大小**: 4KB(SPIFFS 特性)
|
||||
- **MODBUS 数据大小**: 约 200 bytes/秒
|
||||
- **可存储时长**: 约 2-3 小时
|
||||
|
||||
**注意:** 由于 SPIFFS 最小文件大小为 4KB,即使只有 200 bytes 的数据也会占用 4KB 空间。如果需要更长时间的离线存储,建议:
|
||||
1. 增大存储分区
|
||||
2. 使用 LittleFS 文件系统(支持更小的文件块)
|
||||
3. 实现数据打包存储(多条数据打包到一个文件)
|
||||
|
||||
## 测试总结
|
||||
|
||||
完成以上测试后,你应该能够验证:
|
||||
|
||||
1. ✅ 网络断开时数据能正确存储到 Flash
|
||||
2. ✅ 网络恢复时数据能自动补传
|
||||
3. ✅ 设备状态和 MODBUS 数据都能正确处理
|
||||
4. ✅ 存储空间管理正常
|
||||
5. ✅ 系统在各种网络状态切换下稳定运行
|
||||
|
||||
如有问题,请查看 ESP 日志输出,或参考 `docs/OFFLINE_STORAGE.md` 获取详细的技术文档。
|
||||
Reference in New Issue
Block a user