更新时间:2025-06-17 03:44:49下载pdf
OTA(Over the air)即空中下载技术,通过网络远程为设备更新软件程序。
蓝牙 Mesh 标准协议(通用对接固件 key:keyen8gu
,版本为 v0.2 以上)接入支持 MCU OTA 功能。
首先将需要升级的固件文件通过 涂鸦开发者平台 上传至涂鸦服务器,配置好升级操作。蓝牙模组收到云端推送后会根据以下协议将文件进行分包传输,最终 MCU 接收升级文件并写入本地闪存,实现固件的升级。详细的平台操作,请参考 固件升级 和 选择固件版本。
命令字 | 命令说明 |
---|---|
0xD8 | 模组主动获取 MCU 当前版本号 |
0xD9 | MCU 主动上报当前版本号 |
0xDA | MCU OTA 升级请求 |
0xDB | MCU OTA 升级文件信息 |
0xDC | MCU OTA 升级文件偏移 |
0xDD | MCU OTA 升级数据传输 |
0xDE | MCU OTA 升级校验 |
0xDF | MCU OTA 升级结束 |
模组发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xD8 |
45 | 2 | 数据长度 | 0x000x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
MCU 返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xD8 |
45 | 2 | 数据长度 | 0x000x08 |
6-13 | 8 | Data | 见下表 |
14 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
1-3 | 4-6 | 7-8 |
---|---|---|
MCU-soft-version | MCU-hard-version | Len |
MCU-soft-version
:MCU 当前固件软件版本号,例如 0x010000
代表版本号为 1.0.0
。MCU-hard-version
:MCU 当前固件硬件版本号(PCBA 版本号),例如 0x010000
代表版本号为 1.0.0
。Len
:此长度为 OTA 升级数据(0xDD
)中数据包最大长度,MCU 根据自身资源情况,通过此接口设定后续升级数据包最大长度。MCU 发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xD9 |
45 | 2 | 数据长度 | 0x000x08 |
6-13 | 8 | Data | 见下表 |
14 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
1-3 | 4-6 | 7-8 |
---|---|---|
MCU-soft-version | MCU-hard-version | Len |
MCU-soft-version
:MCU 当前固件软件版本号,例如 0x010000
代表版本号为 1.0.0
。MCU-hard-version
:MCU 当前固件硬件版本号(PCBA 版本号),例如 0x010000
代表版本号为 1.0.0
。Len
:此长度为 OTA 升级数据(0xDD
)中数据包最大长度,MCU 根据自身资源情况,通过此接口设定后续升级数据包最大长度。模组返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xD9 |
45 | 2 | 数据长度 | 0x000x08 |
6 | 1 | State |
|
7 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
模组发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDA |
45 | 2 | 数据长度 | 0x000x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
MCU 返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDA |
45 | 2 | 数据长度 | 0x000x04 |
6-9 | 4 | Data | 见下表 |
10 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
1 | 4-6 |
---|---|
State | version |
State
:
0x00
:允许升级0x01
:拒绝升级version
:当前固件版本号,例如 0x010002
代表版本号为 1.0.2
。描述 MCU 升级文件的信息,MCU 可以对升级信息进行对比。
模组发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDB |
45 | 2 | 数据长度 | 0x000x23 |
6-40 | 35 | Data | 见下表 |
41 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
8 字节 | 3 字节 | 16 字节 | 4 字节 | 4 字节 |
---|---|---|---|---|
产品 PID | 版本号(目前不适用) | 文件 MD5(目前不适用) | 文件长度 | CRC32 |
产品 PID
:MCU 的 PID。版本号
:将升级的文件版本,例如,0x010001
代表版本号为 1.0.2
(目前不适用)。文件 MD5
:升级固件的 MD5 值(目前不适用)。文件长度
:升级固件的总长度,单位为字节。CRC32
:升级固件的 CRC32。MCU 返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDB |
45 | 2 | 数据长度 | 0x000x19 |
6-30 | 25 | Data | 见下表 |
11 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
8 字节 | 3 字节 | 16 字节 | 4 字节 |
---|---|---|---|
State | 已存储文件长度 | 已存储文件 CRC32 | 已存储文件 MD5(目前不适用) |
State
:
0x00
:正常升级0x01
:产品 PID 不一致0x02
:保留0x03
:文件大小超过范围已存储文件长度
:代表上次升级意外中断,MCU 已经升级的部分文件长度。已存储文件 CRC32
:代表上次升级意外中断,MCU 已经升级的部分文件计算的 CRC32。0
,表示从头开始传输。0
回复。若使用网关升级并在网关升选择的是群升操作,那么不支持断电续传功能,无论 MCU 端回复的已存储的文件信息是上次升级的偏移量还是 0
,都会从偏移量 0
开始传输。
下发文件起始传输偏移量,并比较 MCU 返回的偏移量。如果它们匹配,表示文件传输可以从该偏移量处继续。如果不匹配,将重新开始传输整个文件。
模组发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDC |
45 | 2 | 数据长度 | 0x000x04 |
6-9 | 4 | Offset | 文件起始传输偏移量,四字节 |
10 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Offset
:手机或者网关根据 0xDB
设备回复的已存储长度和 CRC32 匹配的偏移量。
MCU 返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDC |
45 | 2 | 数据长度 | 0x000x04 |
6-9 | 4 | Offset | MCU 要求的起始传输文件偏移量 |
10 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Offset
:设备本地维护的升级偏移量。
0
。模组发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDD |
45 | 2 | 数据长度 Len | 长度高 8 位长度低 8 位 |
6 - 6+Len-1 | Len | Data | 见下表 |
6+Len | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
4 字节 | 2 字节 | 2 字节 | n 字节 |
---|---|---|---|
数据偏移 | 当前包数据长度 n | 当前包数据 CRC16 | 当前包数据 |
0xd8
和 0xd9
指令中设置的 Len)。MCU 返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDD |
45 | 2 | 数据长度 | 0x000x01 |
6 | 1 | State |
|
11 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
模组发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDE |
45 | 2 | 数据长度 | 0x000x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
MCU 返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDE |
45 | 2 | 数据长度 | 0x000x01 |
6 | 1 | State |
|
7 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
模组发送
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDF |
45 | 2 | 数据长度 | 0x000x01 |
6 | 1 | State | 升级的结果通知:
|
7 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
MCU返回
序号 | 长度(字节) | 字段 | 说明 |
---|---|---|---|
01 | 2 | 帧头 | 0x550xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字(CMD) | 0xDF |
45 | 2 | 数据长度 | 0x000x01 |
6 | 1 | State | 返回的状态值:
|
7 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈