ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理
扫描二维码
随时随地手机看文章
PS: 在下面的内容中,终端设备指的就是 ESP32 模组。
- AWS 平台上,部署一个 OTA 升级任务时,需要完成哪些步骤;
- ESP32 模组中,关于 Flash 分区和 OTA 升级控制过程和代码说明;
- 如何通过 ESP32,给与之相连的 MCU 进行 OTA 升级;
ESP32 Flash 分区
其实ESP32的官方文档的过程描述,已经是非常的详细了。
factory 分区;这三个分区的类型都是app,但具体app的类型不相同。
ota_0 分区;
ota_1 分区;
AWS 平台部署 OTA 升级任务
AWS平台按照不同的业务类型,划分为不同的服务。这样处理起来,流程更规范,操作步骤也更多,当然也更赚钱一些!
json格式的固件描述文档,格式大概如下(可以根据实际的业务需求进行修改):
- 把固件(bin 文件)和一个固件描述文件(json格式的文本文件),上传到 S3 云存储服务器上;
- 在 AWS Core 任务管理中,新建一个升级任务(会得到一个 Job ID)。在这个任务中需要选择:
(1) 步骤1中上传的 json 文件;(2) 哪些终端设备需要升级;
"product": "产品名称",
"group": "设备分组",
"firmware":
[
{
"ota_type": "esp32",
"url": "http://xxx/esp32-v1.1.0.bin",
"md5": "xxx"
}
]
}
不知道您是否注意到:在firmware字段中,使用的是数组([...]),而不是对象({...})?
ESP32 OTA 升级的触发
ESP32与AWS平台之间,是通过MQTT协议进行通信的。
"timestamp": "xxxxxx",
"job_id": "001"
}
当终端设备接收到这个升级通知指令时,提取出job_id字段,然后向云平台发起请求:获取与这个job_id关联的固件描述信息,也就是之前上传的Json格式的文件息。
ESP32 固件下载和本地升级
ESP32在提取出固件的下载地址(URL)之后,就开始进入下载环节了。
while (1) {
int data_read = esp_http_client_read(client, ota_write_data, BUFFSIZE);
...
if (data_read > 0) {
if (image_header_was_checked == false) {
esp_app_desc_t new_app_info;
if (data_read > sizeof(esp_image_header_t) sizeof(esp_image_segment_header_t) sizeof(esp_app_desc_t)) {
// check current version with downloading
if (esp_efuse_check_secure_version(new_app_info.secure_version) == false) {
ESP_LOGE(TAG, "This a new app can not be downloaded due to a secure version is lower than stored in efuse.");
http_cleanup(client);
task_fatal_error();
}
image_header_was_checked = true;
esp_ota_begin(update_partition, OTA_SIZE_UNKNOWN,