NB-IOT開發|nbiot開發教程《五》nbiot(移遠BC26)電信物聯網平臺實現MCU固件在線升級(STM32L051+BC26)

嵌入式開發中我們要時刻保持代碼的高效與整潔
 
看之前,先點贊
好習慣,要養成

一、前言

    嵌入式開發中我們要時刻保持代碼的高效與整潔。爲什麼要有在線升級和爲什麼要進行在線升級,在這不多說,產品的開發中,在線升級是非常重要的。我們先看下實際效果。

                                    

二、SOTA升級

    中國電信物聯網使能平臺(以下簡稱“平臺”)提供了基於LWM2M的固件升級功能,用於模組的固件升級。但是由於多數模組並未提供升級接口給MCU,所以MCU升級只能基於應用層來實現升級,爲了避免和模組的升級混淆,我們把MCU的升級稱爲軟件升級。支持LWM2M協議的設備升級。

具體軟件包製作參考:https://help.ctwing.cn/kong-zhi-tai-shou-ce/she-bei-guan-li/sotasheng-ji.html

具體升級協議參考:https://support.huaweicloud.com/usermanual-IoT/iot_01_0047_3.html

    設備的OTA軟件升級是基於華爲定義的PCP協議進行的,設備側需根據PCP協議定義的交互流程進行適配開發。下面我們將結合物聯網平臺與設備的軟件升級交互流程,介紹終端設備將如何基於PCP協議構建交互過程中的請求消息和應答消息,幫助您更好的根據PCP協議進行終端側的軟件升級功能開發。

下面我們先了解下PCP消息的結構,PCP協議的請求消息和應答消息都遵循相同的消息結構,主要由這幾部分組成:     

PCP協議消息由:起始標識位、版本號、消息碼、校驗碼、數據區長度和數據區組成,各字段的要求和描述如下表所示。

字段名

字段類型

描述和要求

起始標識

WORD

起始標識,固定爲0XFFFE。

版本號

BYTE

高四位預留;低四位表示協議版本號,當前爲1。

消息碼

BYTE

標識物聯網平臺與設備之間的請求消息類型,應答消息的消息碼和請求消息相同。消息碼的定義爲:

  • 0-18:預留消息碼,暫未使用。
  • 19:查詢設備版本。
  • 20:下載新版本軟件包通知。
  • 21:請求下載升級包。
  • 22:上報升級包下載結果。
  • 23:執行軟件升級。
  • 24:上報升級結果。
  • 25-127:預留消息碼,暫未使用。

校驗碼

WORD

從起始標識到數據區的最後一個字節的CRC16校驗值,計算前先把校驗碼字段置爲0,計算完成後把結果寫到校驗碼字段。

數據區長度

WORD

數據區的長度。

數據區

BYTE[n]

可變長度,具體由各個指令定義,可參考下面介紹的各個指令對應的請求消息和應答消息定義。

(1)查詢設備版本消息

請求消息:

方向:平臺->設備

字段

數據類型

描述及要求

無數據區

響應消息:

方向:設備->平臺

字段

數據類型

描述及要求

結果碼

BYTE

“0X00”處理成功

當前版本號

BYTE[16]

當前版本號,由ASCII字符組成,位數不足時,後補“0X00”。

說明: 

  • 正常處理:平臺根據版本號判斷設備是否需要升級,如果需要,下發請求升級。
  • 異常處理:如果響應超時,平臺中止升級任務。

(2)新版本通知消息

請求消息:

方向:平臺->設備

字段

數據類型

描述及要求

目的版本號

BYTE[16]

目的版本號,由ASCII字符組成,位數不足時,後補“0X00”。

升級包分片大小

WORD

每個分片的大小

升級包分片總數

WORD

升級包分片總數

升級包校驗碼

WORD

升級包校驗碼。用戶上傳升級包時,需要在升級包描述文件裏填寫校驗碼

應答消息:

方向:設備->平臺

字段

數據類型

描述及要求

結果碼

BYTE

“0X00”允許升級

“0X01”設備使用中

“0X02”信號質量差

“0X03”已經是最新版本

“0X04”電量不足

“0X05”剩餘空間不足

“0X09”內存不足

“0X7F”內部異常

說明: 

  • 正常處理:如果設備不允許升級,平臺中止升級任務。
  • 異常處理:如果響應超時,而且沒收到請求升級包消息,平臺中止升級任務。

(3)請求消息包消息

請求消息:

方向:設備->平臺

字段

數據類型

描述及要求

目的版本號

BYTE[16]

目的版本號,由ASCII字符組成,位數不足時,後補“0X00”。

分片序號

WORD

表示請求獲取的分片序號,從0開始計算,分片的總數爲軟件包大小除以每個分片的大小並向上取整獲得。設備可以保存已經收到的分片,下次直接從缺失的分片開始請求,達到斷點續傳的效果。

響應消息:

方向:平臺->設備

字段

數據類型

描述及要求

結果碼

BYTE

0X00處理成功。

0X80升級任務不存在。

0X81指定的分片不存在。

分片序號

WORD

表示返回的分片序號。

分片數據

BYTE[n]

分片的內容,n爲實際的分片大小。如果結果碼不爲0,則不帶此字段。

(4)上報升級包下載狀態消息

請求消息:

方向:設備->平臺

字段

數據類型

描述及要求

下載狀態

BYTE

0X00下載成功。

0X05剩餘空間不足。

0X06下載超時。

0X07升級包校驗失敗。

0X08升級包類型不支持。

響應消息:

方向:平臺->設備

字段

數據類型

描述及要求

結果碼

BYTE

0X00處理成功。

0X80升級任務不存在。

(5)執行升級消息

請求消息:

方向:平臺->設備

字段

數據類型

描述及要求

無數據區

響應消息:

方向:設備->平臺

字段

數據類型

描述及要求

結果碼

BYTE

0X00處理成功。

0X01設備使用中。

0X04電量不足。

0X05剩餘空間不足。

0X09內存不足。

(6)上報升級結果消息

請求消息:

方向:設備->平臺

字段

數據類型

描述及要求

結果碼

BYTE

0X00升級成功。

0X01設備使用中。

0X04電量不足。

0X05剩餘空間不足。

0X09內存不足。

0X0A安裝升級包失敗。

0X7F內部異常。

當前版本號

BYTE[16]

設備當前版本號。

響應消息:

方向:平臺->設備

字段

數據類型

描述及要求

結果碼

BYTE

0X00處理成功。

0X80升級任務不存在。

三、MCU功能實現(STM32L051)

(1)MCU的FLASH劃分

                                                          

(2)MCU執行流程

                                                            

通過流程可以看到,即使在升級過程中出現異常或者斷網都不會影響設備的正常運行。

四、代碼實現

   代碼的實現都是基於前面介紹的AT指令狀態機和cola_os,請自行閱讀前面的文章。

  NB-IOT開發|nbiot開發教程《三》AT指令類模組驅動-STM32實現AT指令狀態機

  嵌入式開發--300行代碼實現操作系統cola_os

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章