
PS: 在下面的內(nèi)容中,終端設(shè)備指的就是 ESP32 模組。
- AWS 平臺上,部署一個 OTA 升級任務時,需要完成哪些步驟;
- ESP32 模組中,關(guān)于 Flash 分區(qū)和 OTA 升級控制過程和代碼說明;
- 如何通過 ESP32,給與之相連的 MCU 進行 OTA 升級;
ESP32 Flash 分區(qū)
其實ESP32的官方文檔的過程描述,已經(jīng)是非常的詳細了。



factory 分區(qū);這三個分區(qū)的類型都是app,但具體app的類型不相同。
ota_0 分區(qū);
ota_1 分區(qū);
AWS 平臺部署 OTA 升級任務
AWS平臺按照不同的業(yè)務類型,劃分為不同的服務。這樣處理起來,流程更規(guī)范,操作步驟也更多,當然也更賺錢一些!
json格式的固件描述文檔,格式大概如下(可以根據(jù)實際的業(yè)務需求進行修改):
- 把固件(bin 文件)和一個固件描述文件(json格式的文本文件),上傳到 S3 云存儲服務器上;
- 在 AWS Core 任務管理中,新建一個升級任務(會得到一個 Job ID)。在這個任務中需要選擇:
(1) 步驟1中上傳的 json 文件;(2) 哪些終端設(shè)備需要升級;
"product": "產(chǎn)品名稱",
"group": "設(shè)備分組",
"firmware":
[
{
"ota_type": "esp32",
"url": "http://xxx/esp32-v1.1.0.bin",
"md5": "xxx"
}
]
}
不知道您是否注意到:在firmware字段中,使用的是數(shù)組([...]),而不是對象({...})?


ESP32 OTA 升級的觸發(fā)
ESP32與AWS平臺之間,是通過MQTT協(xié)議進行通信的。
"timestamp": "xxxxxx",
"job_id": "001"
}
當終端設(shè)備接收到這個升級通知指令時,提取出job_id字段,然后向云平臺發(fā)起請求:獲取與這個job_id關(guān)聯(lián)的固件描述信息,也就是之前上傳的Json格式的文件息。

ESP32 固件下載和本地升級
ESP32在提取出固件的下載地址(URL)之后,就開始進入下載環(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,