在之前文章中(STM32L425RE的差分升級(jí)能力構(gòu)建、【艾拉比】基于移遠(yuǎn)BC28的STM32+NB-IOT的OTA案例分享),我們演示了如何利用艾拉比的差分技術(shù)通過NB網(wǎng)絡(luò)升級(jí)STM32的APP固件。本篇案例我們將換個(gè)方向,詳細(xì)介紹如何通過WIFI模組將STM32F469的下載差分包,并且利用艾拉比的差分技術(shù)進(jìn)行升級(jí)。
升級(jí)方案的設(shè)計(jì)
考慮到ESP8266模組內(nèi)部的空間資源都十分的充足,所以我們?yōu)檫@個(gè)案例的升級(jí)設(shè)計(jì)了兩套升級(jí)方案,下面我們分別展開來描述這兩種方案。
(1) WIFI模組透?jìng)鞑罘职?jí)MCU
如下面框架圖所示,與NB網(wǎng)絡(luò)下升級(jí)MCU的方式一致,需要在MCU里內(nèi)置艾拉比的UA和UC的程序,同樣MCU上也要規(guī)劃一塊區(qū)域來存放差分包。
基于上面的軟件框架,我們將基于HTTP協(xié)議來和OTA服務(wù)器進(jìn)行交互通信,以下是整個(gè)升級(jí)的流程圖:
從上圖中我們可以看到整個(gè)升級(jí)的流程分以下幾個(gè)步驟:
1. STM32透過ESP8266,向OTA服務(wù)器發(fā)起注冊(cè)請(qǐng)求。OTA服務(wù)器透過ESP8266下發(fā)注冊(cè)結(jié)果,STM32將這些注冊(cè)信息保存下來
2. STM32透過ESP8266,向OTA服務(wù)器發(fā)起檢測(cè)版本的請(qǐng)求。OTA服務(wù)器透過ESP8266下發(fā)新版本的信息,這其中包含了差分包的下載地址
3. STM32基于得到的下載地址,透過ESP8266向OTA服務(wù)器發(fā)送下載差分包請(qǐng)求。OTA服務(wù)器會(huì)根據(jù)請(qǐng)求將差分包透過ESP8266下發(fā)給STM32,STM32在收到后將這些數(shù)據(jù)存儲(chǔ)在差分包存儲(chǔ)區(qū)域
4. STM32在下載完差分包并經(jīng)過校驗(yàn)后,透過ESP8266上報(bào)下載升級(jí)包的結(jié)果給到OTA服務(wù)器。OTA服務(wù)器透過ESP8266下發(fā)上報(bào)結(jié)果
5. STM32在接收到云端返回的上報(bào)結(jié)果后,進(jìn)行軟重啟,啟動(dòng)UA程序
6. STM32運(yùn)行UA程序,進(jìn)行差分升級(jí),升級(jí)完成后存儲(chǔ)本次升級(jí)的結(jié)果并進(jìn)入系統(tǒng)
7. STM32透過ESP8266上報(bào)本次升級(jí)的結(jié)果給到OTA服務(wù)器。OTA服務(wù)器透過ESP8266下發(fā)上報(bào)結(jié)果
8. STM32在接收到云端返回的上報(bào)結(jié)果后,斷開網(wǎng)絡(luò),至此整個(gè)升級(jí)流程結(jié)束
(2) WIFI內(nèi)部完成MCU升級(jí)回刷MCU方案
如下面框架圖所示, 這個(gè)方案需要在ESP8266內(nèi)置入U(xiǎn)C和UA程序,并且在ESP8266內(nèi)劃分兩個(gè)區(qū)域,一個(gè)區(qū)域用于存儲(chǔ)下載的差分包,另外一個(gè)用于臨時(shí)存儲(chǔ)MCU的部分固件。
基于上面的軟件框架,我們將基于HTTP協(xié)議來和OTA服務(wù)器進(jìn)行交互通信,以下是整個(gè)升級(jí)的流程圖:
從上圖中我們可以看到整個(gè)升級(jí)的流程分以下幾個(gè)步驟:
1. STM32向ESP8266發(fā)起升級(jí)請(qǐng)求
2. ESP8266通過獲取的STM32的信息,向OTA服務(wù)器發(fā)送注冊(cè)請(qǐng)求
3. OTA服務(wù)器返回注冊(cè)信息給到ESP8266,ESP8266將MCU的注冊(cè)信息存儲(chǔ)下來
4. ESP8266向OTA服務(wù)器發(fā)起STM32的檢測(cè)請(qǐng)求, OTA服務(wù)器返回STM32
新版本的信息
5. ESP8266根據(jù)獲取的新版本信息,向OTA服務(wù)器發(fā)起下載差分包的請(qǐng)求,OTA服務(wù)器收到請(qǐng)求后下發(fā)差分包。
6. ESP8266收到差分包,并校驗(yàn)通過后,向OTA服務(wù)器發(fā)送下載情況上報(bào)請(qǐng)求,OTA服務(wù)器收到后返回上報(bào)結(jié)果。
7. ESP8266中的UC程序通知UA程序開始進(jìn)行STM32的差分升級(jí)
8. ESP8266中的UA程序完成MCU的固件升級(jí)后,向STM32請(qǐng)求回刷固件,在STM32允許刷寫后,進(jìn)行固件回刷
9. ESP8266中UA程序在STM32升級(jí)完成后,存儲(chǔ)升級(jí)的結(jié)果,并通UC程序進(jìn)行升級(jí)結(jié)果上報(bào),UC在收到通知后,向OTA服務(wù)器上報(bào)STM32升級(jí)的結(jié)果,OTA服務(wù)器收到后返回上報(bào)的結(jié)果給到ESP8266
10. ESP8266收到OTA服務(wù)器下發(fā)的上報(bào)結(jié)果后,斷開網(wǎng)絡(luò),至此整個(gè)升級(jí)流程結(jié)束。
從上面兩個(gè)升級(jí)方案中,MCU的升級(jí)都采用的是差分升級(jí),這相較于傳統(tǒng)WIFI下的MCU升級(jí)優(yōu)勢(shì)在于:
(1)升級(jí)包下載的時(shí)間大大減小,同時(shí)也降低了升級(jí)的功耗。
(2) 升級(jí)的時(shí)間也會(huì)比整包升級(jí)的時(shí)間也大為減小,整體提升了升級(jí)的效率。下面我們?cè)賮砜匆幌?,整個(gè)設(shè)備升級(jí)的實(shí)際過程。
從下面兩張圖上我們看到,一張圖是STM32F469的Discovery開發(fā)板子,一張圖是ESP8266的串口模塊,我們將通過串口線將兩個(gè)設(shè)備連接在一起,對(duì)STM32開發(fā)板進(jìn)行差分升級(jí)。
這個(gè)STM32的開發(fā)板是支持觸屏操作的,所以首先我們點(diǎn)擊屏幕上的“Check for Update“發(fā)起升級(jí)流程。
點(diǎn)擊屏幕后,OTA服務(wù)器很快返回了新版本的信息,屏幕這時(shí)候也顯示了新版本的差分包大小。
檢測(cè)到新版本后,設(shè)備會(huì)自動(dòng)去請(qǐng)求下載差分包,從下面兩張圖中我們可以從屏幕上看到下載的進(jìn)度顯示。
從上圖來看,差分包已經(jīng)下載完成,設(shè)備會(huì)立即向OTA服務(wù)器上報(bào)這個(gè)下載的結(jié)果。我們也可以從PC上的Debuger工具中看到這個(gè)過程的log
差分包下載完成后,設(shè)備會(huì)進(jìn)行重啟,進(jìn)入了bootloader,在這個(gè)階段,集成在設(shè)備bootloader里的UA程序會(huì)進(jìn)行差分升級(jí)的工作,我們從下面兩張圖來看一下這個(gè)過程
從上圖可以看到,屏幕上顯示升級(jí)進(jìn)度已經(jīng)完成,升級(jí)已經(jīng)完成,我們也可以在PC端的Debuger工具中看到這個(gè)過程
接下來,設(shè)備會(huì)進(jìn)入APP,我們?yōu)榱藚^(qū)別版本特意將這個(gè)版本的屏幕顏色做了改動(dòng),大家可以從下面兩張圖上看到
我們從屏幕上可以看到,這個(gè)時(shí)候軟件的版本好已經(jīng)升級(jí)為2.0,設(shè)備自動(dòng)開始
升級(jí)結(jié)果的上報(bào)并且已經(jīng)上報(bào)成功,從PC端的Debuger軟件中我們也能看到這個(gè)過程
升級(jí)結(jié)果的上報(bào)并且經(jīng)上報(bào)成功,從PC端的Debuger軟件中我們也能看到這個(gè)過程
至此,STM32F469的這個(gè)開發(fā)板已經(jīng)差分升級(jí)成功,升級(jí)流程結(jié)束。從這幾個(gè)階段的log來看,這次的差分包大小是1875個(gè)字節(jié),整個(gè)固件的大小是87KB,下載的差分包的時(shí)間是3秒,升級(jí)的時(shí)間是11秒,不過這個(gè)時(shí)長(zhǎng)也受限于log的串口打印以及模組的AT交互的消耗,如果在商用批量產(chǎn)品使用中不考慮這些限制,整個(gè)升級(jí)需要的時(shí)長(zhǎng)、消耗的功耗都將進(jìn)一步大幅降低。