更新时间:2024-11-15 07:24:50下载pdf
本文介绍涂鸦蓝牙透传方案中的串口协议,适用于如下架构的通讯方案:
波特率(bps):9600 / 115200
数据位:8
奇偶校验:无
停止位:1
数据流控:无
蓝牙模组每次上电或重启时,会启动波特率轮询。优先以上一次的串口配置开始发送心跳包,每个心跳周期切换一次波特率。若收到回复,则判断为通讯波特率,停止轮询并写配置到 Flash。该功能部分固件旧版本上不支持。
名词 | 说明 |
---|---|
DP | 即设备功能(Data Point),代表一条或一对指令码。更多详情,请参考 产品功能。 |
PID | 即产品 ID(Product ID),描述一类产品功能(DP)的集合。在 涂鸦 IoT 开发平台 创建的每一个产品都会产生一个唯一的产品编号,关联了产品具体的设备功能、App 控制面板、出货信息等所有跟这个产品相关的信息。 |
蓝牙绑定 | 指蓝牙设备通过 涂鸦蓝牙通讯协议 与 App 账号建立起的一种绑定关系,以及表示设备在云端的绑定状态。 |
蓝牙解绑 | 指设备解除与 App 账号的绑定关系,进入未绑定未连接状态。 |
蓝牙重置 | 指在 App 上操作解绑并清除数据,与 蓝牙解绑 的区别在于用户数据是否清除。 |
蓝牙连接 | 仅表示蓝牙设备链路层的状态为连接状态。 |
蓝牙广播 | 仅表示蓝牙设备链路层的状态为广播状态。 |
蓝牙配网状态 | 该名词中的 配网 不同于 Wi-Fi 设备配路由器的过程,指的是未绑定未连接的蓝牙设备处于广播状态的一种状态,此时 App 可通过广播发现设备。 |
蓝牙绑定已连接 | 通常也叫设备 上线,蓝牙绑定已连接是指蓝牙设备通过 涂鸦蓝牙通讯协议 与 App 建立的安全通讯状态。 |
蓝牙绑定未连接 | 通常也叫设备 离线,表示设备与 App 账号建立了绑定关系,但链路层未连接,不处于安全通讯状态。 |
蓝牙网关在线 | 判断网关的在线状态,依赖于网关的离线和在线逻辑:
|
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 协议升级扩展用 |
3 | 1 | 命令字 CMD | 具体帧类型 |
4 5 |
2 | 数据长度 Len | Len 高 8 位 Len 低 8 位 |
6~6+Len-1 | Len | 数据 | - |
6+Len | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
所有大于 1 个字节的数据均采用大端模式传输。
字段 | 字节数 | 说明 |
---|---|---|
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 字节时,大端表示 |
模组上电后,以 3s 的间隔定期发送心跳包。收到 MCU 的心跳包回应后,模组会认为 MCU 正常工作。在 MCU 首次(上电或重启)回复心跳包后,模组会向 MCU 查询产品信息。
MCU 侧也可依据此心跳定期检测模组是否正常工作。若模组无心跳下发,则 MCU 可通过模组提供的硬件复位引脚复位模组。
模组在获取 MCU 信息之后,在低功耗模式下无心跳,正常功耗模式下以 10s 的间隔定期发送心跳。
Telink 模组在低功耗下无心跳,非低功耗下在获得 MCU 信息(PID)后也不再发送心跳包,因此也无法检测 MCU 是否发生重启。
模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x00 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
MCU 返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x00 |
4 5 |
2 | 数据长度 | 0x00 0x01 |
6 | 1 | State | 返回的状态值 |
7 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
State
返回值说明:
0x00
:仅 MCU 上电后第一次收到模组心跳包后的返回值,模组端也可依据这一点判断工作过程中 MCU 是否重启。0x01
:除 MCU 重启后第一次返回 0x00
外,其余均返回此值。模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x01 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
MCU 返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x01 |
4 5 |
2 | 数据长度 | 0x00 0x0d |
6~18+n | 13+n | Data | 见下表 |
19+n | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
Data 格式
1~8 | 9~13 | 14~14+n |
---|---|---|
PID | 保留字段 | 可选信息 TLD [TLD] [TLD]… |
示例:55 AA 00 01 00 0D 66 74 62 38 78 32 78 30 31 2E 30 2E 30 C0(pid
=ftb8x2x0,mcu ver
=1.0.0)
PID:为 8 位字符串,如 ftb8x2x0
。
保留字段:此字段原填充的是 MCU 软件版本号,但模组目前不对该字段做解析,字段保留,起占位作用。MCU 版本号通过 CMD E8/E9 上报。
TLD:用于配置通用固件的一些功能和能力。TLD 是一种自定义数据格式:
T
表示要配置的功能 ID,即 Type。L
表示该配置后面跟的数据长度。D
为具体的配置数据。TLD 可以有 1 个或多个,当不使用默认配置的时候需要填,使用默认配置可以不填。
T
和 L
的值是固定的,模组端会根据 T
和 L
的值解析 D
的数据,不同 TLD 之间没有顺序要求。
以下是具体的 TLD 数据格式,序号仅表示 TLD 的字节序号。
当 T=0x07,L=0x01 时,D 表示 状态上报——beacon 能力 配置。(可选 TLD,未选且没配置过则默认不支持 beacon)
1 | 2 | 3 |
---|---|---|
T(0x07) | L(0x01) | beacon_enable |
beacon_enable
:状态上报(CMD-0x07)接口,beacon 能力标志。开启后,可使设备在绑定未连接时支持状态广播的方式将状态上报到网关或 App,主要用于网关配合工作。详情见 CMD-0x07。
0x00
:关闭
0x01
:开启
其他:保留
示例:55 AA 00 01 00 10 6D 6E 75 78 64 38 30 75 31 2E 30 2E 30 07 01 01 0F
当 T=0x03,L=0x01 时,D 表示 设备在线逻辑标志 配置。 (可选 TLD,未选且没配置过则默认 0x00
)
1 | 2 | 3 |
---|---|---|
T(0x03) | L(0x01) | online_flag |
online_flag
:设备在线逻辑标志,目前只与蓝牙网关端在线逻辑有关,与手机没有关系。
0x00
:采用标准功耗设备在线策略0x01
:采用低功耗设备在线策略示例:55 AA 00 01 00 13 6D 6E 75 78 64 38 30 75 31 2E 30 2E 30 07 01 01 03 01 01 17
当 T=0xBA,L=0x01 时,D 表示 SMP 使能 配置。(可选 TLD,未选且没配置过则默认 0x00
)
1 | 2 | 3 |
---|---|---|
T(0xBA) | L(0x01) | SMP_ENABLE |
SMP_ENABLE
:蓝牙 SMP 相关功能模组使能状态。
0x00
:不使用 SMP 配对相关功能0x01
:使用 SMP 配对相关功能示例:55 AA 00 01 00 10 34 6B 78 36 68 6C 61 78 31 2E 30 2E 30 BA 01 01 B3
当 T=0x01,L=0x01 时,D 表示 安全连接类型 配置。(可选 TLD,未选且没配置过则默认 0x00
)
1 | 2 | 3 |
---|---|---|
T(0x01) | L(0x01) | Secure_connect_type |
Secure_connect_type
:蓝牙安全连接类型。
0x00
:使用默认配置,默认不限制,即二维码和搜索方式都能添加设备。0x01
:限制仅通过扫描二维码方式添加设备。示例:55 AA 00 01 00 10 34 6B 78 36 68 6C 61 78 31 2E 30 2E 30 01 01 01 FA
当 T=0x02,L=0x01 时,D 表 连接策略 配置。(可选 TLD,未选且没配置过则默认 0x00
)
1 | 2 | 3 |
---|---|---|
T(0x02) | L(0x01) | connection_strategy |
connection_strategy
:蓝牙连接策略。(配置更改后需重新配网)
0
:短连接(按需连接)。1
:长连接。此配置 bit 仅针对网关。0
:同时支持手机和网关。1
:只支持网关。2
:只支持手机。示例:支持网关长连接:55 AA 00 01 00 10 34 6B 78 36 68 6C 61 78 31 2E 30 2E 30 02 01 01 FB
当 T=0xC2,L=0x01 时,D 表示 配件挂载支持 配置。(可选 TLD,未选且没配置过则默认 0x00
)
1 | 2 | 3 |
---|---|---|
T(0xC2) | L(0x01) | Accessory_Support |
Accessory_Support
:非智能配件挂载支持情况。配置更改后需重新配网。
0x00
:使用默认配置,默认不支持。0x01
:支持挂载非智能配件,提供配件激活、配件 DP 传输通道及配件 OTA 通道,见配件通用串口协议。示例:55 AA 00 01 00 10 34 6B 78 36 68 6C 61 78 31 2E 30 2E 30 C2 01 01 BB
可选信息为非必填项,MCU 信息及配置信息会存 Flash。未填的情况下,模组会根据之前的配置进行处理,若没配置过则使用默认,否则使用之前的配置。
模组工作模式主要针对如何指示模组的工作状态以及如何重置模组而言,主要分两种情况:
目前仅支持 MCU 与模组配合处理模式。
模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x02 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
示例:55 aa 00 02 00 00 01
MCU 返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x02 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
示例:55 AA 00 02 00 00 01
0x00
:未绑定0x01
:绑定未连接0x02
:绑定已连接0x02
后,则会向 MCU 下发模组工作状态。模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x03 |
4 5 |
2 | 数据长度 | 0x00 0x01 |
6 | 1 | State | 返回的状态值 |
7 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
State | 工作状态说明 | 共享类通用固件注意 |
---|---|---|
0x00 | 未绑定 | 共享类产品对绑定这个概念进行了模糊处理,未绑定和绑定未连接在共享类都认为是可配网状态 |
0x01 | 绑定未连接 | 同上 |
0x02 | 绑定已连接 | 绑定已连接在共享类认为是已配网已连接状态 |
如果 MCU 使用了蓝牙广播使能(CMD-0xA3
)接口关闭蓝牙广播,或者设置了触发配网(CMD-0xBC
),则 MCU 需要通过蓝牙广播使能(CMD-0xA3
)或者触发配网(CMD-0xBC
)接口来重新启动蓝牙配网广播。
MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x04 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
示例:55 aa 00 04 00 00 03
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x04 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
示例:55 AA 00 04 00 00 03
0x04
接口的作用完全一致,是解决历史遗留问题的接口。如果 MCU 使用了蓝牙广播使能(CMD-0xA3
)接口关闭蓝牙广播,或者设置了触发配网(CMD-0xBC
),则 MCU 需要通过蓝牙广播使能(CMD-0xA3
)或者触发配网(CMD-0xBC
)接口来重新启动蓝牙配网广播。
MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x05 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
示例:55 aa 00 05 00 00 04
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x05 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
示例:55 AA 00 05 00 00 04
模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x06 |
4 5 |
2 | 数据长度 Len | Len 高 8 位 Len 低 8 位 |
6~6+Len-1 | Len | datapoint | 见下表 |
6+Len | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
datapoint 格式:
1 | 2 | 3~4 | 5~ | …… | n | n+1 | n+1~n+2 | n+3~ |
---|---|---|---|---|---|---|---|---|
dp1_id | dp1_type | dp1_len | dp1_data | …… | dpN_id | dpN_type | dpN_len | dpN_data |
示例:55 aa 00 06 00 05 03 01 00 01 01 10
MCU 返回
无
dp_len
最大支持 4 字节。开启 beaocn 能力的方法见 获取 MCU 信息 CMD-0x01。MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x07 |
4 5 |
2 | 数据长度 Len | Len 高 8 位 Len 低 8 位 |
6~6+Len-1 | Len | datapoint | 见下表 |
6+Len | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
Data point 格式
1 | 2 | 3~4 | 5~ | …… | n | n+1 | n+1~n+2 | n+3~ |
---|---|---|---|---|---|---|---|---|
dp1_id | dp1_type | dp1_len | dp1_data | …… | dpN_id | dpN_type | dpN_len | dpN_data |
示例:55 aa 00 07 00 05 03 01 00 01 01 11
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x07 |
4 5 |
2 | 数据长度 | 0x00 0x01 |
6 | 1 | State | 返回的状态值 |
7 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
State
返回值说明:
0x00
:成功Telink 通用固件不支持检测 MCU 重启。
模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x08 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
示例:55 aa 00 08 00 00 07
MCU 返回
无
仅解除和手机的绑定关系,并且断开蓝牙连接,不会清除数据和虚拟 ID。
共享类通用固件 绑定 概念被模糊处理了,故不支持模组解绑接口。
MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x09 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x09 |
4 5 |
2 | 数据长度 | 0x00 0x01 |
6 | 1 | State | 返回的状态值 |
7 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
State
返回值说明:
0x00
:成功0x00
:未绑定0x01
:绑定未连接0x02
:绑定已连接MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0x0A |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xA4 |
4 5 |
2 | 数据长度 Len | Len 高 8 位 Len 低 8 位 |
6~6+Len-1 | Len | Data | 见下表 |
6+Len | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
2 字节 | 1 字节 | 1 字节 | (可选)13 字节 | m 字节 |
---|---|---|---|---|
序号 SN | Flag | Time_flag | Time_date | datapoint |
序号 SN(2):两字节,高字节在前。
Flag(1):
0x00
:同时上报云端和面板0x01
:上报云端,不上报面板0x02
:上报面板,不上报云端0x03
:都不上报Time_flag
(1):
0x00
:模组自带时间上报0x01
:MCU 自带时间上报0x02
:不带时间上报Time_date
:仅 Time_flag
等于 0x01 时需要填写,该字段为 13 位 Unix 时间字符串。
DP 数据封装(m):datapoint
参考 DP 格式 说明部分。
例如:动态数据使用不带时间上报且只上报面板。
55 AA 00 A4 00 0B 00 FF 02 02 65 00 00 03 13 23 66 B5
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xA4 |
4 5 |
2 | 数据长度 | 0x00 0x04 |
6~9 | 4 | Data | 见下表 |
10 | 1 | CRC8 | 从帧头开始按字节求和,得出的结果对 256 求余 |
Data 格式
2 字节 | 1 字节 | 1 字节 |
---|---|---|
序号 SN | Flag | State |
0x00
成功,其他失败该接口主要用于重要数据的上报,如果上报时模组处于离线状态,模组会将数据存储在模组 Flash 中,待模组上线再上报至 App。如果模组在线时,会在最后一条数据上报成功(连续上报的最后一条)后,释放缓存数据至 App。
模组可存储最多存储 N 条 DP 数据,记录将循环覆盖存储。
蓝牙模组内部时钟精度有限,24 小时误差小于 1 分钟,但每次重连会重新校准时钟。如果您对精度要求高,建议使用 MCU 自带时间上报。
无论设备是在线还是离线状态,记录型数据强烈建议使用该接口上报。
MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xE0 |
4 5 |
2 | 数据长度 Len | Len 高 8 位 Len 低 8 位 |
6~6+Len-1 | Len | Data | 见下表 |
6+Len | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
Data 格式
1 | 2~x | x | x+1 | x+2~x+3 | x+4~ | …… | n | n+1 | n+1~n+2 | n+3~ |
---|---|---|---|---|---|---|---|---|---|---|
TYPE | Time_Str | dp1_id | dp1_type | dp1_len | dp1_data | …… | dpN_id | dpN_type | dpN_len | dpN_data |
Time_Str
:13 位 UNIX 时间字符串
TYPE_bit3_bit0 | 时间填充方式说明 |
---|---|
0x01 | 格式 1:蓝牙模组自带时间上报 |
0x03 | 格式 3:MCU 自带时间上报 |
TYPE_bit5_bit4 | 上报方式说明 |
---|---|
0x00 | 同时上报云端和面板 |
0x01 | 上报云端,不上报面板 |
0x02 | 上报面板,不上报云端 |
TYPE_bit7_bit6
:保留
TYPE
字段使用枚举:
0x01
:模组自带时间同时上报云端和面板0x03
:MCU 上报时间同时上报云端和面板0x11
:模组自带时间只上报云端0x13
:MCU 上报时间只上报云端0x21
:模组自带时间只上报面板0x23
:MCU 上报时间只上报面板unix_time_string
:仅 TYPE_bit3-bit0
等于 0x03
时需要填,其他格式不用填。
示例:
格式 1:蓝牙模组自带时间上报:
55 AA 00 E0 00 17 01 66 02 00 04 00 00 00 01 67 03 00 05 72 77 72 77 77 68 04 00 01 00 89
格式 3:MCU 自带时间上报:
55 AA 00 E0 00 28 03 31 35 38 39 31 36 38 33 32 37 30 30 30 66 02 00 04 00 00 00 01 67 03 00 09 72 77 72 77 77 61 66 61 66 68 04 00 01 00 D0
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xE0 |
4 5 |
2 | 数据长度 | 0x00 0x01 |
6 | 1 | State | 返回的状态值 |
7 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
State
返回值说明
0x00
:存储成功0x02
。MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xE1 |
4 5 |
2 | 数据长度 | 0x00 0x01 |
6 | 1 | Time_Type | 见下表 |
7 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
Time_type
说明
Time_Type_bit3-bit0 | 时间类型 |
---|---|
0x00 | 格式 0:获取 7 字节时间类型+2 字节时区信息(本地时间) |
0x01 | 格式 1:获取 13 字节 ms 级 unix 时间+2 字节时区信息(格林时间) |
0x02 | 格式 2:获取 7 字节时间类型+2 字节时区信息(本地时间) |
Time_Type_bit5_bit4 | 时间源 |
---|---|
0x00 | 通过 App 请求云端时间 |
0x01 | 请求模组内部软件时钟时间 |
Time_Type_bit7_bit6
:保留
Time_Type
字段使用枚举:
0x00
:请求 App 格式 0 时间
0x01
:请求 App 格式 1 时间
0x02
:请求 App 格式 2 时间
0x10
:请求模组内部格式 0 时间
0x11
:请求模组内部格式 1 时间
0x12
:请求模组内部格式 2 时间
格式 0 获取自定义时间存在不同平台兼容性问题,后面版本会废除,年月日时间格式建议使用 0x02
格式。
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xE1 |
4 5 |
2 | 数据长度 Len | Len 高 8 位 Len 低 8 位 |
6~6+Len-1 | Len | Time_Data | 见下表 |
6+Len | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
Time_Data
格式 0:
结果码 | 时间格式 | 年 | 月 | 日 | 时 | 分 | 秒 | 星期 | 时区 |
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10~11 |
Result | Time_Type | 2018+year | mon | day | hour | min | sec | week | time_zone |
Time_Data
格式 1:
结果码 | 时间格式 | ms 级 unix 时间 | 时区 |
---|---|---|---|
1 | 2 | 3~15 | 16~17 |
Result | Time_Type | unix_time_string | time_zone |
Time_Data
格式 2:
结果码 | 时间格式 | 年 | 月 | 日 | 时 | 分 | 秒 | 星期 | 时区 |
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10~11 |
Result | Time_Type | 2000+year | mon | day | hour | min | sec | week | time_zone |
Result
为 0x00
表示成功,其他表示失败。
示例:
Time_Data
格式 0:
55 AA 00 E1 00 01 00 E1
55 AA 00 E1 00 0B 00 00 01 0C 1E 0F 34 1F 01 03 20 9C
,表示 2019 年 12 月 30 日 15 点 52 分 31 秒 星期一 东八区Time_Data
格式 1:
55 AA 00 E1 00 01 01 E2
55 AA 00 E1 00 11 00 01 31 35 37 37 36 39 32 33 39 35 30 30 30 03 20 BB
,表示时间戳 1577692395000 东八区Time_Data
格式 2:
55 AA 00 E1 00 01 02 E3
55 AA 00 E1 00 0B 00 02 13 0C 1E 10 09 29 01 03 20 90
,表示 2019 年 12 月 30 日 16 点 09 分 35 秒 星期一 东八区当 App 向模组发送恢复出厂设置命令时,模组会向 MCU 发出恢复出厂设置通知,MCU 可以根据该指令做恢复出厂设置功能。
模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xA1 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
MCU 返回
无
MCU 如果需要获得模组的版本信息,可通过该接口查询。如果 MCU 不需要模组的版本信息,可以不实现该协议。
MCU 发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xA0 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xA0 |
4 5 |
2 | 数据长度 | 0x00 0x06 |
6~11 | 6 | DATA | 见下表 |
12 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
DATA
格式
1~3 | 4~6 |
---|---|
Soft_Ver | Hard_ver |
Soft_Ver
:模组当前固件版本号,例如 0x01 00 02
代表版本为 V1.0.2。Hard_ver
:模组当前硬件版本号,PCBA 版本号。模组需要在每次发送获取 MCU 信息时,同时发送查询 MCU 版本号指令。
模组发送
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
0 1 |
2 | 帧头 | 0x55 0xAA |
2 | 1 | 版本号 | 0x00 |
3 | 1 | 命令字 CMD | 0xE8 |
4 5 |
2 | 数据长度 | 0x00 0x00 |
6 | 1 | CRC8 | 从帧头开始按字节求和得出的结果对 256 求余 |
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 版本号。
为了确保模组及时获取到 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 版本号。模组返回
序号 | 字节数 | 字段 | 说明 |
---|---|---|---|
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
:成功该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈