鸿蒙南向开发-优雅实现OpenHarmony的OTA升级

OTA简介

随着设备系统日新月异,用户如何及时获取系统的更新,体验新版本带来的新的体验,以及提升系统的稳定性和安全性成为了每个厂商都面临的严峻问题。OTA(Over the Air)提供对设备远程升级的能力。升级子系统对用户屏蔽了底层芯片的差异,对外提供了统一的升级接口。基于接口进行二次开发后,可以让厂商的设备(如IP摄像头等)轻松支持远程升级能力。

OTA升级包类型

升级包常见有3种类型,主要包括:全量升级包、差分升级包以及变分区升级包。

image.png

• 全量升级包:升级包中只包括镜像全量升级相关数据,用于镜像全量升级;

• 差分升级包:升级包中只包括镜像差分升级相关数据,用于镜像差分升级;

• 变分区升:升级包中包括分区表、镜像全量数据,用于变分区处理和变分区后的镜像恢复。

适用范围

OpenAtom OpenHarmony(简称“OpenHarmony”) 3.1 Release不支持富设备升级,本章节所有实例在OpenHarmony 3.2 Beta3上验证,升级方式为全量升级,所用开发板为诚迈科技基于RK3568设计的HCPAD-100开发板以及OpenHarmony主干使用的DAYU200开发板。可使用HCPAD-100开发板或DAYU200开发板验证,patch已提供,其他开发板可能存在差异,请自行验证。

OTA升级步骤

image.png

1. 制作升级包(update_packaging_tools需切换至master分支)

1.1 创建目标版本(target_package)文件夹,文件格式如下:

image.png

1.2 将待升级的组件,包括镜像文件(例如:system.img)等放入目标版本文件夹的根目录下,代替上文结构中的{component_N}部分。

1.3 填写“updater_config”文件夹中的组件配置文件。

1.3.1 配置“updater_config”文件夹中当前升级包支持的产品list:BOARD.list。

RK3568

1.3.2 配置“updater_config”文件夹中当前升级包所支持的版本范围:VERSION.mbn。

版本名称格式:RK3568 QP1A.XXXXXX.{大版本号(6位)}.XXX{小版本号(3位)}。例如:RK3568 QP1A.190711.020。名称中“190711”为大版本号,“020”为小版本号。

<think>好的,我现在需要帮助用户了解如何在ESP-IDF框架中实现OTA分区的OTA升级。首先,我得回忆一下ESP-IDF的OTA机制。根据引用[1]、[2]、[3],ESP-IDF支持OTA升级,允许设备通过网络更新固件。双OTA分区通常意味着有两个OTA分区,比如ota_0和ota_1,这样可以实现无缝回滚和更安全的升级。用户提到双OTA分区,我需要确认ESP-IDF是否原生支持。根据引用[3],原生API如esp_ota_begin和esp_ota_write用于处理OTA流程,而引用[4]提到自定义分区表,可能涉及定义多个OTA分区。所以,可能需要配置分区表来包含两个OTA分区。接下来,步骤可能包括:1.修改分区表,定义两个OTA分区;2.配置引导程序选择正确的分区;3.实现OTA逻辑,交替使用两个分区。引用[2]提到两种方法,使用app_update组件或esp_https_ota,这里可能需要使用app_update的API来管理双分区。还要考虑OTA流程中的验证,比如检查新固件是否正确,再切换启动分区。引用[4]提到验证更新,所以可能需要计算校验和或签名验证。此外,确保在写入新固件时选择正确的OTA分区,这涉及到esp_ota_get_next_update_partition函数,如引用[3]中的函数。用户可能需要示例代码,特别是如何交替写入两个分区。例如,每次升级时检查当前活动分区,然后选择另一个作为目标。同时,引导加载程序(bootloader)需要知道如何选择最新的有效固件,这可能需要设置OTA数据分区来存储当前状态。可能的问题包括分区表配置错误,导致无法识别两个OTA分区,或者升级后无法正确切换。需要指导用户如何调试,比如查看分区表和日志信息。另外,引用[4]的自定义分区方法可能适用于双OTA,但需要调整分区大小和地址。 最后,生成相关问题时,要考虑用户可能的后续疑问,比如性能优化、安全机制或具体代码示例。确保回答结构清晰,分步骤解释,并引用相关文档或示例。</think>在ESP-IDF框架中实现OTA分区的OTA升级,需遵循以下步骤和原理: ### 一、双OTA分区实现原理 1. **分区表定义**:需在`partitions.csv`中定义两个OTA分区(如`ota_0`和`ota_1`),并设置`ota_data`分区存储升级状态[^4] $$ # Name | Type | SubType | Offset | Size ota_0, 0, ota_0, 0x20000, 1M ota_1, 0, ota_1, 0x120000, 1M ota_data, data, ota, 0x220000, 8K $$ 2. **启动逻辑**:`bootloader`通过`ota_data`分区判断当前活跃的OTA分区[^3] ### 二、实现步骤 1. **修改分区表** ```c // partitions.csv factory, app, factory, 0x10000, 1M ota_0, app, ota_0, , 1M ota_1, app, ota_1, , 1M ota_data, data, ota, , 8K ``` 2. **OTA升级核心代码** ```c const esp_partition_t *update_partition = esp_ota_get_next_update_partition(NULL); esp_ota_handle_t ota_handle; ESP_ERROR_CHECK(esp_ota_begin(update_partition, firmware_size, &ota_handle)); // 写入数据循环 while ((n = esp_http_client_read(client, ota_buf, BUFFER_SIZE)) > 0) { esp_ota_write(ota_handle, ota_buf, n); } // 验证并切换分区 ESP_ERROR_CHECK(esp_ota_end(ota_handle)); ESP_ERROR_CHECK(esp_ota_set_boot_partition(update_partition)); ``` 3. **安全验证(可选)** - 使用`esp_ota_get_app_elf_sha256()`验证固件哈希 - HTTPS加密传输(需启用`esp_https_ota`组件)[^2] ### 三、关键API说明 1. `esp_ota_get_next_update_partition()`:自动选择非活跃OTA分区[^3] 2. `esp_ota_set_boot_partition()`:设置下次启动的分区[^3] 3. `esp_ota_mark_app_valid_cancel_rollback()`:确认固件有效[^3] ### 四、调试要点 1. 使用`idf.py partition-table`查看分区布局 2. 通过`esp_ota_get_running_partition()`获取当前运行分区 3. 串口日志中关注`OTA sequence number`验证切换逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值