嵌入式开发中我们要时刻保持代码的高效与整洁
看之前,先点赞
好习惯,要养成
一、前言
嵌入式开发中我们要时刻保持代码的高效与整洁。为什么要有在线升级和为什么要进行在线升级,在这不多说,产品的开发中,在线升级是非常重要的。我们先看下实际效果。
二、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