隨著互聯(lián)網(wǎng)的發(fā)展和無(wú)線通訊網(wǎng)絡(luò)的普及,低功耗窄帶通訊為物聯(lián)網(wǎng)帶來(lái)了更多機(jī)會(huì)。憑借著其覆蓋范圍廣、功耗低等特點(diǎn),獲得了廣泛的關(guān)注與重視,不斷加速實(shí)現(xiàn)物與物之間建立智能化、數(shù)據(jù)化的聯(lián)系。借助通訊和云計(jì)算的高速發(fā)展,越來(lái)越多的設(shè)備開始物聯(lián)網(wǎng)化演進(jìn),大規(guī)模部署后的物聯(lián)網(wǎng)設(shè)備面臨著在線升級(jí)(OTA)的需求,從而解決系統(tǒng)更新,產(chǎn)品功能迭代、漏洞修復(fù)、和安全防護(hù)等問題。
這其中的在線升級(jí)功能,需要使用 OTA (Over-the-Air) 技術(shù) 。簡(jiǎn)單地說,OTA 就是通過網(wǎng)絡(luò)來(lái)升級(jí)手中的智能設(shè)備。由于大多數(shù)物聯(lián)網(wǎng)終端受硬件資源、功耗、帶寬等限制,傳統(tǒng)的整包升級(jí)方式已經(jīng)越來(lái)越難以滿足客戶需要,而穩(wěn)定安全的差分升級(jí)在OTA這一技術(shù)領(lǐng)域中顯得尤為重要。尤其是NB-IOT這類窄帶通信技術(shù),大多數(shù)應(yīng)用都是由低功耗小資源的MCU+NB-IOT通訊模塊實(shí)現(xiàn)的,NB-IOT通訊模塊實(shí)現(xiàn)聯(lián)網(wǎng)功能,設(shè)備應(yīng)用運(yùn)行在MCU上,使用差分OTA升級(jí),可以實(shí)現(xiàn)減低功耗、減少硬件資源消耗、提升升級(jí)體驗(yàn)、加速下載過程,提供更好的安全性和可靠性,并且有效防止大量設(shè)備下載時(shí)候?qū)镜仍O(shè)施的沖擊。艾拉比提供的基于MCU+NB-IOT的差分技術(shù)方案已經(jīng)廣泛應(yīng)用在如門鎖、手表、定位器、路燈控制器、共享停車位、煙感和表計(jì)等領(lǐng)域。
下面以移遠(yuǎn)BC28+STM32L053C8為例,來(lái)演示如何利用艾拉比的差分技術(shù)通過NB網(wǎng)絡(luò)升級(jí)STM32的APP固件。我們將從升級(jí)方案的設(shè)計(jì),設(shè)備操作流程兩個(gè)部分來(lái)詳細(xì)講解這個(gè)方案:
01.升級(jí)方案的設(shè)計(jì)
下圖展示了這個(gè)升級(jí)方案的軟件框架:
從上圖可以看到STM32里中需要有三個(gè)部分的修改:
1. STM32L053C8的APP部分,需要集成與OTA服務(wù)器通信的程序,我們稱為Update Controller,簡(jiǎn)稱UC
2. STM32L053C8的bootloader部分,需要集成差分升級(jí)算法程序,我們稱為Update Agent,簡(jiǎn)稱UA
3. STM32L053C8上需要規(guī)劃處一定的存儲(chǔ)空間,用來(lái)存儲(chǔ)下載的差分包。
從設(shè)計(jì)的軟件框架來(lái)看升級(jí)將分為兩個(gè)階段:下載差分包階段和升級(jí)上報(bào)階段。在窄帶網(wǎng)絡(luò)下,我們以LWM2M協(xié)議為基礎(chǔ)來(lái)和OTA服務(wù)器進(jìn)行交互通信,設(shè)備與服務(wù)器端建立的是COAP連接。
我們先來(lái)詳細(xì)分解下載階段的流程:
從上圖中我們可以看到整個(gè)下載差分包的流程分以下幾個(gè)步驟:
1. 初始化模組, STM32向BC28發(fā)送初始化的AT指令。
2. STM32發(fā)送AT指令給BC28,建立網(wǎng)絡(luò)鏈接。BC28返回建立網(wǎng)絡(luò)的結(jié)果給STM32。
3. STM32透過BC28,向OTA服務(wù)器發(fā)起注冊(cè)請(qǐng)求。OTA服務(wù)器透過BC28下發(fā)注冊(cè)結(jié)果,STM32將這些注冊(cè)信息保存下來(lái)。
4. STM32透過BC28,向OTA服務(wù)器發(fā)起檢測(cè)版本的請(qǐng)求。OTA服務(wù)器透過BC28下發(fā)新版本的信息,這其中包含了差分包的下載地址。
5. STM32基于得到的下載地址,透過BC28向OTA服務(wù)器發(fā)送下載差分包請(qǐng)求。OTA服務(wù)器會(huì)根據(jù)請(qǐng)求將差分包分段透過BC28下發(fā)給STM32,STM32在收到后將這些數(shù)據(jù)存儲(chǔ)在差分包存儲(chǔ)區(qū)域。
6. STM32在下載完差分包并經(jīng)過校驗(yàn)后,透過BC28上報(bào)下載升級(jí)包的結(jié)果給到OTA服務(wù)器。OTA服務(wù)器透過BC28下發(fā)上報(bào)結(jié)果。
7. STM32發(fā)送指令給BC28關(guān)閉網(wǎng)絡(luò)連接,BC28返回關(guān)閉網(wǎng)絡(luò)連接結(jié)果
8. STM32進(jìn)行軟重啟,進(jìn)入bootloader
接下來(lái)升級(jí)流程就進(jìn)入了下一個(gè)階段,我們先來(lái)看流程圖:
從上圖中我們可以看到整個(gè)升級(jí)上報(bào)的流程分以下幾個(gè)步驟:
1. STM32在bootloader中運(yùn)行UA程序,完成差分升級(jí),升級(jí)完成后重啟。
2. STM32向BC28發(fā)送初始化的AT指令,BC28向STM32返回初始化結(jié)果。
3. STM32發(fā)送AT指令給BC28,建立網(wǎng)絡(luò)鏈接。BC28返回建立網(wǎng)絡(luò)的結(jié)果給STM32。
4. STM32透過BC28,向OTA服務(wù)器發(fā)起注冊(cè)請(qǐng)求。OTA服務(wù)器透過BC28下發(fā)注冊(cè)結(jié)果,STM32將這些注冊(cè)信息保存下來(lái)。
5. STM32透過BC28,向OTA服務(wù)器上報(bào)升級(jí)結(jié)果。OTA服務(wù)器透過BC28下發(fā)升級(jí)上報(bào)結(jié)果。
6. STM32通知BC28關(guān)閉網(wǎng)絡(luò)連接,至此整個(gè)升級(jí)流程結(jié)束。
通過對(duì)整個(gè)方案以及兩個(gè)階段流程解析,我們可以看到,在窄帶網(wǎng)絡(luò)下的差分升級(jí),對(duì)于這種網(wǎng)絡(luò)特性,對(duì)差分包的大小以及差分包傳輸?shù)姆€(wěn)定性需要有一定的保障,所以在下載差分包的時(shí)候,我們需要進(jìn)行分段下載,并且需要對(duì)每段數(shù)據(jù)進(jìn)行相應(yīng)手段的校驗(yàn)。下面我們從設(shè)備端的操作,來(lái)看一下整個(gè)升級(jí)的流程。
02、設(shè)備操作流程
從下圖我們看到,左邊的開發(fā)板是STM32L05C38,右邊的開發(fā)板是移遠(yuǎn)的BC28,我們將通過串口線將兩個(gè)設(shè)備連接在一起進(jìn)行升級(jí)操作。STM32開發(fā)板上的藍(lán)色按鈕的功能是發(fā)起整個(gè)升級(jí)流程,黑色按鈕的功能是重啟STM32開發(fā)板,下面我們開始操作。
首先我們按下STM32開發(fā)板上的藍(lán)色按鈕,發(fā)起升級(jí)流程,這個(gè)時(shí)候STM32開發(fā)板屏幕上會(huì)有如下顯示:
此時(shí),我們還可以通過連接到PC上的debug工具,可以看到相應(yīng)log,這段動(dòng)畫顯示的是STM32從初始化到檢測(cè)版本整個(gè)過程的log。
在檢測(cè)完成后,STM32自動(dòng)進(jìn)入下載差分包階段,下面兩張圖是STM32進(jìn)入下載差分包流程時(shí)的屏幕進(jìn)度顯示:
這個(gè)階段,我們也可以清晰的從PC的debug工具里看到整個(gè)下載流程:
在下載成功后,我們手動(dòng)按一下STM32開發(fā)板上的黑色按鍵,重啟STM32開發(fā)板,讓設(shè)備進(jìn)入bootloader開始升級(jí),下面兩張圖是STM32開發(fā)板在升級(jí)時(shí)的屏幕顯示:
完成升級(jí)后,STM32開發(fā)板重啟重新進(jìn)入APP,這個(gè)時(shí)候會(huì)自動(dòng)將這次升級(jí)的結(jié)果進(jìn)行上報(bào),下圖是STM32開發(fā)板在進(jìn)行升級(jí)上報(bào)時(shí)候的屏幕顯示:
同樣,我們也可以在PC上的debug工具里看到整個(gè)上報(bào)流程:
從STM32開發(fā)板的屏幕上看到完成這個(gè)流程后,STM32開發(fā)版本的固件從1.0成功的升級(jí)到了1.1,至此整個(gè)升級(jí)完成。