配件通讯服务

更新时间:2024-11-04 03:20:20下载pdf

单点蓝牙通用模组具备配件激活能力,并为配件提供安全可靠的通信通路。单点蓝牙通用模组采用蓝牙低功耗(Bluetooth LE)技术,通过与非智能配件的 UART 接口连接,实现扩展通信功能。这样,非智能配件可以利用蓝牙模组与其他设备进行数据传输和互联,实现更广泛的通信能力。

典型应用方案

  • 电动工具-电池包

方案特点

该方案具有灵活性、稳定性和可靠性,并适用于多种应用场景。

  • 蓝牙模组能够支持非智能配件的激活,并为其提供安全可靠的通信通路。
  • 非智能配件具备独立的产品标识符(PID)、面板和数据点(DP)定义,以及用于固件更新的通道号。
  • 可以让配件通过蓝牙设备与 Dongle 进行空中产测。
  • 蓝牙模组能够为非智能配件提供数据上报、指令下发以及固件更新等功能。

技术简介

以电池包为例,其构成包括主控 MCU 和蓝牙通用模组。MCU 和蓝牙模组之间通过 UART 接口进行通信,蓝牙模组提供与 App 连接以及云服务的功能。配件通过 UART 接口与电池包主控 MCU 进行通信,主控 MCU 接收到配件的串口数据后会完全透传给蓝牙模组进行处理。蓝牙模组会存储配件的设备信息,例如产品标识符(PID)、设备通用唯一识别码(UUID)和插拔状态。
当主控 MCU 通知蓝牙模组有配件插入时,若蓝牙模组与 App 处于连接状态,会将配件信息上报至 App 进行云端激活流程。激活成功后,蓝牙模组将为配件提供独立的蓝牙通信通路,使配件可以在 App 中访问独立面板进行控制和显示。

配件通讯服务

快速体验

软硬件准备

  • 蓝牙单点通用模组

  • 涂鸦模组调试助手

第一步:选择蓝牙通用固件

选择支持扩展 MCU 配件功能的蓝牙通用固件。

  1. 登录 涂鸦开发者平台

  2. 单击 创建产品

  3. 根据您已有的智能设备分类,选择产品类目,确定具体产品。例如 电工 > 电池包

  4. 选择智能化方式 处,选择 产品开发

  5. 自定义方案 处,选择电池包。

  6. 进入产品开发,在 03 硬件开发 中,选择 MCU SDK 对接方式,选择如下固件。

    当前 Telink 系列模组对扩展 MCU 配件功能进行了适配,以下是当前支持该功能的交付物不完全列举。若您在 硬件开发 页面无法选择到对应的交付物,可 提交工单 联系涂鸦产品上架相应交付物。

    配件通讯服务

第二步:体验扩展配件功能

明确约定连接方式为蓝牙模组通过 UART 与 MCU 连接,MCU 通过 UART 与配件连接。在下文中,简称蓝牙模组为 模组。鉴于配件通过 MCU 透传数据与蓝牙模组进行通信,为了方便调试,此处使用涂鸦模组调试助手充当 MCU 和配件的角色。以下是以电池包为例的测试步骤:

  1. 首先,蓝牙通用模组默认不支持配件挂载功能,您需要通过 MCU 信息-配件挂载支持配置(CMD-0x01) 来开启该功能。例如:

    MCU -> 模组:55 AA 00 01 00 10 34 6B 78 36 68 6C 61 78   31 2E 30 2E 30   C2 01 01  BB(C2 配置项,格式为 C2 01 01,意味着启用配件挂载支持功能)

    修改蓝牙模组的配件挂载支持能力后,需要重新进行蓝牙配网才能使更改生效。

  2. 通过涂鸦模组调试助手,向模组发送包含 PID、UUID 和固件信息的配件数据。例如:

    配件 -> MCU -> 模组:55 AA 10 01 00 23 10 74 75 79 61 31 32 33 34 35 36 37 38 39 61 62 63 00 08 72 64 67 61 72 67 78 31 07 09 01 00 00 01 00 00 43(UUID:tuya123456789abc,配件 PID:rdgargx1,配件固件信息:通道号 9,固件版本 1.0.0,硬件版本 1.0.0)

  3. 电池包 MCU 需要监测配件的插拔状态,并将此信息同步给蓝牙模组。一旦模组接收到配件插入的信号,将配件信息上报至 App,从而触发云端激活。随后,配件将在 App 主页中呈现,并获得独立的面板和通信通路。若未呈现,您可刷新主页。例如:

    MCU -> 模组:55 AA 00 C2 00 02 00 01 C4

    模组 -> MCU:55 AA 00 C2 00 01 00 C2

    配件通讯服务

MCU 协议(节选)

该部分协议为 MCU 扩展非智能配件联网控制的扩展协议。

为了便于理解,下文将以电池包-电动工具应用场景为例来描述协议,电池包为主设备,电动工具为非智能配件。

配件插拔状态同步(CMD-0xC200)

  • 电动工具的在线状态依赖电池包蓝牙的在线状态,当电池包蓝牙离线时,电动工具也会离线。
  • 电池包需要监测电动工具的插拔状态,并通过该命令,同步电动工具的插拔状态到电池包蓝牙模组。电池包蓝牙模组收到电动工具的插拔状态后,会同步更新电动工具的连接状态给手机 App,手机 App 上的电动工具的在线状态也会随之改变。

如果电动工具在 OTA 升级过程中,电池包上报电动工具被拔出,将导致电动工具 OTA 升级失败。

电池包 MCU 发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xC2
4
5
2 数据长度 Len 0x00
0x02
6 1 SubCmd 0x00
7 1 status
  • 0x00:配件拔出
  • 0x01:配件插入
8 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

蓝牙模组回复

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x00
3 1 命令字 CMD 0xC2
4
5
2 数据长度 Len 0x00
0x02
6 1 SubCmd 0x00
7 1 Status
  • 0x00:成功
  • 0x01:失败
8 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

MCU 查询模组 MAC 地址(CMD-0xBE)

若电池包 MCU 需要获取蓝牙模组的 MAC 地址信息,可通过该接口查询。

电池包 MCU 发送

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

蓝牙模组回复

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

例如:模组的 MAC 地址为 DC:23:66:11:22:33

MCU 发送:55 AA 00 BE 00 00 BD

模组回复:55 AA 00 BE 00 06 DC 23 66 11 22 33 8E

配件协议

每个配件必须严格遵循协议与主体设备进行交互。对于采用 MCU 通用对接方案的设备,MCU 应完全透传协议版本为 0x10 的串口帧,以供蓝牙低功耗模组处理配件消息。

帧格式定义

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

所有大于 1 个字节的数据均采用大端模式传输。协议版本号固定为 0x10,为配件专用,可通过 0x55AA10 来识别配件的命令帧。

DP 格式

字段 字节数 说明
dp_id 1 DP 的指令码
dp_type 1 DP 的数据类型
dp_data_len 2 DP 的数据长度
dp_data_value dp_data_len DP 的数据

dp_type 的取值范围及含义(云端定义):

dp_type 取值 字节数 说明
raw 0x00 1~255 原始类型,Hex 数组
bool 0x01 1 布尔值
value 0x02 4 值类型(Integer)
string 0x03 0~255 字符串,可能为空
enum 0x04 1 枚举型
bitmap 0x05 1/2/4 长度大于 1 字节时,大端表示

握手(CMD-0x00)

当配件接入主设备后,需进行握手。若 3 秒内未收到主设备的响应,需要重试,直至收到主设备的响应为止。

配件发送

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

例如:

55 AA 10 00 00 00 0F

主设备返回

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0x00
数据长度 Len 2 数据字段字节数之和
数据 1 op_code
  • 0x00:握手,同时请求设备信息(配件需要发送 CMD 0x01)。
  • 0x01:仅握手
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

例如:

55 AA 10 00 00 01 00 10

上报设备信息(CMD-0x01)

  • 若配件收到主设备的握手返回值为 0x00,则配件需要发送该指令。

  • 配件必须确保主设备成功接收信息。如果接收失败或者接收超时时间超过 3 秒,则需要进行重发,直到信息成功被主设备接收。

  • 配件 OTA 升级开始后,直到配件 OTA 升级结束之前,禁止通过该命令上报设备信息,否则可能导致升级异常。配件端应增加相应逻辑,确保 OTA 升级过程中不会上报该命令。

配件发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x10
命令字 CMD 1 0x01
数据长度 Len 2 数据字段字节数之和
数据 1 UUID_LEN
16 UUID
1 ID_TYPE:0-Product ID(8 字节)
1 ID_LEN (8)
8 ID
1 FW_INFO_LEN:固件信息的长度
FW_INFO_LEN FW_INFO_LIST:格式见下表
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

FW_INFO_LIST:固件信息列表,支持多个固件,配件依实际情况填写。

7 字节 …… 7 字节
FW_INFO1 …… FW_INFOn

FW_INFO

1 字节 3 字节 3 字节
channle soft_version hard_version
  • channel0~19,在平台创建时生产的固件通道号。
  • soft_version:例如 0x01 00 02 代表版本为 V1.0.2。
  • hard_version:例如 0x01 00 02 代表版本为 V1.0.2。

例 1:配件含有 3 个固件,分别是配件 MCU 固件、扩展固件 1 和扩展固件 2。

55 AA 10 01 00 31 10 38 30 30 63 39 39 66 30 33 35 34 39 62 61 33 63 00 08 74 38 78 6A 61 77 76 73 15 09 00 00 01 00 01 00 0A 00 00 01 00 01 00 0B 00 00 01 00 01 00 12

例 2:配件只含一个配件 MCU 固件。

55 AA 10 01 00 23 10 38 30 30 63 39 39 66 30 33 35 34 39 62 61 33 63 00 08 74 38 78 6A 61 77 76 73 07 09 00 00 01 00 01 00 DD

主设备返回

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0x01
数据长度 Len 2 数据字段字节数之和
数据 1 status
  • 0x00:成功
  • 0x01:失败
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

例如:

55 AA 10 01 00 01 00 11

下发工作状态(CMD-0x02)

当配件的工作状态发生变化时,主设备将会通过该指令下发通知。

主设备发送

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0x02
数据长度 Len 2 数据字段字节数之和
数据 1 state
  • 0x00:未激活
  • 0x01:激活未连接
  • 0x02:激活已连接
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

例如:

55 AA 10 02 00 01 01 13

配件返回

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0x02
数据长度 Len 2 数据字段字节数之和
数据 1 status
  • 0x00:成功
  • 0x01:失败
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

状态下发(CMD-0x06)

  • Data point 参考概述中 DP 格式说明部分
  • 命令下发可含多个 data point 命令数据单元。
  • 命令下发为异步处理协议,对应于配件 MCU 的 data point 状态上报

主设备发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x10
命令字 CMD 1 0x06
数据长度 Len 2 数据字段字节数之和
数据 4 SN
1 dp1_id
1 dp1_type
2 dp1_len
dp_len dp1_data
…… ……
1 dpN_id
1 dpN_type
2 dpN_len
dpN_len dpN_data
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

例如:

55 AA 10 06 00 09 00 00 00 02 01 01 00 01 01 24

配件返回

状态上报(CMD-0x07)

  • Data point 参考 DP 格式说明部分
  • 状态上报可含多个 data point 命令数据单元。
  • 状态上报为异步处理协议,触发机制有三类:
    • 配件 MCU 收到命令下发处理帧时,正确执行相应 data point 命令,再通过状态上报帧,将变化后的 data point 状态发送至模组。
    • 配件 MCU 主动检测到 data point 有变化,将变化后的 data point 状态发送至模组。
    • 配件 MCU 收到 状态查询 帧时,将所有的 data point 状态发送至模组。

配件发送

字段 字节数 说明
帧头 2 0x55 0xAA
版本号 1 0x10
命令字 CMD 1 0x07
数据长度 Len 2 数据字段字节数之和
数据 4 SN
1 FLAG
1 time_type:
  • 0x00:表示主设备自动填充时间上报
  • 0x01:配件自带时间上报,格式保留
  • 0xff:表示不带时间参数上报
0 或者 M 时间参数,当 time_type 为 1 时,存在。
N dp_point
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

SN:序列号。

FLAG

  • 0:同时上报云端和面板。
  • 1:上报云端,不上报面板。
  • 2:上报面板,不上报云端。
  • 3:都不上报。

例 1:同时上报云端和面板,不带时间参数上报。

55 AA 10 07 00 1B 00 00 00 FF 00 FF 01 01 00 01 00 03 02 00 04 00 00 01 F4 07 02 00 04 00 00 00 00 3D

主设备返回

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0x07
数据长度 Len 2 数据字段字节数之和
数据 4 SN
数据 1 FLAG
数据 1 status
  • 0x00:成功
  • 0x01:失败
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

例如:

55 AA 10 07 00 01 00 17

状态查询(CMD-0x08)

  • 状态查询为异步处理协议,主要用于模组查询 MCU 所有的 obj 类型的 data point 状态。当配件 MCU 收到此帧时,通过 CMD 0x07 状态上报 上报 data point 状态。
  • 状态查询发送时机主要有两种:
    • 主设备绑定已连接状态下,检查到配件 MCU 发生重启,查询发送。
    • 主设备蓝牙离线再上线(由绑定未连接状态变化成绑定已连接状态)的情况,查询发送。

主设备发送

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0x08
数据长度 Len 2 数据字段字节数之和
数据 1 Num
  • 如果 NUM = 0,代表查询所有 DP 数据。
  • 如果 NUM > 0,代表查询 NUM 个 DP 的数据,这 NUM 个 DP 序号在 DP_LIST 数据区。
数据 0 或 NUM DP_LIST:要查询的 DP ID 列表。
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

例如:

55 AA 10 08 00 00 17

配件返回

无。

配件通过 DP 数据上报响应该事件。

查询蓝牙 MAC 地址(CMD-0xBE)

如果配件 MCU 需要获取蓝牙模组的 MAC 地址信息,可以通过该接口进行查询操作。

配件发送

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

主设备回复

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

例如:模组的 MAC 地址为 DC:23:66:11:22:33

配件发送:55 AA 10 BE 00 00 CD

主设备回复:55 AA 10 BE 00 06 DC 23 66 11 22 33 9E

设置串口帧间隔(CMD-0xBF)

若配件存在通讯效率不匹配的问题,可以通过该接口调整串口间隔,模组会尽量保证帧间隔大于设置值。

配件发送

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x10
3 1 命令字 CMD 0xBF
4
5
2 数据长度 0x00
0x01
6 1 INTERVAL 帧间隔,单位 10 ms。例如,值 25 表示帧间隔为 250 ms
7 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

主设备回复

序号 字节数 字段 说明
0
1
2 帧头 0x55
0xAA
2 1 版本号 0x10
3 1 命令字 CMD 0xBF
4
5
2 数据长度 0x00
0x01
6 1 status status
  • 0x00:成功
  • 0x01:失败
7 1 CRC8 从帧头开始按字节求和得出的结果对 256 求余

升级流程

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

配件升级请求(CMD-0xFA)

升级开始时,主设备会向配件发送请求,以获取配件串口可传输的最大单包长度。

主设备发送

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xFA
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
数据 2 Len1
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • TYPE

    • 0:蓝牙低功耗(LE)升级固件,配件一般不会有蓝牙 LE 固件
    • 1:MCU 升级固件。通常是该类型,在开发者平台创建的固件通道号为 9
    • 10-19:扩展固件通道号,在开发者平台创建
    • 其他:保留
  • Len1:最大单包数据长度,设备允许的单包数据最大长度,单位字节。

配件回复

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xFA
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
数据 1 Flag
数据 6 Type_dataVersion(4 字节) + Len2(2 字节)
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • TYPE:同下发。

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

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

  • Len1:主设备限定最大单包数据长度。

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

配件升级文件信息(CMD-0xFB)

配件 OTA 升级文件信息描述了升级的相关信息,配件可以利用这些信息来比较是否需要进行升级。

主设备发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x10
命令字 CMD 1 0xFB
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
8 PID
4 文件版本
16 文件 MD5
4 文件长度
4 CRC32
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • TYPE

    • 0:蓝牙低功耗(LE)升级固件,配件一般不会有蓝牙 LE 固件
    • 1:MCU 升级固件。通常是该类型,在开发者平台创建的固件通道号为 9
    • 10-19:扩展固件通道号,在开发者平台创建
    • 其他:保留
  • PID:配件 的 PID。

  • 文件版本:例如,0x00 01 00 02 代表版本为 V1.0.2。

  • 文件 MD5:升级固件的 MD5 值。

  • 文件长度:升级固件的总长度,单位字节。

  • CRC32:升级固件的 CRC32。

配件回复

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x10
命令字 CMD 1 0xFB
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
1 STATE
4 已存储文件长度
4 已存储文件 CRC32
16 已存储文件 MD5(目前不使用)
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

TYPE:同下发。

STATE

  • 0x00:正常升级。

  • 0x01:产品 PID 不一致。

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

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

  • 其他:保留。

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

配件升级文件偏移请求(CMD-0xFC)

主设备发送

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xFC
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
数据 4 OFFSET
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • TYPE

    • 0:蓝牙低功耗(LE)升级固件,配件一般不会有蓝牙 LE 固件
    • 1:MCU 升级固件。通常是该类型,在开发者平台创建的固件通道号为 9
    • 10-19:扩展固件通道号,在开发者平台创建
    • 其他:保留
  • OFFSET:文件起始传输偏移量,四字节。

配件回复

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xFC
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
数据 4 OFFSET
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • TYPE:同下发。

  • OFFSET:配件要求的起始传输文件偏移量。

实际文件传输的偏移地址应该以配件端要求的为准,且配件端要求的地址会小于等于主设备端给出的偏移。

配件升级数据(CMD-0xFD)

主设备发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x10
命令字 CMD 1 0xFD
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
2 包号
2 当前包数据长度 n
2 当前包数据 CRC16
n 当前包数据
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

TYPE

  • 0:蓝牙低功耗(LE)升级固件,配件一般不会有蓝牙 LE 固件
  • 1:MCU 升级固件。通常是该类型,在开发者平台创建的固件通道号为 9
  • 10-19:扩展固件通道号,在开发者平台创建
  • 其他:保留

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

配件回复

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xFD
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
数据 1 STATE
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

TYPE:同下发。

State 返回值说明:

  • 0x00:成功

  • 0x01:包号异常

  • 0x02:长度不一致

  • 0x03:CRC 校验失败

  • 0x04:其他

配件升级结束(CMD-0xFE)

主设备发送

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xFE
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

TYPE

  • 0:蓝牙低功耗(LE)升级固件,配件一般不会有蓝牙 LE 固件
  • 1:MCU 升级固件。通常是该类型,在开发者平台创建的固件通道号为 9
  • 10-19:扩展固件通道号,在开发者平台创建
  • 其他:保留

配件回复

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xFE
数据长度 Len 2 数据字段字节数之和
数据 1 TYPE
数据 1 STATE
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

TYPE:同下发。

State 返回值说明:

  • 0x00:成功

  • 0x01:数据总长度错误

  • 0x02:长度不一致

  • 0x03:其他

产测透传(CMD-0xF0)

配件支持通过电池包与蓝牙 Dongle 进行空中授权,空中授权相关指令通过该命令进行透传。

配件通讯服务

配件/主设备发送

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xF0
数据长度 Len 2 数据字段字节数之和
数据 n 见通用授权产测协议
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

主设备/配件返回

字段 字节数 说明
帧头 2 0x55
0xAA
版本号 1 0x10
命令字 CMD 1 0xF0
数据长度 Len 2 数据字段字节数之和
数据 n 见通用授权产测协议
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

常见问题

Q:如何区分 MCU 通用对接协议和配件通用对接协议?

A

蓝牙通用串口协议 是指用于规定 MCU 与蓝牙模组之间通过 UART 通信的协议。而 蓝牙配件通用串口协议 则是指用于规定配件与 MCU 之间通过 UART 通信的协议。这两个协议可以通过协议版本号进行区分。

通常情况下,配件通用串口协议的版本号为 0x10,即帧头为 0x55AA10。当 MCU 检测到协议版本号为 0x10 时,将完全透传串口帧给蓝牙模组进行处理。

Q:对于电池包-电动工具应用场景,电池包 MCU 需要增加哪些代码逻辑?

A

需要增加以下逻辑:

Q:对于电池包-电动工具应用场景,一个电池包是否可以搭配多个电动工具使用?

A

一个电池包能够激活多个电动工具,然而面板仅显示最近激活的电动工具。电动工具的 UUID(唯一识别码)必须是独一无二且有效的,以确保电池包能正确地激活电动工具。

在更换电动工具后,电池包微控制器(MCU)需要更新配件信息,并将插拔状态同步传递给蓝牙模组,以便进行激活操作。

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

A

配件可通过升级协议 CMD-0xFA~0xFE 中的 TYPE 字段进行差异化,用于区分升级固件。此处 TYPE 为 1,表示 MCU 固件,10~19 表示扩展固件升级通道号。每个在平台上创建的升级固件都会分配一个通道号。

Q:配件何时需要上报配件设备信息给主设备?

A

以电池包和电动工具的应用场景为例。

  1. 当电动工具插入电池包时,电池包的 MCU 首先通过 CMD-0xC200 指令,上报电动工具的插拔状态给蓝牙模组。

  2. 蓝牙模组会记录电动工具的插拔状态,同时电动工具尝试与电池包的蓝牙模组进行握手(CMD-0x00)。

  3. 握手成功后,电动工具上报其设备信息(CMD-0x01)给电池包的蓝牙模组,蓝牙模组会缓存该设备信息。

    • 如果电池包的蓝牙在线,蓝牙模组会立即为电动工具代理激活并上线。
    • 如果电池包的蓝牙不在线,蓝牙模组会在蓝牙恢复在线时自动为电动工具代理激活。
    • 电动工具不需要重复上报设备信息,蓝牙模组会进行设备管理,并且所有信息只需在状态发生变化时上报。
  4. 若电动工具被激活上线成功,电池包蓝牙模组会通过 CMD-0x02 下发工作状态,同时进行状态查询(CMD-0x08)。

有哪些常见注意事项?

A

  • 当配件将设备信息上报给蓝牙模组后,模组并不会立即为配件进行激活,而是需要等待 MCU 同步配件插拔状态后才会进行激活。
  • 每个配件都必须存储涂鸦授权的 UUID。

参考文档

更多信息,请参考 蓝牙通用串口协议

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

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