主要包括下面3部分內(nèi)容:
PS: 在下面的內(nèi)容中,終端設備指的就是 ESP32 模組。
- AWS 平臺上,部署一個 OTA 升級任務時,需要完成哪些步驟;
- ESP32 模組中,關于 Flash 分區(qū)和 OTA 升級控制過程和代碼說明;
- 如何通過 ESP32,給與之相連的 MCU 進行 OTA 升級;
ESP32 Flash 分區(qū)
其實ESP32的官方文檔的過程描述,已經(jīng)是非常的詳細了。
有 OTA 功能的分區(qū)表:
官方的文檔鏈接在這里: https://docs.espressif.com/projects/esp-idf/zh_CN/v4.3-beta3/esp32/api-guides/partition-tables.html。
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) 哪些終端設備需要升級;
"product": "產(chǎn)品名稱",
"group": "設備分組",
"firmware":
[
{
"ota_type": "esp32",
"url": "http://xxx/esp32-v1.1.0.bin",
"md5": "xxx"
}
]
}
不知道您是否注意到:在firmware字段中,使用的是數(shù)組([...]),而不是對象({...})?
對了,一個終端在通過網(wǎng)絡連接到云平臺時,都有一個唯一的 ID編號,一般都是利用ESP32模組上的網(wǎng)卡MAC地址來作為唯一ID。
也就是說:一個Job ID就對應著一次OTA升級任務。終端設備在進行OTA升級過程中,就是從這個Job ID開始的。
ESP32 OTA 升級的觸發(fā)
ESP32與AWS平臺之間,是通過MQTT協(xié)議進行通信的。
"timestamp": "xxxxxx",
"job_id": "001"
}
當終端設備接收到這個升級通知指令時,提取出job_id字段,然后向云平臺發(fā)起請求:獲取與這個job_id關聯(lián)的固件描述信息,也就是之前上傳的Json格式的文件息。
以上的過程描述,基本上是一個終端設備觸發(fā)OTA升級的最基本的過程。
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,





