更新时间:2024-06-24 08:13:31下载pdf
OTA(Over-the-air)即空中下载技术,通过网络远程为设备更新和升级软件程序。
蓝牙 LE 标准协议接入支持 MCU OTA 功能。通过 涂鸦 IoT 开发平台,首先将需要更新的固件文件上传至涂鸦服务器。接着,蓝牙模组通过涂鸦协议对文件进行分包传输,最终 MCU 接收升级包并写入本地闪存,实现固件的升级。详细的平台操作,请参考 固件升级 和 选择和管理固件版本。
MCU OTA 功能需要设备 MCU 资源支持。设备在配网成功后,通过平台配置或升级检测可以启动 OTA 流程。具体的升级流程如下:
OTA 流程涉及以下协议指令:
命令字 | 命令说明 |
---|---|
0xE8 | 蓝牙模组查询 MCU 版本号 |
0xE9 | MCU 主动更新版本号 |
0xEA | MCU OTA 升级请求 |
0xEB | MCU OTA 升级文件信息 |
0xEC | MCU OTA 升级文件偏移请求 |
0xED | MCU OTA 升级数据传输 |
0xEE | MCU OTA 升级结束 |
蓝牙模组会在每次发送命令 获取 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 版本信息,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 发送请求,以便获取 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 ) |
Flag
:0x00
:允许升级,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 升级文件的信息,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 |
0x010002
代表版本为 V1.0.2。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
:文件大小超过范围。0
,表示从头开始传输。下发文件起始传输偏移量,并比较 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 端给出的偏移。
模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
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
:其他模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
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
:其他A:对于蓝牙 LE + X 架构的设备,例如蓝牙 LE + Cat.1,需要注意在升级过程中,当使用 Cat.1 链路进行升级时无法下发有效的文件 CRC32。因此,在 MCU 校验升级文件时,应当使用 MD5 进行校验。升级包的 CRC16 则是有效且可用的。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈