MCU OTA 服务

更新时间:2024-06-24 08:13:31下载pdf

OTA(Over-the-air)即空中下载技术,通过网络远程为设备更新和升级软件程序。

蓝牙 LE 标准协议接入支持 MCU OTA 功能。通过 涂鸦 IoT 开发平台,首先将需要更新的固件文件上传至涂鸦服务器。接着,蓝牙模组通过涂鸦协议对文件进行分包传输,最终 MCU 接收升级包并写入本地闪存,实现固件的升级。详细的平台操作,请参考 固件升级选择和管理固件版本

升级流程

MCU OTA 功能需要设备 MCU 资源支持。设备在配网成功后,通过平台配置或升级检测可以启动 OTA 流程。具体的升级流程如下:

开始
模块发送 OTA 请求
MCU 是否
允许OTA?
模块发送升级文件信息
结束
MCU 是否
正常升级?
模块发送升级文件偏移量
MCU 返回接收的升级文件偏移量
模块发送升级文件数据
升级数据
传输完成?
模块发送升级完成指令
MCU 返回升级
结果成功?
升级成功
升级失败

指令列表

OTA 流程涉及以下协议指令:

命令字 命令说明
0xE8 蓝牙模组查询 MCU 版本号
0xE9 MCU 主动更新版本号
0xEA MCU OTA 升级请求
0xEB MCU OTA 升级文件信息
0xEC MCU OTA 升级文件偏移请求
0xED MCU OTA 升级数据传输
0xEE MCU OTA 升级结束

查询 MCU 版本号(CMD-0xE8)

蓝牙模组会在每次发送命令 获取 MCU 信息(CMD-0x01) 的同时,发送查询 MCU 版本号的信息。

模组发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xE8
4
5
2 数据长度 0x00
0x00
6 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

示例55 AA 00 E8 00 00 E7

MCU 返回

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xE8
4
5
2 数据长度 0x00
0x06
6~11 6 Data 见下表
12 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

DATA 格式

1~3 4~6
Soft_Ver Hard_ver
  • Soft_Ver:MCU 当前固件版本号,例如 0x01 00 02 代表版本为 V1.0.2。

  • Hard_ver:MCU 当前硬件版本号,PCBA 版本号。

示例55 AA 00 E8 00 06 01 00 00 01 00 00 EF

MCU 主动发送当前版本号(CMD-0xE9)

为了确保模组及时获取到 MCU 版本信息,MCU 在每次启动时(一般在串口初始化后)需要主动发送一次当前版本号到模组。如果没有收到模组的响应,需要再次发送。

MCU 发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xE9
4
5
2 数据长度 0x00
0x06
6~11 6 Data 见下表
12 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

DATA 格式

1~3 4~6
Soft_Ver Hard_ver
  • Soft_Ver:MCU 当前固件版本号,例如 0x01 00 02 代表版本为 V1.0.2。
  • Hard_ver:MCU 当前硬件版本号,PCBA 版本号。

示例55 AA 00 E9 00 06 01 00 00 01 00 00 F0

模组返回

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xE9
4
5
2 数据长度 0x00
0x01
6 1 State 返回的状态值
7 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

State 返回值说明:

  • 0x00:成功
  • 其他:失败

示例55 AA 00 E9 00 01 00 E9

MCU OTA 升级请求(CMD-0xEA)

在升级开始阶段,蓝牙模组向 MCU 发送请求,以便获取 MCU 串口能够传输的最大单包长度。

模组发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEA
4
5
2 数据长度 0x00
0x02
6~7 2 最大单包数据长度 Len1 见说明
8 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

Len1:表示的是最大单包数据长度,即设备允许的单包数据的最大长度,单位为字节。

示例55 AA 00 EA 00 02 00 C8 B3

MCU 返回

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEA
4
5
2 数据长度 0x00
0x06
6~11 6 Data 见下表
12 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

Data 格式

1 2~4 5~6
Flag MCU 当前固件版本号(Version 可接受最大数据长度(Len2
  • Flag0x00:允许升级,0x01:拒绝升级。
  • Version:当前固件版本号,例如 0x01 00 02 代表版本为 V1.0.2。
  • Len1:模组限定最大单包数据长度。
  • Len2:表示 MCU 可接受的最大包长度。如果 Len1 小于 Len2,则以 Len1 为准。反之,则以 Len2 为准。

示例55 AA 00 EA 00 06 00 01 00 00 00 C8 B8

MCU OTA 升级文件信息(CMD-0xEB)

描述 MCU OTA 升级文件的信息,MCU 可以比较升级信息来决定是否进行升级。

模组发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEB
4
5
2 数据长度 0x00
0x23
6~40 35 Data 见下表
41 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

Data 格式

8 字节 3 字节 16 字节 4 字节 4 字节
产品 PID 文件版本 文件 MD5 文件长度 CRC32
  • PID:MCU 的 PID。
  • 文件版本:例如,0x010002 代表版本为 V1.0.2。
  • 文件 MD5:升级固件的 MD5 值。
  • 文件长度:升级固件的总长度,单位字节。
  • CRC32:升级固件的 CRC32。

MCU 返回

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEB
4
5
2 数据长度 0x00
0x19
6~30 25 Data 见下表
31 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

Data 格式

1 字节 4 字节 4 字节 16 字节
State 已储存文件长度 已储存文件 CRC32 已储存文件 MD5(目前不使用)

State

  • 0x00:正常升级。
  • 0x01:产品 PID 不一致。
  • 0x02:文件版本低于或者等于当前版本。
  • 0x03:文件大小超过范围。
  • 其他:保留。
  • 为了支持断点续传,此时 MCU 应返回设备端已存储的文件信息。
    • App 收到信息后,根据设备返回的已存储文件长度,计算新文件对应长度的 CRC32,然后与设备返回的 CRC32 进行比较。
    • 如果两者吻合,那么在下一次文件起始传输请求中,将起始传输偏移量修改为该长度值。否则,文件起始传输偏移量将设置为 0,表示从头开始传输。
  • 每次断点续传都会完全按照 MCU OTA 流程的顺序进行,从 OTA 升级请求开始。因此,如果 MCU 维护有升级状态,需要在收到模组工作状态为非绑定已连接的其他状态时重置升级状态,以便确保可以开始下一个升级流程。

MCU OTA 升级文件偏移请求(CMD-0xEC)

下发文件起始传输偏移量,并比较 MCU 返回的偏移量。如果它们匹配,表示文件传输可以从该偏移量处继续。如果不匹配,将重新开始传输整个文件。

模组发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEC
4
5
2 数据长度 0x00
0x04
6~9 4 Offset 见下表
10 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

Offset:文件起始传输偏移量,四字节。

MCU 返回

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEC
4
5
2 数据长度 0x00
0x04
6~9 4 Offset 见下表
10 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

Offset:MCU 要求的起始传输文件偏移量。

实际文件传输的偏移地址应该以 MCU 端要求的为准,且 MCU 端要求的地址要小于等于 App 端给出的偏移。

MCU OTA 升级数据(CMD-0xED)

模组发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xED
4
5
2 数据长度 Len Len 高 8 位
Len 低 8 位
6~6+Len-1 Len Data 见下表
6+Len 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

Data 格式

2 字节 2 字节 2 字节 n 字节
包号 当前包数据长度 n 当前包数据 CRC16 当前包数据

包号从 0 开始,当前包数据长度不能大于 OTA 升级请求指令指定的最大包长度。

MCU 返回

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xED
4
5
2 数据长度 0x00
0x01
6 1 State 返回的状态值
7 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

State 返回值说明:

  • 0x00:成功
  • 0x01:包号异常
  • 0x02:长度不一致
  • 0x03:CRC 校验失败
  • 0x04:其他

MCU OTA 升级结束(CMD-0xEE)

模组发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEE
4
5
2 数据长度 0x00
0x00
6 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

MCU 返回

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xEE
4
5
2 数据长度 0x00
0x01
6 1 State 返回的状态值
7 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

State 返回值说明:

  • 0x00:成功
  • 0x01:数据总长度错误
  • 0x02:长度不一致
  • 0x03:其他

常见问题

Q:蓝牙 LE + X 架构的设备,MCU OTA 应该注意什么?

A:对于蓝牙 LE + X 架构的设备,例如蓝牙 LE + Cat.1,需要注意在升级过程中,当使用 Cat.1 链路进行升级时无法下发有效的文件 CRC32。因此,在 MCU 校验升级文件时,应当使用 MD5 进行校验。升级包的 CRC16 则是有效且可用的。