嵌入式开发中我们要时刻保持代码的高效与整洁
看之前,先点赞
好习惯,要养成
一、前言
嵌入式开发中我们要时刻保持代码的高效与整洁。为什么要有在线升级和为什么要进行在线升级,在这不多说,产品的开发中,在线升级是非常重要的。我们先看下实际效果。
二、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 | 标识物联网平台与设备之间的请求消息类型,应答消息的消息码和请求消息相同。消息码的定义为:
|
校验码 | 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指令状态机