Files
DistributedCollectorGateway/docs/OFFLINE_STORAGE_TEST.md

215 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 离线存储功能测试指南
## 功能概述
离线存储功能会在网络断开时自动将数据存储到 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
- **最小文件大小**: 4KBSPIFFS 特性)
- **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` 获取详细的技术文档。