[導(dǎo)讀]在最近的兩篇文章中,我們從概念和流程上梳理了:一個終端設(shè)備如何把一個固件,安全無誤的從服務(wù)器上,下載到本地。文章鏈接在此:物聯(lián)網(wǎng)設(shè)備OTA軟件升級之:升級包下載過程之旅物聯(lián)網(wǎng)設(shè)備OTA軟件升級之:完全升級和增量升級這篇文章就繼續(xù)往下深入,以一個實際的ESP32項目,來完整的梳理一...
在最近的兩篇文章中,我們從概念和流程上梳理了: 一個終端設(shè)備如何把一個固件,安全無誤的從服務(wù)器上,下載到本地。
主要包括下面3部分內(nèi)容:
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。
AWS 平臺部署 OTA 升級任務(wù)
AWS平臺按照不同的業(yè)務(wù)類型,劃分為不同的服務(wù)。這樣處理起來,流程更規(guī)范,操作步驟也更多,當然也更賺錢一些!
"product": "產(chǎn)品名稱",
"group": "設(shè)備分組",
"firmware":
[
{
"ota_type": "esp32",
"url": "http://xxx/esp32-v1.1.0.bin",
"md5": "xxx"
}
]
}
不知道您是否注意到:在firmware字段中,使用的是數(shù)組([...]),而不是對象({...})?
對了,一個終端在通過網(wǎng)絡(luò)連接到云平臺時,都有一個唯一的 ID編號,一般都是利用ESP32模組上的網(wǎng)卡MAC地址來作為唯一ID。
也就是說:一個Job ID就對應(yīng)著一次OTA升級任務(wù)。終端設(shè)備在進行OTA升級過程中,就是從這個Job ID開始的。
ESP32 OTA 升級的觸發(fā)
ESP32與AWS平臺之間,是通過MQTT協(xié)議進行通信的。
"timestamp": "xxxxxx",
"job_id": "001"
}
當終端設(shè)備接收到這個升級通知指令時,提取出job_id字段,然后向云平臺發(fā)起請求:獲取與這個job_id關(guān)聯(lián)的固件描述信息,也就是之前上傳的Json格式的文件息。
以上的過程描述,基本上是一個終端設(shè)備觸發(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,
主要包括下面3部分內(nèi)容:
PS: 在下面的內(nèi)容中,終端設(shè)備指的就是 ESP32 模組。
- AWS 平臺上,部署一個 OTA 升級任務(wù)時,需要完成哪些步驟;
- ESP32 模組中,關(guān)于 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 升級任務(wù)
AWS平臺按照不同的業(yè)務(wù)類型,劃分為不同的服務(wù)。這樣處理起來,流程更規(guī)范,操作步驟也更多,當然也更賺錢一些!
json格式的固件描述文檔,格式大概如下(可以根據(jù)實際的業(yè)務(wù)需求進行修改):
- 把固件(bin 文件)和一個固件描述文件(json格式的文本文件),上傳到 S3 云存儲服務(wù)器上;
- 在 AWS Core 任務(wù)管理中,新建一個升級任務(wù)(會得到一個 Job ID)。在這個任務(wù)中需要選擇:
(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ù)組([...]),而不是對象({...})?
對了,一個終端在通過網(wǎng)絡(luò)連接到云平臺時,都有一個唯一的 ID編號,一般都是利用ESP32模組上的網(wǎng)卡MAC地址來作為唯一ID。
也就是說:一個Job ID就對應(yīng)著一次OTA升級任務(wù)。終端設(shè)備在進行OTA升級過程中,就是從這個Job ID開始的。
ESP32 OTA 升級的觸發(fā)
ESP32與AWS平臺之間,是通過MQTT協(xié)議進行通信的。
"timestamp": "xxxxxx",
"job_id": "001"
}
當終端設(shè)備接收到這個升級通知指令時,提取出job_id字段,然后向云平臺發(fā)起請求:獲取與這個job_id關(guān)聯(lián)的固件描述信息,也就是之前上傳的Json格式的文件息。
以上的過程描述,基本上是一個終端設(shè)備觸發(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,





