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

 

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