NB-IOT远程升级第2弹:软件协议讲解及AT指令测试

在物联网项目的开发过程中,必不可少的一项功能就是远程升级OTA(Over-the-Air),即使用WIFI、蓝牙、4G、NB-IOT等方式将升级包传输到MCU,MCU进行代码存储,完成升级

本系列文章将介绍基于电信AEP平台进行NB-IOT设备的远程升级,包含stm32内部flash分区、BootLoader代码编写,平台软件升级包制作,平台软件升级协议对接及参考源码等内容,后续几篇文章将陆续介绍

该系列文章目录大纲如下:

在上一篇文章:NBIOT远程升级第1弹:BootLoader编写及软件包制作 中,介绍了BootLoader编写的几个要点及电信AEP平台软件包的制作

这一节介绍电信AEP平台远程升级使用的PCP协议,以及使用串口助手模拟远程升级流程,为后面敲代码做准备。

下一节将通过分析一个开源的FOTA代码,进一步加深对PCP协议及平台远程升级流程的理解,方面大家自己做移植

1、 PCP协议介绍

官网介绍:https://help.ctwing.cn/kong-zhi-tai-shou-ce/she-bei-guan-li/sotasheng-ji/ruan-jian-sheng-ji-xie-yi.html

电信AEP平台规定:设备和中国电信物联网开放平台(以下简称“平台”)之间的应用层升级协议(简称PCP协议),用于实现设备的升级。

  • 通讯方式:

    • PCP协议运行在应用层,底层可以是LWM2M/COAP/MQTT或者其他非流式协议。
    • PCP协议消息没有使用单独的端口号,并且不依赖于底层协议,为了和设备业务消息区分,PCP协议固定以0XFFFE作为起始字节。因此要求设备的业务消息的前两个字节不能是0XFFFE。
    • 本协议消息采用一问一答模式,所有请求消息都有一个响应消息
  • 组成部分:PCP协议消息由起始标识位、版本号、消息码、校验码、数据区长度和数据区组成

  • 消息结构

  • 字段类型

  • 消息码

  • 结果码定义

  • PCP消息识别

由于PCP协议消息和设备业务消息共用一个端口和URL通讯,平台收到设备的消息时,按照如下步骤判断是PCP协议消息还是业务消息:

  • 检查设备是否支持软件升级(根据设备profile的omCapability.upgradeCapability定义),如果不支持,则认为是业务消息。
  • 检查设备软件升级协议是否是PCP,如果不是,则认为是业务消息。
  • 检查消息前两个字节是否为0XFFFE,如果不是,则认为是业务消息。
  • 检查版本号是否合法,如果不合法,则认为是业务消息。
  • 检查消息码是否合法,如果不合法,则认为是业务消息。
  • 检查校验码是否正确,如果不正确,则认为是业务消息。
  • 检查数据区长度是否正确,如果不正确,则认为是业务消息。

如果以上检查都通过,认为是PCP协议消息。

说明:需要设备保证业务消息的起始字节不是0XFFFE。

远程升级注意要点:

  • 升级包下载之后,设备升级前,为保证设备不会因为运行不合法的升级包而导致设备成砖,需要对升级包内容进行合法性校验。
  • 务必使用平台为升级包生成的摘要校验升级包完整性。
  • 目前仅支持LWM2M协议的设备升级。
  • 电信AEP平台仅支持.zip类型的文件作为升级包。
  • 平台规定同一产品下最多创建100个升级包。

2、升级流程

根据平台官网介绍,PCP远程升级协议流程可分为以下几个步骤:查询设备版本、新版本通知、请求升级包、上报升级包下载状态、执行升级、上报升级结果,每一个步骤设备和平台之间均是一问一答的形式。

2.1 上传升级包

  • 第一步:登录物联网平台的控制台>产品>远程升级管理,选择SOTA升级>升级包管理>创建升级包,将升级包信息上传至云端。

  • 升级包版本名称自定义即可

  • 升级包版本包需与上一节制作的软件包配置文件UpgradeDesc.json文件中的version字段内容一致

  • 升级包即上一节制作好的升级包

  • 第二步:选择SOTA升级>创建任务,开始创建升级任务

  • 第三步:选择SOTA升级>升级设备管理,开始加入待升级设备

  • 第四步:确认已选择设备。

  • 第五步:选择SOTA升级>开始启动,开始启动升级任务。

  • 第六步:选择FOTA升级>查看设备升级详情,可以查看设备升级的状态和结果。

任务状态说明:

  • 未执行:任务未启动

  • 执行中:正在升级,存在未完成的任务

  • 已完毕:全部升级任务都达到终止状态,升级完成或升级失败

2.2 查询设备版本

平台启动远程升级任务之后,设备上报任意数据后触发远程升级,物联网平台向设备下发查询版本号信息,设备进行应答

串口助手AT指令内容:

注意:此处如果平台没有下发新版本通知的话,大概率是校验码不正确

物联网平台发送消息:

物联网平台向设备发送查询设备版本号命令:FFFE01134C9A0000

各消息字段解析如下:

  • 起始标识:固定为FFFE。
  • 版本号:数据类型为1个字节整数,且固定为1,即在消息流中为01。
  • 消息码:13,转换为10进制为19。
  • 校验码:4C9A
  • 数据区长度:0000
  • 数据区:无需数据区字段。

设备返回的应答消息:

设备收到物联网平台要查询设备的软件版本号消息,设备要向物联网平台反馈查询的结果

各消息字段的填写如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:与请求的消息码一致,为13。
  • 校验码:CRC16计算前先用0000替代。
  • 数据区长度:根据数据区的字段的数据类型得出数据区长度为17个字节,转换为十六进制为:0011。
  • 数据区:根据数据区的定义可知,处理成功的结果码为00,版本号信息假设为V1.0,将V1.0进行ASCII转码得到56312E30,由于版本号的数据类型为BYTE[16],即16个字节,当前只有4个字节,因此需要在版本号数据后面补0,得到56312E300000000000000000000000000。因此,数据区合并后为0056312E30000000000000000000000000。

将查询版本信息的消息流组合起来得到:FFFE 01 13 0000 0011 0056312E30000000000000000000000000需要将消息流进行CRC16算法计算得到校验码为7AB3。

因此,物联网平台向设备查询版本号信息,设备向平台返回的消息流为FFFE01137AB300110056312E30000000000000000000000000。

平台状态显示:

2.3 新版本通知

查询完版本号,接收到设备上报的版本号消息后,平台主动对设备端发起新版本通知。

串口助手AT指令内容:

物联网平台发送消息:

物联网平台向设备下发下载新版本软件包通知:FFFE01141019001656312E300000000000000000000000000100013D6534

各消息字段的解析如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:14,转换为十进制为20
  • 校验码:1019。
  • 数据区长度:0016
  • 数据区:根据数据区的定义可知。
    • 目标版本号:由16个字节组成,此处56312E30000000000000000000000000转换为字符即是V1.0,代表平台的升级包版本号为V1.0。
    • 升级包分片大小:由2个字节组成,单位为byte,用户上传软件包时可以手动输入升级包分片大小,如果不设置默认为500byte,大小为32~500之间。此处为0100,转换为十进制为256,即一个分片包大小为256个字节。
    • 升级包分片总数:由2个字节组成,由软件包大小除以每个分片的大小并向上取整获得。此处解析软件包分片总数为013D,转换为十进制后为317。
    • 文件检验码:由2个字节组成,为软件包配置文件中的versioncheckcode 字段值,6534,转换为字符后为e4。

数据解析的结果(目标版本号、分片包大小、校验码)与配置文件中的字段一致

设备返回的应答消息

设备收到下载新版本软件包通知后,设备向物联网平台返回应答消息,是否允许设备进行升级。

各消息字段的填写如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:与请求的消息码一致,为14。
  • 校验码:CRC16计算前先用0000替代。
  • 数据区长度:根据数据区的字段的数据类型得出数据区长度为1个字节,转换为十六进制为:0001。
  • 数据区:设备根据自身的情况对平台下发的新版本通知进行响应,本示例以设备应答“允许升级”为例进行介绍,得出数据区为:00。其它应答消息请根据应答消息字段进行适配。

注意:此处设备应做判断,设备电量、信号质量是否正常,是否应该允许设备进行升级。

将设备给物联网平台的应答消息流组合起来得到:FFFE 01 14 0000 0001 00。

再将消息流进行CRC16算法计算得到校验码为D768。因此,设备向平台返回的应答消息流为FFFE0114D768000100

平台接收到设备的回复后处理:

  • 正常处理:如果设备不允许升级,平台中止升级任务

  • 异常处理:如果响应超时,而且没收到请求升级包消息,平台中止升级任务

平台状态显示:

2.4 请求升级包

物联网平台通知设备有新的软件版本时,设备向物联网平台请求下载软件包,按照分片的序号进行下载分片包

串口助手AT指令内容:

设备发送的请求消息:

设备向物联网平台发送的请求软件包分片的第一条消息

各消息字段的填写如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:查询消息码表可知请求升级包的消息码为21,转换为十六进制为:15。
  • 校验码:CRC16计算前先用0000替代。
  • 数据区长度:根据数据区的字段的数据类型得出数据区长度为18个字节,转换为十六进制为:0012。
  • 数据区:目标版本号为平台下发的新版本通知版本号,即v1.0,转换为十六进制为56312E30000000000000000000000000,分片序号为第0个分片,即0000。

设备向物联网平台发送请求软件包分片的第一条消息为:FFFE 01 15 0000 0012 56312E30000000000000000000000000 0000(CRC16校验前)

经CRC16计算得到校验码为:5618。则替换校验码后设备发送的第一条请求分片消息为:FFFE01155618001256312E300000000000000000000000000000。

其它分片请求的消息流只需要替换分片序号后,重新计算并替换CRC16校验码即可,此处就不再展开。

物联网平台的应答消息:

物联网平台收到设备的请求软件包分片消息后,将会给设备下发分片的数据。物联网平台向设备响应的第一条请求分片的消息:FFFE0115xxxx0103000000byte[256]

各消息字段的解析如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:与请求的消息码一致:15。
  • 校验码:xxxx。
  • 数据区长度:0103,即259字节
  • 结果码:00,
  • 分片序号:0000,第0个分片,
  • 分片数据:byte[256]的数据。

平台状态显示:

此处应请求下载所有的分片包,共317个分片包,后面的具体指令过程略过,和请求第一片分片包指令类似,但注意校验码必须正确,否则平台不会下发分片包内容

2.5 上报升级包下载状态

当设备接收完所有分片数据并组装完软件包后,需要向物联网平台上报软件包的下载结果,让平台知道升级包是否已经都下载完成。

串口助手AT指令内容:

设备发送的请求消息:

设备向物联网平台发送的上报软件包下载结果消息

各个消息字段的填写如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:与请求的消息码一致,为16。
  • 校验码:CRC16计算前先用0000替代。
  • 数据区长度:根据数据区的字段的数据类型得出数据区长度为1个字节,转换为十六进制为:0001。
  • 数据区:上报软件包的下载结果,比如下载成功,设备侧上报00。

设备向物联网平台发送升级包下载结果的消息为:FFFE 01 16 0000 0001 00(CRC16校验前)

经CRC16计算得到校验码为:850E。则替换校验码后设备发送的升级包下载结果的消息为:FFFE0116850E000100。

物联网平台的应答消息:

物联网平台收到设备上报的软件包下载结果后,将会向设备返回应答消息:FFFE0116850E000100。

各个消息字段的解析如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:与请求的消息码一致:16。
  • 校验码:850E。
  • 数据区长度:0001。
  • 数据区:00,表示处理成功,若处理失败则返回80

平台状态显示:

2.6 执行升级

设备上报完升级包下载状态后,平台通知设备执行升级。

串口助手AT指令内容:

物联网平台发送的请求消息:

物联网平台向设备发送执行软件升级消息:FFFE0117CF900000

各个消息字段的解析如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:17,与请求的消息码一致。
  • 校验码:CF90。
  • 数据区长度:0000,即为0字节,无数据区
  • 数据区:无数据区

设备发送的应答消息

设备收到物联网平台下发的执行升级消息后,将对收到消息后的执行动作进行应答

各消息字段的填写如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:与请求的消息码一致:17。
  • 校验码:CRC16计算前先用0000替代。
  • 数据区长度:根据数据区的字段定义得出该数据长度为1个字节,转换为十六进制为:0001。
  • 数据区:处理成功,则返回00,其它处理结果请参考数据区定义。

设备向物联网平台应答的消息为:FFFE 01 17 0000 0001 00 (CRC16校验前)

经CRC16计算得到校验码为:B725。则替换校验码后设备返回的响应消息为:FFFE0117B725000100 。

平台状态显示:

2.7 上报升级结果

设备在执行完软件升级后,将会向物联网平台上报升级的结果
,平台上更新设备当前所使用的软件版本。

串口助手AT指令内容:

设备发送的请求消息:

设备向物联网平台上报升级结果,各个消息字段的填写如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:与请求的消息码一致,为18。
  • 校验码:CRC16计算前先用0000替代。
  • 数据区长度:根据数据区的字段的数据类型得出数据区长度为17字节,转换为十六进制为:0011。
  • 数据区:结果码,以上报升级成功为例,结果码为00。
  • 当前版本号:升级完成后的版本号,与物联网平台下发的软件版本一致,即V1.0,转换为十六进制为:56312E30000000000000000000000000。

设备向物联网平台上报升级结果的消息为:FFFE 01 18 0000 0011 0056312E30000000000000000000000000(CRC16校验前)

经CRC16计算得到校验码为:C7D2。则替换校验码后设备向物联网平台上报升级结果码流为:FFFE0118C7D200110056312E30000000000000000000000000。

物联网平台发送的应答消息:

物联网平台收到设备上报的升级结果消息后,将对设备进行应答:FFFE0118AFA1000100

各个消息字段的解析如下:

  • 起始标识固定为:FFFE。
  • 版本号固定为:01。
  • 消息码:18,与请求的消息码一致。
  • 校验码:AFA1。
  • 数据区长度:根据数据区的字段定义得出该数据长度为1个字节,转换为十六进制为:0001。
  • 数据区:处理成功,则返回00,升级任务不存在80。本示例以返回00处理成功为例进行说明。

平台状态显示:

至此,使用串口助手模拟设备进行远程升级的流程就完成了,写代码的时候根据这个流程进行发送数据,命令解析就可以了,此外平台也提供断点续传的方案,如下图所示:

下一节通过分析一份开源的FOTA代码,进一步加深对PCP协议及平台远程升级流程的理解,方面大家自己做移植

如有需要,公众号后台回复 PCP 获取PCP协议代码

我是南风,一个爱折腾的程序袁,工作之余,写写公众号,玩玩视频号,分享我的工作、我的生活

分享是一种博爱的心境,学会分享,就学会了生活

我的视频号:

我的公众号:

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值