更新时间:2025-10-21 06:39:37下载pdf
本文介绍扩展固件 OTA 升级服务。
OTA(Over-the-Air)即空中下载技术,通过网络远程为设备更新和升级软件程序。
蓝牙 LE 标准协议接入支持 MCU 扩展固件 OTA 功能。通过 涂鸦开发者平台,首先将需要更新的固件文件上传至涂鸦服务器。接着,蓝牙模组通过涂鸦协议对文件进行分包传输,最终 MCU 接收升级包并写入扩展模块本地闪存,实现固件的升级。详细的平台操作,参考 固件升级 和 选择和管理固件版本。
该部分协议为 MCU 扩展固件的升级协议。
MCU 发送
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xF9 |
| 数据长度 | 7n+1 | 数据字段字节数之和 |
| 数据 | 1 | channel_number |
| 7 | channel_data:channel(1 字节)+ Soft_ver(3 字节)+ Hard_ver(3 字节) | |
| …… | 多个扩展固件需要有 channel_number 个 channel_data | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
channel_number:用于扩展固件的扩展通道数量,同时也表示有多少组 channel_data。channel:固件通道号(10~19),涂鸦开发者平台创建固件时生成。Soft_Ver:MCU 当前固件版本号,例如 0x01 00 02 代表版本为 V1.0.2。Hard_ver:MCU 当前硬件版本号,PCBA 版本号。模组返回
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55 0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xF9 |
| 数据长度 | 2 | 0x00 0x01 |
| State | 1 | 返回的状态值 |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
State 返回值说明:
0x00:成功升级开始时,蓝牙模组会向 MCU 发送扩展固件请求,以便获取扩展固件升级时可传输的最大单包长度。
模组发送
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xFA |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 2 | Len1 | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
channel:固件通道号(10~19),涂鸦开发者平台创建固件时生成。
Len1:最大单包数据长度,设备允许的单包数据最大长度,单位字节。
MCU 返回
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xFA |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 1 | Flag | |
| 5 | Type_data:Version(3 字节) + Len2(2 字节) | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
channel:同下发。
Flag:0x00:允许升级,0x01:拒绝升级。
Version:当前固件版本号,例如 0x01 00 02 代表版本为 V1.0.2。
Len1:模组限定最大单包数据长度。
Len2:MCU 扩展固件升级时可接受最大包长度。如果 Len1 < Len2,升级以 Len1 为准,反之以 Len2 为准。
扩展固件升级文件信息描述了升级的相关信息,MCU 可以利用这些信息来比较是否需要进行升级。
模组发送
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x10 |
| 命令字 CMD | 1 | 0xFB |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 8 | PID | |
| 3 | 文件版本 | |
| 16 | 文件 MD5 | |
| 4 | 文件长度 | |
| 4 | CRC32 | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
channel:固件通道号(10~19),涂鸦开发者平台创建固件时生成。
PID:扩展固件所属 的 PID。
文件版本:例如 0x01 00 02 代表版本为 V1.0.2。
文件 MD5:升级固件的 MD5 值。
文件长度:升级固件的总长度,单位字节。
CRC32:升级固件的 CRC32。
MCU 返回
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x10 |
| 命令字 CMD | 1 | 0xFB |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 1 | STATE | |
| 4 | 已存储文件长度 | |
| 4 | 已存储文件 CRC32 | |
| 16 | 已存储文件 MD5(目前不使用) | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
STATE:
0x00:正常升级。
0x01:产品 PID 不一致。
0x02:文件版本低于或者等于当前版本。
0x03:文件大小超过范围。
其他:保留。
0,表示从头开始传输。模组发送
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xFC |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 4 | OFFSET | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
channel:固件通道号(10~19),涂鸦开发者平台创建固件时生成。
OFFSET:文件起始传输偏移量,四字节。
MCU 返回
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xFC |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 4 | OFFSET | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
channel:同下发。
OFFSET:MCU 要求的起始传输文件偏移量。
实际文件传输的偏移地址应该以 MCU 端要求的为准,且 MCU 端要求的地址会小于等于模组端给出的偏移。
模组发送
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x10 |
| 命令字 CMD | 1 | 0xFD |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 2 | 包号 | |
| 2 | 当前包数据长度 n | |
| 2 | 当前包数据 CRC16 | |
| n | 当前包数据 | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
包号从 0 开始,当前包数据长度不能大于 OTA 升级请求指令指定的最大包长度。
MCU 返回
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xFD |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 1 | STATE | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
State 返回值说明:
0x00:成功
0x01:包号异常
0x02:长度不一致
0x03:CRC 校验失败
0x04:其他
模组发送
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55 0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xFE |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
channel:固件通道号(10~19),涂鸦开发者平台创建固件时生成。
MCU 返回
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 0x55,0xAA |
| 版本号 | 1 | 0x00 |
| 命令字 CMD | 1 | 0xFE |
| 数据长度 Len | 2 | 数据字段字节数之和 |
| 数据 | 1 | channel |
| 1 | STATE | |
| CRC8 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
State 返回值说明:
0x00:成功
0x01:数据总长度错误
0x02:长度不一致
0x03:其他
A:该协议规定了扩展固件的升级协议,其协议格式在某种程度上与 MCU OTA 协议相似。主要区别在于命令字不同,此外,每个协议数据字段的最前面多了一个 channel 通道号字段,表示该命令是对应哪个固件的。在 MCU 端代码设计上,可以在 MCU OTA 组件上增加通道号的处理,并通过命令字进行区分。
示例:
0xEA~0xEF,则默认通道号为 9(MCU 固件)。0xFA~0xFE,则将数据字段的最前面一个字节解析为通道号,其余的部分偏移一个字节后与之前一样进行解析。A:是的,有以下前提要求:
首先,在涂鸦开发者平台,您需要在该产品下创建扩展固件,并记录扩展固件的通道号。
MCU 在同步 MCU 信息(CMD-0x01)之后,需要使用 扩展固件信息上报(CMD-0xF9) 命令上报扩展固件的信息。
A:MCU 可通过升级协议 CMD-0xFA~0xFE 中的 channel 字段进行差异化,用于区分升级固件。此处 channel 指的是升级通道号,每个在平台上创建的升级固件都会分配一个通道号。
A:对于蓝牙 LE+X 架构的产品,在扩展固件升级流程的最后,只能使用 扩展固件升级文件信息(CMD-0xFB) 命令中的 MD5 值来进行升级文件的校验。CRC32 仅在蓝牙链路真实有效,在蜂窝链路下 CRC32 由于协议上的兼容性问题不支持。
A:目前,仅交付物名称是 FR8016HA 通用对接或 BF6H 蓝牙单点通用固件支持扩展固件升级服务(固件 key:keywt49k,版本:1.3.0 以上)。后续,其他通用模组会陆续上线该功能。
如果在开发过程遇到问题,您可以登录 TuyaOS 开发者论坛 TuyaOS-蓝牙设备开发 版块进行沟通咨询。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈