扩展固件升级服务

更新时间:2024-07-12 03:11:25下载pdf

本文介绍扩展固件 OTA 升级服务。

概述

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

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

相关协议

该部分协议为 MCU 扩展固件的升级协议。

扩展固件升级流程

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

扩展固件信息上报(CMD-0xF9)

  • 当 MCU 挂载有扩展模块且需要支持扩展模块的升级时,MCU 应在初始化过程中通过该接口将扩展模块的固件信息上报给蓝牙模组。在配网和重连的过程中,蓝牙模组将会上报该信息。
  • 在模组端掉电的情况下,扩展固件的信息不会被保留。因此,为了确保扩展固件升级功能的正常运作,MCU 需要在每次模组启动时更新扩展固件的信息。模组每次启动都会通过 CMD-0xE8 查询 MCU 固件信息,建议 MCU 在接收到 CMD-0xE8 指令时,在回复 CMD-0xE8 之前,通过该命令上报扩展固件信息给模组。这样,每次模组启动都能及时获取并更新扩展固件的相关信息,以便确保扩展固件升级功能的可靠性。
  • 蓝牙 LE+X 架构的设备,在扩展固件升级成功后,MCU 需要特别注意来自模组的 CMD-0xE8 命令的查询。确保扩展固件版本号已经成功更新后,再通过该命令上报扩展固件信息并响应 CMD-0xE8 命令。这样可以确保蜂窝模组及时获取并更新扩展固件的相关信息,保障扩展固件升级功能的正常运行。
  • 上报扩展固件信息是支持扩展固件升级的前提。

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:成功
  • 其他:失败

扩展固件升级请求(CMD-0xFA)

升级开始时,蓝牙模组会向 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:同下发。

  • Flag0x00:允许升级,0x01:拒绝升级。

  • Version:当前固件版本号,例如 0x01 00 02 代表版本为 V1.0.2。

  • Len1:模组限定最大单包数据长度。

  • Len2:MCU 扩展固件升级时可接受最大包长度。如果 Len1 < Len2,升级以 Len1 为准,反之以 Len2 为准。

扩展固件升级文件信息(CMD-0xFB)

扩展固件升级文件信息描述了升级的相关信息,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 求余
`channel`:固件通道号(10~19),涂鸦开发者平台创建固件时生成。

STATE

  • 0x00:正常升级。

  • 0x01:产品 PID 不一致。

  • 0x02:文件版本低于或者等于当前版本。

  • 0x03:文件大小超过范围。

  • 其他:保留。

  • 为了支持断点续传,会返回设备端已经储存的文件信息。
    • 模组收到信息后,根据设备返回的已储存文件长度,计算新文件对应长度的 CRC32,然后和设备返回的 CRC32 对比。
    • 如果两者都吻合,那么在下面的文件起始传输请求中,将起始传输偏移量改为该长度值。否则,文件起始传输偏移量改为 0,表示从头开始传输。
  • 每次断点续传都会完全按照 MCU OTA 流程的顺序,从 OTA 升级请求开始。因此,MCU 如果有维护升级状态的话,需要在收到工作状态为非激活已连接的其他状态时重置升级状态,以确保可以开始下一个升级流程。
  • 蓝牙 LE+X 架构的产品仅在蓝牙链路下升级时支持断点续传。

扩展固件升级文件偏移请求(CMD-0xFC)

模组发送

字段 字节数 说明
帧头 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 端要求的地址会小于等于模组端给出的偏移。

扩展固件升级数据(CMD-0xFD)

模组发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x10
命令字 CMD 1 0xFD
数据长度 Len 2 数据字段字节数之和
数据 1 channel
2 包号
2 当前包数据长度 n
2 当前包数据 CRC16
n 当前包数据
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
`channel`:固件通道号(10~19),涂鸦开发者平台创建固件时生成。

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

MCU 返回

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xFD
数据长度 Len 2 数据字段字节数之和
数据 1 channel
1 STATE
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
`channel`:固件通道号(10~19),涂鸦开发者平台创建固件时生成。

State 返回值说明:

  • 0x00:成功

  • 0x01:包号异常

  • 0x02:长度不一致

  • 0x03:CRC 校验失败

  • 0x04:其他

扩展固件升级结束(CMD-0xFE)

模组发送

字段 字节数 说明
帧头 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 求余
`channel`:固件通道号(10~19),涂鸦开发者平台创建固件时生成。

State 返回值说明:

  • 0x00:成功

  • 0x01:数据总长度错误

  • 0x02:长度不一致

  • 0x03:其他

常见问题

Q:该协议和 MCU OTA 协议有什么区别?

A:该协议规定了扩展固件的升级协议,其协议格式在某种程度上与 MCU OTA 协议相似。主要区别在于命令字不同,此外,每个协议数据字段的最前面多了一个 channel 通道号字段,表示该命令是对应哪个固件的。在 MCU 端代码设计上,可以在 MCU OTA 组件上增加通道号的处理,并通过命令字进行区分。

示例

  • 若命令字是 0xEA~0xEF,则默认通道号为 9(MCU 固件)。
  • 若命令字是 0xFA~0xFE,则将数据字段的最前面一个字节解析为通道号,其余的部分偏移一个字节后与之前一样进行解析。

Q:MCU 对接中使用扩展固件升级通道有什么前提?

A:是的,有以下前提要求:

  • 首先,在涂鸦开发者平台,您需要在该产品下创建扩展固件,并记录扩展固件的通道号。

  • MCU 在同步 MCU 信息(CMD-0x01)之后,需要使用 扩展固件信息上报(CMD-0xF9) 命令上报扩展固件的信息。

Q:如何升级包含多个部分的固件?

A:MCU 可通过升级协议 CMD-0xFA~0xFE 中的 channel 字段进行差异化,用于区分升级固件。此处 channel 指的是升级通道号,每个在平台上创建的升级固件都会分配一个通道号。

Q:有哪些常见注意事项?

A:对于蓝牙 LE+X 架构的产品,在扩展固件升级流程的最后,只能使用 扩展固件升级文件信息(CMD-0xFB) 命令中的 MD5 值来进行升级文件的校验。CRC32 仅在蓝牙链路真实有效,在蜂窝链路下 CRC32 由于协议上的兼容性问题不支持。

Q:哪些蓝牙模组固件支持扩展固件升级服务?

A:目前,仅交付物名称是 FR8016HA 通用对接或 BF6H 蓝牙单点通用固件支持扩展固件升级服务(固件 key:keywt49k,版本:1.3.0 以上)。后续,其他通用模组会陆续上线该功能。

联系涂鸦

如果在开发过程遇到问题,您可以登录 TuyaOS 开发者论坛 TuyaOS-蓝牙设备开发 版块进行沟通咨询。

咨询前,建议首先查阅 官方资料 或参考已有帖子,并认真阅读 发帖规范