ESP32 開(kāi)發(fā)之:亞馬遜 AWS 平臺(tái) OTA 升級(jí)過(guò)程完全梳理
主要包括下面3部分內(nèi)容:
PS: 在下面的內(nèi)容中,終端設(shè)備指的就是 ESP32 模組。
- AWS 平臺(tái)上,部署一個(gè) OTA 升級(jí)任務(wù)時(shí),需要完成哪些步驟;
- ESP32 模組中,關(guān)于 Flash 分區(qū)和 OTA 升級(jí)控制過(guò)程和代碼說(shuō)明;
- 如何通過(guò) ESP32,給與之相連的 MCU 進(jìn)行 OTA 升級(jí);
ESP32 Flash 分區(qū)
其實(shí)ESP32的官方文檔的過(guò)程描述,已經(jīng)是非常的詳細(xì)了。
有 OTA 功能的分區(qū)表:
官方的文檔鏈接在這里: https://docs.espressif.com/projects/esp-idf/zh_CN/v4.3-beta3/esp32/api-guides/partition-tables.html。
factory 分區(qū);這三個(gè)分區(qū)的類型都是app,但具體app的類型不相同。
ota_0 分區(qū);
ota_1 分區(qū);
AWS 平臺(tái)部署 OTA 升級(jí)任務(wù)
AWS平臺(tái)按照不同的業(yè)務(wù)類型,劃分為不同的服務(wù)。這樣處理起來(lái),流程更規(guī)范,操作步驟也更多,當(dāng)然也更賺錢一些!
json格式的固件描述文檔,格式大概如下(可以根據(jù)實(shí)際的業(yè)務(wù)需求進(jìn)行修改):
- 把固件(bin 文件)和一個(gè)固件描述文件(json格式的文本文件),上傳到 S3 云存儲(chǔ)服務(wù)器上;
- 在 AWS Core 任務(wù)管理中,新建一個(gè)升級(jí)任務(wù)(會(huì)得到一個(gè) Job ID)。在這個(gè)任務(wù)中需要選擇:
(1) 步驟1中上傳的 json 文件;(2) 哪些終端設(shè)備需要升級(jí);
"product": "產(chǎn)品名稱",
"group": "設(shè)備分組",
"firmware":
[
{
"ota_type": "esp32",
"url": "http://xxx/esp32-v1.1.0.bin",
"md5": "xxx"
}
]
}
不知道您是否注意到:在firmware字段中,使用的是數(shù)組([...]),而不是對(duì)象({...})?
對(duì)了,一個(gè)終端在通過(guò)網(wǎng)絡(luò)連接到云平臺(tái)時(shí),都有一個(gè)唯一的 ID編號(hào),一般都是利用ESP32模組上的網(wǎng)卡MAC地址來(lái)作為唯一ID。
也就是說(shuō):一個(gè)Job ID就對(duì)應(yīng)著一次OTA升級(jí)任務(wù)。終端設(shè)備在進(jìn)行OTA升級(jí)過(guò)程中,就是從這個(gè)Job ID開(kāi)始的。
ESP32 OTA 升級(jí)的觸發(fā)
ESP32與AWS平臺(tái)之間,是通過(guò)MQTT協(xié)議進(jìn)行通信的。
"timestamp": "xxxxxx",
"job_id": "001"
}
當(dāng)終端設(shè)備接收到這個(gè)升級(jí)通知指令時(shí),提取出job_id字段,然后向云平臺(tái)發(fā)起請(qǐng)求:獲取與這個(gè)job_id關(guān)聯(lián)的固件描述信息,也就是之前上傳的Json格式的文件息。
以上的過(guò)程描述,基本上是一個(gè)終端設(shè)備觸發(fā)OTA升級(jí)的最基本的過(guò)程。
ESP32 固件下載和本地升級(jí)
ESP32在提取出固件的下載地址(URL)之后,就開(kāi)始進(jìn)入下載環(huán)節(jié)了。
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,





