嵌入式 OTA(远程固件升级)(二)

嵌入式 OTA(远程固件升级)(二) 1. 引言本文档详细描述了本项目储能备份管理系统中 OTAOver-The-Air远程固件升级功能的完整技术实现方案。OTA 升级是嵌入式系统的重要功能确保设备能够在不人工干预的情况下远程更新固件提高系统的维护效率和安全性。本方案基于 MQTT 通信协议通过云端下发升级命令设备自动执行下载、校验、安装和重启流程。整个升级过程采用状态机设计确保可靠性。2. 升级包格式2.1 包结构设计升级包采用分层压缩格式确保传输效率和安全性远程升级包 (app_nccu.tar.gz) ├── app_nccu.tar.gz # 实际应用固件包 ├── pkg.sum # MD5校验文件 └── [可选] upgrade_script.sh # 升级脚本本项目未使用2.2 内部固件包内容app_nccu.tar.gz包含完整的应用程序和配置文件/app/ # 目标安装目录 ├── nccu # 主应用程序 ├── config/ # 配置文件目录 ├── lib/ # 依赖库 └── [其他应用文件]2.3 包命名规范下载文件名LOCAL_UPGRADE_FIRMWARE_NAME(定义为固定的本地文件名)解压后文件名app_nccu.tar.gz校验文件名pkg.sum2.4 包大小限制最大包大小受限于/var/volatile目录空间通常为 RAM 盘建议包大小 100MB考虑解压时间和内存限制3. 校验命令3.1 MD5 校验机制3.1.1 校验文件格式 (pkg.sum)MD5(app_nccu.tar.gz) [32位十六进制MD5值]例如MD5(app_nccu.tar.gz) a1b2c3d4e5f678901234567890abcdef3.1.2 校验函数实现// 函数位置sampler_system.c BOOL DoMD5Chk_ForRemotePkg(BOOL bIsForCCU) { // 读取 pkg.sum 文件 // 计算 app_nccu.tar.gz 的实际 MD5 // 比较校验值 // 返回校验结果 }3.1.3 校验流程读取/var/volatile/pkg.sum文件内容计算/var/volatile/app_nccu.tar.gz的 MD5 值比较两个 MD5 值是否一致校验失败时记录错误日志并上报失败状态3.2 文件存在性校验在解压后进行基础校验# 检查必需文件是否存在 if [ ! -f /var/volatile/app_nccu.tar.gz ] || [ ! -f /var/volatile/pkg.sum ]; then # 校验失败处理 fi3.3 校验失败处理状态上报FIRMUPDATE_InstallFailed日志记录详细记录校验失败原因清理操作删除下载的无效文件重置状态回到UPDOWN_IDLE状态4. 升级日志机制4.1 日志分类4.1.1 系统日志 (通过LogOut函数)LogOut(MAIN_MODULE_SAMPLER, Sys, LOG_TYPE_INFO, Begin download firmware from URL[%s]!, url); LogOut(MAIN_MODULE_SAMPLER, Sys, LOG_TYPE_ERROR, MD5 chk FAILED after downloaded from URL[%s]!, url);4.1.2 事件日志 (通过EVENT_TYPE_FIRMWARE_UPDATE)EVENT_FIRMWAREUPDATE_STATUS evFirmUpdt; evFirmUpdt.emUpdateStatus FIRMUPDATE_Downloading; SendMsg(pSys_Rough-hSampler, EVENT_TYPE_FIRMWARE_UPDATE, EVENT_MSG_BEGIN, evFirmUpdt, sizeof(EVENT_FIRMWAREUPDATE_STATUS));4.2 日志级别定义LOG_TYPE_INFO正常操作信息LOG_TYPE_ERROR错误信息LOG_TYPE_WARING警告信息4.3 关键日志点开始下载记录下载 URL下载进度通过 TRACE 记录下载状态下载完成/失败记录结果和重试次数校验开始/结果记录 MD5 校验过程安装过程记录解压、文件替换操作重启触发记录系统重启原因4.4 日志存储位置运行时日志存储在内存或/var/log/持久化日志可能通过专门的日志模块保存到 Flash5. 重启策略5.1 重启时机控制5.1.1 充电状态检查在准备重启前检查所有充电枪状态DATA_PROCESSOR* pDPR (DATA_PROCESSOR*)((SAMPLER*)pSys_Rough-hSampler)-hDPR; for(n 0; n 3; n) { pDPR-Get(pSys_Rough-hSampler, GETTYPE_SP_VAR, 201 n, 101, varV, 4); if((varV.emValue GUN_STATE_RESERVE_PENDING) (varV.emValue GUN_STATE_WAITING_END)) { // 正在充电延迟重启 return; } }5.1.2 CCU 升级同步如果升级包包含 CCU充电控制器固件if(IsInclued_CCUFimrwarePkg(pSys_Rough)) { pSys_Rough-emDownloadStatus UPDOWN_WAIT_REBOOT_AND_CCU; // 等待 CCU 升级完成后再重启主系统 }5.2 重启执行流程5.2.1 发送重启事件EVENT_SYSTEM_EXIT evExit; evExit.nExitType SYS_EXIT_FIRMWAREUPDT; SendMsg(pSys_Rough-hSampler, EVENT_TYPE_SYSTEM_EXIT, EVENT_MSG_BEGIN, evExit, sizeof(EVENT_SYSTEM_EXIT));5.2.2 系统级重启重启由系统事件处理器处理通常执行# 系统重启命令在事件处理器中 reboot # 或 shutdown -r now5.3 重启安全保障5.3.1 原子性保证文件替换使用sync命令确保写入 Flash重启前确保所有文件操作完成5.3.2 失败回滚机制保留旧版本应用文件启动脚本检测升级标志失败时回滚5.3.3 重启超时保护设置 watchdog 确保重启过程不卡死重启失败时自动恢复到安全模式6. 完整升级流程图云端下发升级命令 (MQTT S_404) ↓ 设备解析命令 → 生成 A_BLOB_UPDATEFIRMWARE_CMD ↓ 写入 DAI 控制参数 ↓ 采样器检测到新命令 ↓ 等待 dtRetrieveDate 时间到达 ↓ 开始下载固件包 (HTTP/FTP) ↓ 下载中... (状态: UPDOWN_PENDING) ↓ 下载完成/失败 ↓ (失败) 重试 (最多 nDownloadRetries 次) ↓ (成功) 解压到 /var/volatile/ ↓ 检查文件存在性 (app_nccu.tar.gz pkg.sum) ↓ MD5 校验 ↓ 校验通过 ↓ (失败) 上报失败状态清理文件 ↓ (成功) 解压到 /app 目录 (tar -zxf ... -C /app) ↓ sync 确保写入完成 ↓ 检查充电状态 (是否可以安全重启) ↓ 检查 CCU 升级状态 ↓ 发送重启事件 (EVENT_SYSTEM_EXIT) ↓ 系统重启完成升级7. 配置参数说明7.1 升级相关配置项参数类型默认值说明nDownloadRetriesint3下载重试次数nRetryIntervint60重试间隔(秒)dtRetrieveDatetime_t0升级开始时间7.2 超时设置下载超时1800 秒 (30 分钟)重启等待检查充电状态间隔CCU 同步等待最多 3 次状态检查8. 异常处理策略8.1 下载异常网络断开重试机制服务器错误记录错误并重试磁盘空间不足立即失败并上报8.2 校验异常MD5 不匹配删除下载文件标记失败文件损坏同上8.3 安装异常解压失败回滚到原版本文件替换失败保持原版本运行8.4 重启异常重启失败系统 watchdog 触发安全重启启动失败启动脚本检测并回滚9. 测试建议9.1 单元测试MD5 校验函数测试状态机转换测试事件上报测试9.2 集成测试完整升级流程测试网络异常测试断电重启测试9.3 压力测试大文件下载测试并发升级测试长时间运行稳定性测试10. 维护建议定期检查升级日志监控升级成功率升级包版本管理确保云端只下发兼容版本回滚机制完善准备手动回滚方案监控升级状态实时监控设备升级进度安全加固验证升级包来源和完整性本文档基于项目源码分析编写涵盖了 OTA 升级功能的核心技术实现。