From 201dbb2164ac14e145858e3d36013f4352307d61 Mon Sep 17 00:00:00 2001 From: Natsume1710 <162396185+Natsume1710@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:47:48 +0800 Subject: [PATCH] Update README.md --- 06-NetworkIot/README.md | 110 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 103 insertions(+), 7 deletions(-) diff --git a/06-NetworkIot/README.md b/06-NetworkIot/README.md index df02e48..f10e6d3 100644 --- a/06-NetworkIot/README.md +++ b/06-NetworkIot/README.md @@ -255,16 +255,112 @@ close(sock); - 认证方式:三元组 / MQTT 密钥 / TLS 证书 ### OTA 升级机制 -- 本地或远程固件更新,防止刷写失败 -- 双分区设计(bootA / bootB) -- 签名验证与版本控制 +> 支持远程更新嵌入式系统的固件版本 +1. 双分区升级架构 + +```plaintext +Flash布局: ++-------------------+ 0x08000000 +| Bootloader | ++-------------------+ 0x08010000 +| Application Slot A| ++-------------------+ 0x08040000 +| Application Slot B| ++-------------------+ 0x08070000 +| Configuration Area| ++-------------------+ +``` +2. 升级状态机实现 ```c -// OTA 示例流程 -1. 下载固件至指定 Flash 区域 -2. 校验 MD5 / 签名 -3. 更新启动地址 / 重启 +typedef enum { + OTA_IDLE, // 空闲状态 + OTA_CHECKING, // 检查更新 + OTA_DOWNLOADING, // 下载中 + OTA_VERIFYING, // 校验中 + OTA_READY, // 准备重启 + OTA_UPGRADING, // 升级中 + OTA_FAILED // 升级失败 +} OTA_State_t; + +// OTA状态机处理函数 +void OTA_Process(void) { + switch (ota_state) { + case OTA_IDLE: + if (check_update_flag) { + ota_state = OTA_CHECKING; + vCheckForUpdate(); + } + break; + + case OTA_DOWNLOADING: + if (download_complete) { + ota_state = OTA_VERIFYING; + vVerifyFirmware(); + } else if (download_error) { + ota_state = OTA_FAILED; + vHandleError(DOWNLOAD_ERROR); + } + break; + + // 其他状态处理... + } +} ``` +3. 失败回滚机制 + +```c +// 启动时验证应用完整性 +bool ValidateApplication(uint32_t start_address) { + // 检查向量表签名 + uint32_t *vector_table = (uint32_t *)start_address; + if (vector_table[0] == 0xFFFFFFFF) { // 检查栈顶指针是否有效 + return false; + } + + // 计算应用哈希并验证 + uint8_t calculated_hash[32]; + SHA256((uint8_t *)start_address, APPLICATION_SIZE, calculated_hash); + + // 从配置区获取预期哈希 + uint8_t *expected_hash = GetExpectedHash(); + return (memcmp(calculated_hash, expected_hash, 32) == 0); +} + +// 主程序 +int main(void) { + // 初始化硬件 + HAL_Init(); + SystemClock_Config(); + + // 检查主应用是否有效 + if (ValidateApplication(APPLICATION_SLOT_A_ADDRESS)) { + // 跳转到主应用 + JumpToApplication(APPLICATION_SLOT_A_ADDRESS); + } else if (ValidateApplication(APPLICATION_SLOT_B_ADDRESS)) { + // 主应用无效,尝试从备份应用启动 + JumpToApplication(APPLICATION_SLOT_B_ADDRESS); + } else { + // 两个应用都无效,进入恢复模式 + EnterRecoveryMode(); + } +} +``` +#### ✅ OTA 流程核心步骤 + +1. 检查版本更新(HTTP/MQTT 下载 manifest) +2. 下载固件(二进制) +3. 存储到备份区(Backup Slot) +4. 校验 CRC/Hash / 签名 +5. 设置 Bootloader 标志位并重启 +6. Bootloader 引导进入新固件 +7. 若失败则回滚(Fail-safe 机制) + +#### ✅ 常用升级协议 + +- HTTP / HTTPS +- MQTT + Base64 二进制块传输 +- CoAP(轻量级) ---