文档版本 |
作者 |
发布日期 |
修改说明 |
V0.0.1 |
蔡永聪 |
2020/03/13 |
初稿 |
V1.0.1 |
蔡永聪 |
2020/5/11 |
修改指令描述和更新排版 |
V1.0.3 |
蔡永聪 |
2020/5/12 |
把牙刷中立即运行当前配置指令合并到设置当前工作档位 |
V1.0.4 |
lxl |
2020/8/18 |
为精简协议,在应用手册中屏蔽部分MCU不需要用到的指令 |
本文档适用于WM06模块。
MCU使用UART控制模块,使数据在BLE或者WIFI中传输,快速实现电动牙刷的智能化。
请扫描此二维码下载AiLink APP。
下文中表明的MCU为与模块连接交互的芯片。
为了便于MCU端开发人员快速实现电动牙刷的智能化。
本文档适用于应用WM06作为电动牙刷传输数据的MCU端开发人员。
模块上电需要时间进行配置,当配置完成,进入就绪时,模块会主动给MCU返回模块状态信息,详情请查看“模块上报状态”。
当模块BLE连接时候,数据通道是串口和BLE;如果BLE没有连接,而WIFI连接上时,数据通道是串口和WIFI。
模块应设置CID、VID、PID,WiFi+Ble电动牙刷CID为0x0012。
模块支持正常工作模式、断电模式和失能模式,用户可以根据自身需求合理选择模式。用户可以在设计PCB的时候,预留两种方式的电路。详情请查看硬件规格书规格书。
在此模式下,模块完全断电,需要供电才能正常工作,这种模式有利于省电。
在此模式下,MCU可以根据模块的连接状态选择合适的时间断电关机,例如,在非蓝牙连接状态时,MCU工作完30s后断电关机,在蓝牙连接状态时,工作完120s后断电关机。获取模块的连接状态,也可以通过串口读取模块状态。这种做法有利于用户能够顺利传输数据到APP上,而不会出现反复关机断连问题。
工作流程:
注:xxxx为Mac地址后4个字符
模块广播数据内容包含:
1、Company ID 。固定:496e(In,Inet缩写,此处预留后续申请SIG company号)
2、CID:产品类型(2bytes)(电动牙刷为0x0012)
3、VID:厂商ID (2byte) (由我司分配)
4、PID:产品ID (2byte) (由厂商分配)
5、Mac地址(MAC是固定的,小端序)
例如广播出来的自定义数据为:
6e49001200010001126134231102
6e49:为In,0012是CID,表示产品类型,0001是VID,表示厂商ID,0001是PID,表示产品ID。
126134231102是Mac地址,因为是小端序,所以Mac地址是:02 :11 :23 :34 :61 :12
蓝牙工具显示如下图:
通用协议描述了关于WIFI和BLE的所有指令,MCU可以使用这些指令去控制模块,实现需要的功能和配置。
指令的格式如下:
Byte |
Value |
Description |
0 |
0xA6 |
包头 |
1 |
|
Payload长度(最大16byte) |
2~n |
|
Payload |
n+1 |
SUM(1~n) |
(1~n)校验和 |
n+2 |
0x6A |
包尾(注:n+2不能超过20) |
包头和包尾是固定的,分别为0xA6,和0x6A。
检验和是指byte1 + byte2 + … +byte n 的和,取低位1 byte。
整个指令,数据大小的不能超过20Byte。
这类指令是设置模块的通用功能的,无论WIFI还是BLE都需要使用到这类指令。
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x0E |
Type:读取模块软硬件版本号 |
Payload |
3 |
0x0F |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x0A |
Payload长度 |
|
2 |
0x0E |
Type:回复模块软硬件版本号 |
Payload |
3 |
|
产品型号。byte3 、byte4 为ASCII字符,byte5为数字。 |
|
4 |
|
||
5 |
|
||
6 |
|
硬件版本号 H |
|
7 |
|
软件版本号 S |
|
8 |
|
定制版本号 P |
|
9 |
|
年 实际年份=年+2000 例如:2019年 年=2019-2000=19 |
|
10 |
|
月 1~12 |
|
11 |
|
日 1~31 |
|
12 |
Sum(1~11) |
校验和 |
|
13 |
0x6A |
包尾 |
举例:如软硬件版本号为 WM06H1S1.0P0_20190507
解析:WM05为产品型号,对应实际实际数据为0x57 0x4D 0x06
H1为硬件版本号 1,对应实际数据为 0x01
S1.0 为软件版本号 1.0 ,对应实际数据为:0x0A(带1位小数点)
P0 为定制版本号,对应实际数据为 0
年:2019-2000=19,对应实际数据 0x13
返回:A6 0A 0E 57 4D 06 01 0A 00 13 05 07 EC 6A
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
|
Payload长度 |
|
2 |
0x1D |
Type:设置ID |
Payload |
3 |
|
ID标志位 [Bit0] 0:不设置CID(CID值清0);1:设置CID [Bit1] 0:不设置VID(VID值清0);1:设置 VID [Bit2] 0:不设置PID(PID值清0);1:设置PID |
|
4 |
|
CID:产品类型ID的高字节 |
|
5 |
|
CID:产品类型ID的低字节 |
|
6 |
|
VID:厂商ID的高字节 |
|
7 |
|
VID:厂商ID的低字节 |
|
8 |
|
PID:产品ID的高字节 |
|
9 |
|
PID:产品ID的低字节 |
|
10 |
Sum(1~9) |
校验和 |
|
11 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
Len |
Payload长度 |
|
2 |
0x1D |
Type:回复设置ID结果 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
举例:设置模块CID为BLEWIF体脂秤
发送:A6 08 1D 07 00 11 00 00 00 00 3D 6A
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x1E |
Type:获取ID设置值 |
Payload |
3 |
0x1F |
校验和 |
|
4 |
0x6A |
包尾 |
响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
Len |
Payload长度 |
|
2 |
0x1E |
Type:返回ID值 |
Payload |
3 |
|
ID标志位 [Bit0] 0:不设置CID(CID值清0);1:设置CID [Bit1] 0:不设置VID(VID值清0);1:设置 VID [Bit2] 0:不设置PID(PID值清0);1:设置PID |
|
4 |
|
CID:产品类型ID的高字节 |
|
5 |
|
CID:产品类型ID的低字节 |
|
6 |
|
VID:厂商ID的高字节 |
|
7 |
|
VID:厂商ID的低字节 |
|
8 |
|
PID:产品ID的高字节 |
|
9 |
|
PID:产品ID的低字节 |
|
10 |
Sum(1~9) |
校验和 |
|
11 |
0x6A |
包尾 |
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x21 |
Type:设置模块重启 |
Payload |
3 |
0x01 |
Value:0x01 |
|
4 |
Sum |
校验和 |
|
5 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
Len |
Payload长度 |
|
2 |
0x21 |
Type:回复设置模块重启结果 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x22 |
Type:设置恢复出厂设置 |
Payload |
3 |
0x01 |
Value:0x01 |
|
4 |
0x25 |
校验和 |
|
5 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x22 |
Type:回复设置模块重启结果 |
Payload |
3 |
|
结果值: 0x00:成功(成功后,100ms后恢复出厂设置) 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x26 |
Type:获取状态 |
Payload |
3 |
0x27 |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x03 |
Payload长度 |
|
2 |
0x26 |
Type:返回模块状态 |
Payload |
3 |
|
模块状态: bit0-bit3表示BLE状态: 0:无连接 1:已连接 2:配对完成 Bit4-bit7表示wifi状态: 0:没连接AP; 1:连接AP失败,连接时密码错误、AP信号不好、主动断开都会是这个状态; 2:连接的AP信号不好; 3:成功连接上AP; 4:正在连接AP; |
|
4 |
|
工作状态: 0:唤醒 1:进入休眠 2:模块准备就绪 |
|
5 |
Sum(1~4) |
校验和 |
|
6 |
0x6A |
包尾 |
当BLE、WIFI、功耗模式改变时,模块都会通过获取模块状态的响应包格式主动进行上报状态变化。
接收到这类指令,模块需要将其参数值保存起来,供以后查询。这类值对模块没有意义,但是对使用模块进行透传的双方有意义,模块在这起到公共内存的作用。
接收到这类指令,模块需要将其参数值保存起来,供以后查询。这类值对模块没有意义,但是对使用模块进行透传的双方有意义,模块在这起到公共内存的作用。
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x03 |
Payload长度 |
|
2 |
0x27 |
Type:设置MCU电池状态 |
Payload |
3 |
|
电池充电状态: 0x00:没有充电(默认) 0x01:充电中 0x02:充满电 0x03:充电异常 |
|
4 |
|
电池电量百分比 (0—100) |
|
5 |
Sum(1~4) |
校验和 |
|
6 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x27 |
Type:回复MCU设置电池结果 |
Payload |
3 |
|
结果值: 0x00:成功(成功后会把电池电量上传到APP) 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
举例:设置电池正在充电,电量为1
发送:A6 03 27 01 01 2C 6A
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x28 |
Type:获取MCU电池状态 |
Payload |
3 |
0x29 |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x03 |
Payload长度 |
|
2 |
0x28 |
Type:返回MCU电池状态 |
Payload |
3 |
|
电池充电状态: 0x00:没有充电(默认) 0x01:充电中 0x02:充满电 0x03:充电异常 |
|
4 |
|
电池电量百分比 (0—100) MCU没有数据上传时,默认为0xFF |
|
5 |
Sum(1~4) |
校验和 |
|
6 |
0x6A |
包尾 |
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x07 |
Payload长度 |
|
2 |
0x0F |
Type:MCU设置MCU软硬件版本号 |
Payload |
3 |
|
MCU类型:由厂家自己定义,可以不定义 |
|
4 |
|
硬件版本号 |
|
5 |
|
软件版本号 |
|
6 |
|
年 实际年份=年+2000 例如:2019年 年=2019-2000=19 |
|
7 |
|
月 1~12 |
|
8 |
|
日 1~31 |
|
9 |
Sum(1~8) |
校验和 |
|
10 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x0F |
Type:回复设置MCU软硬件版本号结果 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
举例:设置MCU版本号,硬件版本0x01,软件版本0x02,2003年,4月,6日。
发送:A6 07 0F 01 02 03 04 05 06 2B 6A
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x10 |
Type:获取MCU软硬件版本号 |
Payload |
3 |
0x11 |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x07 |
Payload长度 |
|
2 |
0x10 |
Type:返回MCU软硬件版本号 |
Payload |
3 |
|
MCU类型:由厂家自己定义 |
|
4 |
|
硬件版本号 |
|
5 |
|
软件版本号 |
|
6 |
|
年 实际年份=年+2000 例如:2019年 年=2019-2000=19 |
|
7 |
|
月 1~12 |
|
8 |
|
日 1~31 |
|
9 |
Sum(1~8) |
校验和 |
|
10 |
0x6A |
包尾 |
通过这类指令对BLE进行设置和查询。
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
Len |
Payload长度(最大16byte) |
|
2 |
0x01 |
Type:设置蓝牙名称 |
Payload |
3 ~ n |
Name |
名称(需要对应ASCII表) |
|
n+1 |
Num |
MAC字符个数:名称后面跟随的MAC字符的个数 0x00:代表没有,则是固定蓝牙名称。 0x01:代表后面带有mac地址的1个字符,例如: Swan_x。 0x02:代表后面带有mac地址的2个字符,例如: Swan_xx。 默认 Num=4;Num最大为12 注:Name长度+“_”+Num 最大为15 |
|
n + 2 |
Sum(1~n) |
校验和 |
|
N+3 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x01 |
Type:回复设置蓝牙名称结果 |
Payload |
3 |
|
结果值: 0x00:成功(立即生效) 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
设置蓝牙名称可以设置为固定字符作为蓝牙名称,例如设置为swan,所有的模块都会显示为swan。同时也可以设置为固定蓝牙名称+“_”+ Mac 地址的方式,这样子有利于每个模块的名称都有差异。
举例 : 蓝牙的MAC地址为 12 : 34 : 56 : 78 : 9A : BC。
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x02 |
Type:获取蓝牙名称 |
Payload |
3 |
0x03 |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
Len |
Payload长度(最大16 byte) |
|
2 |
0x02 |
Type:回复蓝牙名称 |
Payload |
3 ~ n |
Name |
蓝牙名称(最长15 byte) |
|
n + 1 |
Sum(1~n) |
校验和 |
|
n +2 |
0x6A |
包尾 |
举例:蓝牙名称为swan_BC
发送查询指令:A6 01 02 03 6A
BM返回名称:A6 08 02 73 77 61 6E 5F 42 43 A7 6A
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x0D |
Type:读取MAC地址值 |
Payload |
3 |
0x0E |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x07 |
Payload长度 |
|
2 |
0x0D |
Type:回复MAC地址值 |
Payload |
3 ~ 8 |
|
Mac地址值(6byte、小端序) |
|
9 |
Sum(1~8) |
校验和 |
|
10 |
0x6A |
包尾 |
举例:MAC 地址为11 :22 :33 :44 :55 :66
返回:A6 07 0D 66 55 44 33 22 11 79 6A
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
|
Payload长度 |
|
2 |
0x25 |
Type:设置蓝牙连接状态 |
Payload |
3 |
|
主动断开连接标志位 0x01:立刻断开连接 0x00:不断开连接 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x25 |
Type:回复设置蓝牙连接状态结果 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
如果开启此功能,陌生设备第一次BLE连接模块,需要请求授权,否则10S内,连接将会断开。
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度(最大16byte) |
|
2 |
0x7d |
Type:设置授权使能、取消绑定 |
Payload |
3 |
|
Value: 0:取消授权 1:使能授权 |
|
4 |
Sum |
(1~n)校验和 |
|
5 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x7d |
Type:回复设置授权 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x7E |
Type:获取BLE授权 |
Payload |
3 |
0x7F |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x12 |
Type:返回BLE授权 |
Payload |
3 |
|
Value: 0:取消授权 1:使能授权 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
通过这类指令对WIFI进行设置和查询。
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x88 |
Type:设置wifi状态 |
Payload |
3 |
|
0x00:断开连接 0x01:发起连接 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x88 |
Type:回复设置wifi状态结果 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块每次联网,会自动查看是否有最新固件,有则进行升级,默认是关闭。
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x98 |
Type:设置自动OTA |
Payload |
3 |
|
Value: 0x00:关闭 (默认) 0x01:开启 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x98 |
Type:回复设置自动OTA结果 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块接收:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x01 |
Payload长度 |
|
2 |
0x99 |
Type:获取自动OTA设置值 |
Payload |
3 |
0x9A |
校验和 |
|
4 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x12 |
Type:返回自动OTA设置值 |
Payload |
3 |
|
Value: 0x00:关闭 (默认) 0x01:开启 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
模块上报/响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x91 |
Type:响应OTA结果 |
Payload |
3 |
|
结果值: 0x00:wifiOTA成功 0x01:wifiOTA失败 0x02:不支持wifiOTA 0x03:模块主动开始wifiOTA(MCU收到该指令后不能断电,需要等待OTA成功或者失败) |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
OTA成功后,模块就进行复位。
这里将介绍AiLink电动牙刷的专用指令。WiFiBle电动牙刷产品类型CID为0x0012。
Byte |
Value |
Description |
|
0 |
0xA7 |
包头 |
|
1 |
0x00 |
WiFiBle电动牙刷产品类型(CID)高字节 |
|
2 |
0x12 |
WiFiBle电动牙刷产品类型(CID)低字节 |
|
3 |
|
Payload长度 |
|
4 |
|
二级指令 |
Payload |
5~n |
|
体脂秤数据 |
|
n+1 |
SUM(1~n) |
(1~n)校验和 |
|
n+2 |
0x7A |
包尾(注:n+2不能超过20) |
档位 |
APP显示中文名称 |
APP显示英文名字 |
0x00 |
停止电机 |
Stop |
0x01 |
清洁 |
Clean |
0x02 |
美白 |
White |
0x03 |
按摩 |
Massage |
0x04 |
敏感 |
Senstitive |
0x05 |
抛光 |
Polish |
0x06 |
牙龈护理 |
Gum Care |
0x07 |
漱口 |
Refresh |
0x08 |
保健 |
Mascare |
0x09 |
新手 |
Mascare |
0x0A |
舒柔 |
Soft |
0x0B |
轻柔 |
Soft |
0x0C |
呵护 |
Soft |
... |
... |
... |
0xFF |
手动设置 |
Custom |
牙刷第一次上电应该设置牙刷支持的档位,利用上了Type =0x35的A6指令,把档位存在模块的flash中,供MCU/APP查询。
刷牙模式很多,可以把档位分为一级和二级,如果不支持二级,设置个数为0即可。通常一级档位就是牙刷可以使用指示灯表示的常用档位,二级档位是提供给APP设置的档位,一个牙刷最多支持12种档位。
MCU设置:
Byte |
Value |
Description |
|
1 |
0xA6 |
包头 |
|
2 |
0x10 |
Payload 长度 |
|
3 |
0x35 |
Type:MCU上传设备的基本信息 |
Payload |
4 |
0x01 |
0x01:数据有效 |
|
5 |
|
一级档位个数 |
|
6 |
|
二级档位个数 |
|
7-18 |
|
支持的档位编码(前面为一级档位,后见为二级档位,其余位为0x00) |
|
19 |
Sum(1~17) |
校验和 |
|
20 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
0 |
0xA6 |
包头 |
|
1 |
0x02 |
Payload长度 |
|
2 |
0x35 |
Type:回复上传设备的基本信息结果 |
Payload |
3 |
|
结果值: 0x00:成功 0x01:失败 0x02:不支持 |
|
4 |
Sum(1~3) |
校验和 |
|
5 |
0x6A |
包尾 |
例如:牙刷一级档位有0x01 0x03 0x05,二级档位有0x02 0x07,应设置:
A6 10 35 01 03 02 01 03 05 02 07 00 00 00 00 00 00 00 5D 6A
例如:牙刷一级档位有0x01 0x03 0x05 0xFF,无二级档位,应设置:
A6 10 35 01 03 00 01 03 05 FF 00 00 00 00 00 00 00 00 51 6A
该指令供MCU或者APP查询牙刷支持的档位,利用上了Type =0x36的A6指令,档位存在模块的flash中。
MCU/APP获取:
Byte |
Value |
Description |
|
1 |
0xA6 |
包头 |
|
2 |
0x02 |
Payload长度 |
|
3 |
0x36 |
Type:读取设备的基本信息指令 |
Payload |
4 |
0x01 |
Value:0x01 |
|
5 |
0x39 |
校验和 |
|
6 |
0x6A |
包尾 |
模块响应:
Byte |
Value |
Description |
|
1 |
0xA6 |
包头 |
|
2 |
0x10 |
Payload 长度 |
|
3 |
0x36 |
Type:MCU上传设备的基本信息 |
Payload |
4 |
0x01 |
0x00:数据无效 0x01:数据有效 |
|
5 |
|
一级档位个数 |
|
6 |
|
二级档位个数 |
|
7-18 |
|
支持的档位编码(前面为一级档位,后见为二级档位,其余位为0x00) |
|
19 |
Sum(1~17) |
校验和 |
|
20 |
0x6A |
包尾 |
例如:
查询档位:
A6 02 36 01 39 6A
一级档位有0x01 0x03 0x05,二级档位有0x02 0x07,则响应:
A6 10 36 01 03 02 01 03 05 02 07 00 00 00 00 00 00 00 5E 6A
APP会下发此指令设置牙刷的默认刷牙时长和工作档位,MCU需要保持此两项数据。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
|
Payload长度 |
|
5 |
0x02 |
Type:二级指令 |
Payload |
6 |
|
刷牙时长高字节,单位S, 工作时长0x0000:表示不修改工作时长,保留之前值 |
|
7 |
|
刷牙时长低字节,单位S, 工作时长0x0000:表示不修改工作时长,保留之前值 |
|
8 |
|
档位: 0x00:表示不修改工作档位,保留之前值 0x01-0xfe:工作档位编号 0xFF:手动设置档位 |
|
9 |
|
属于档位级别: 0x00:不支持级别 0x01:一级档位 0x02:二级档位 |
|
10 |
SUM |
校验和 |
|
11 |
0x7A |
包尾 |
MCU回复:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0x02 |
Type:二级指令 |
Payload |
6 |
|
结果: 0:设置成功 1:设置失败 2:不支持设置 |
|
7 |
SUM |
校验和 |
|
8 |
0x7A |
包尾 |
例如:
APP 设置默认刷牙时长 2 分钟,默认档位 0x03,应设置:
A7 00 12 05 02 00 78 03 01 95 7A
APP 设置默认刷牙时长 2 分钟,默认档位保持原先的档位,应设置:
A7 00 12 05 02 00 78 00 01 92 7A
APP 设置默认刷牙时长保持原先值,默认档位 0x03,应设置:
A7 00 12 05 02 00 00 03 01 1D 7A
APP连接设备会下发此指令查询牙刷的默认刷牙时长和工作档位。
如果刷牙时长或工作档位因其他原因发生改变,那么需要使用回复包进行上报。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x01 |
Payload长度 |
|
5 |
0x03 |
Type:二级指令 |
Payload |
6 |
0x16 |
校验和 |
|
7 |
0x7A |
包尾 |
MCU回复/上报:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
|
Payload长度 |
|
5 |
0x03 |
Type:二级指令 |
Payload |
6 |
|
刷牙时长高字节,单位S 工作时长0x0000:表示不支持工作时长 |
|
7 |
|
刷牙时长低字节,单位S 工作时长0x0000:表示不支持工作时长 |
|
8 |
|
档位: 0x01-0xfe:工作档位编号 0xFF:手动设置档位 |
|
9 |
|
属于档位级别: 0x00:不支持级别 0x01:一级档位 0x02:二级档位 |
|
10 |
SUM |
校验和 |
|
11 |
0x7A |
包尾 |
例如:
APP查询默认刷牙时长和工作档位:
A7 00 12 01 03 16 7A
例如,默认刷牙2分钟,默认档位是0x03,回复:
A7 00 12 05 03 00 78 03 01 96 7A
通常用于APP试用各种档位,APP会下发此指令,牙刷如果支持,应该改变相应配置。此指令的参数MCU无需保持。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
|
Payload长度 |
|
5 |
0x06 |
Type:二级指令 |
Payload |
6 |
|
模式: 0x00:关闭电机 0x01-0xfe:牙刷的模式编码 0xFF:手动设置档位 |
|
7 |
|
属于档位级别: 0x00:不支持级别 0x01:一级档位 0x02:二级档位 |
|
8 |
|
工作阶段,不支持填0xFF |
|
9 |
|
模式不是手动设置档位0xff:此btye为保留位 模式是手动设置档位0xff:频率高字节,单位Hz |
|
10 |
|
模式不是手动设置档位0xff:此btye为保留位 模式是手动设置档位0xff:频率低字节,单位Hz |
|
11 |
|
模式不是手动设置档位0xff:此btye为保留位 模式是手动设置档位0xff:占空比 |
|
12~18 |
|
保留位 |
|
19 |
SUM |
校验和 |
|
20 |
0x7A |
包尾 |
MCU回复:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0x06 |
Type:二级指令 |
Payload |
6 |
|
结果: 0:设置成功 1:设置失败,原因未知 2:不支持设置 3:设置失败,电池电压不足 4:设置失败,正在充电 5:设置失败,正在工作 |
|
7 |
SUM |
校验和 |
|
8 |
0x7A |
包尾 |
例如:
APP设置当前工作档位0x01:
A7 00 12 0E 06 01 01 FF 00 00 00 00 00 00 00 00 00 00 27 7A
APP设置当前工作档位0xFF,200HZ,50%占空比:
A7 00 12 0E 06 FF 02 FF 00 C8 32 00 00 00 00 00 00 00 20 7A
正常情况下APP不下发此指令的查询,只在产品开发阶段APP会查询MCU的状态。
如果牙刷当前工作档位或者工作阶段发生改变,那么一定要进行上报。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x01 |
Payload长度 |
|
5 |
0x07 |
Type:二级指令 |
Payload |
6 |
0x1A |
校验和 |
|
7 |
0x7A |
包尾 |
MCU回复/上报:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
|
Payload长度 |
|
5 |
0x07 |
Type:二级指令 |
Payload |
6 |
|
模式: 0x00:关闭电机 0x01-0xfe:牙刷的模式编码(洁白模式、敏感模式等等) 0xFF:手动设置档位 |
|
7 |
|
属于档位级别: 0x00:不支持级别 0x01:一级档位 0x02:二级档位 |
|
8 |
|
工作阶段,不支持填0xFF |
|
9 |
SUM |
校验和 |
|
10 |
0x7A |
包尾 |
例如:
MCU启动刷牙档位0x01,主动上报:
A7 00 12 04 07 01 01 01 20 7A
刷牙过程中,牙刷进入阶段2,阶段3,阶段4:
A7 00 12 04 07 01 01 02 21 7A
A7 00 12 04 07 01 01 03 22 7A
A7 00 12 04 07 01 01 04 23 7A
通常APP会下发此指令设置手动设置档位的参数,MCU需要保持这些参数。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x07 |
Payload长度 |
|
5 |
0x09 |
Type:二级指令 |
Payload |
6 |
|
保留位:0x00 |
|
7 |
|
频率高字节HZ |
|
8 |
|
频率低字节HZ |
|
9 |
|
占空比 |
|
10 |
|
时间高字节 |
|
11 |
|
时间低字节 |
|
12 |
SUM |
校验和 |
|
13 |
0x7A |
包尾 |
MCU回复:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0x09 |
Type:二级指令 |
Payload |
6 |
|
结果: 0:设置成功 1:设置失败 2:不支持设置 |
|
7 |
SUM |
校验和 |
|
8 |
0x7A |
包尾 |
例如:
APP设置手动设置(自定义)档位,200HZ,50%占空比,时间2分钟:
A7 00 12 07 09 00 00 C8 32 00 78 94 7A
假设MCU接受配置:
A7 00 12 02 09 00 1D A7
通常APP会下发此指令查询手动设置档位的参数。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x01 |
Payload长度 |
|
5 |
0x0A |
Type:二级指令 |
Payload |
6 |
|
校验和 |
|
7 |
0x7A |
包尾 |
MCU回复/上报:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x07 |
Payload长度 |
|
5 |
0x0A |
Type:二级指令 |
Payload |
6 |
|
保留位:0x00 |
|
7 |
|
频率高字节HZ |
|
8 |
|
频率低字节HZ |
|
9 |
|
占空比 |
|
10 |
|
时间高字节 |
|
11 |
|
时间低字节 |
|
12 |
SUM |
校验和 |
|
13 |
0x7A |
包尾 |
例如:
APP查询手动设置(自定义)档位:
A7 00 12 01 0A 1D 7A
例如,200HZ,50%占空比,时间2分钟:
A7 00 12 07 0A 00 00 C8 32 00 78 95 7A
收到该指令,牙刷应该运用当前工作档位,或者停止当前档位(相当于牙刷的按键)。牙刷档位改变后,需要使用“上报当前工作档位和工作阶段”进行上报。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x01 |
Payload长度 |
|
5 |
0x0B |
Type:二级指令 |
Payload |
6 |
|
校验和 |
|
7 |
0x7A |
包尾 |
MCU回复:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0x0B |
Type:二级指令 |
Payload |
6 |
|
结果: 0:设置成功 1:设置失败,原因未知 2:不支持设置 3:设置失败,电池电压不足 4:设置失败,正在充电 |
|
7 |
SUM |
校验和 |
|
8 |
0x7A |
包尾 |
通常APP会下发此指令设置二级档位的默认值,MCU需要保持这些参数。
如果牙刷支持二级档位,则进行相应回复,否则回复不支持即可。二级档位默认值是指二级档位对应的工作档位。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0x0C |
Type:二级指令 |
Payload |
6 |
|
档位: 0x01-0xfe:工作档位编号 0xFF:手动设置档位 |
|
7 |
SUM |
校验和 |
|
8 |
0x7A |
包尾 |
MCU回复:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0x0C |
Type:二级指令 |
Payload |
6 |
|
结果: 0:设置成功 1:设置失败 2:不支持设置 |
|
7 |
SUM |
校验和 |
|
8 |
0x7A |
包尾 |
例如:
APP设置二级档位默认值0x07:
A7 00 12 02 0C 07 27 7A
假设MCU接受配置:
A7 00 12 02 0C 00 20 A7
通常APP会下发此指令获取二级档位的默认值。
如果牙刷支持二级档位,则进行相应回复,否则回复不支持即可。
APP下发:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x01 |
Payload长度 |
|
5 |
0x0D |
Type:二级指令 |
Payload |
6 |
0x20 |
校验和 |
|
7 |
0x7A |
包尾 |
MCU回复/上报:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0x0D |
Type:二级指令 |
Payload |
6 |
|
档位: 0x00:不支持 0x01-0xfe:工作档位编号 0xFF:手动设置档位 |
|
7 |
SUM |
校验和 |
|
8 |
0x7A |
包尾 |
例如:
APP查询二级档位默认值:
A7 00 12 01 0D 20 7A
例如,二级档位默认是0x07或者不支持,回复:
A7 00 12 02 0D 07 28 7A / A7 00 12 02 0D 00 21 7A
刷牙停止后,模块会向APP或者服务器上报刷牙结果。上报完成后,MCU收到这条指令,表示牙刷结果上报完成。
下发给MCU:
Byte |
Default |
Description |
|
1 |
0xA7 |
包头 |
|
2-3 |
0x0012 |
产品类型:一级指令,表示牙刷 |
|
4 |
0x02 |
Payload长度 |
|
5 |
0xFE |
Type:二级指令 |
Payload |
6 |
|
Value: 0:上报结果失败 1:上报结果成功 |
|
7 |
0x13 |
校验和 |
|
8 |
0x7A |
包尾 |
MCU打开模块电源或者拉高EN脚,模块串口输出:
A6 03 26 00 02 2B 6A
表示wifible未连接,模块处于就绪状态;
MCU设置CIDPIDVID,将模块设置为WiFiBle电动牙刷模式,第一次使用模块时候设置一次即可,掉电保存:
A6 08 1D 07 00 12 00 03 00 01 42 6A
WM05回复设置成功:
A6 02 1D 00 1F 6A
MCU设置支持档位,一级档位有0x01 0x03 0x05,二级档位有0x02 0x07,第一次使用模块时候设置一次即可,掉电保存:
A6 10 35 01 03 02 01 03 05 02 07 00 00 00 00 00 00 00 5D 6A
WM05回复设置成功:
A6 02 35 00 37 6A
期间如果APP成功连接模块,模块会通知MCU当前状态:
A6 03 26 01 02 2C 6A
表示wifi未连接,ble已连接,模块处于就绪状态;
期间如果MCU收到请求授权,表示有陌生BLE连接设备:
A6 07 7F 01 02 03 04 05 06 9B 6A
如果MCU同意连接(牙刷按键按下)则回复授权成功:
A6 02 7F 03 84 6A
如果模块10S没有得到回复,BLE将会断开;
期间如果APP给模块配置WiFi,模块成功连接WiFi后,模块会通知MCU当前状态:
A6 03 26 31 02 5C 6A
表示wifi已连接,ble已连接,模块处于就绪状态;
期间如果MCU收到:
A6 02 91 03 96 6A
表示模块模块正在进行OTA升级,MCU不能切断模块电源,需要进行等待,如果在网络环境差的情况下,MCU可以控制时间,如果时间太久没有收到OTA结果,可以切断模块电源。
升级成功MCU会收到:A6 02 91 00 93 6A,升级成功后模块将会进行复位;
升级失败MCU会收到:A6 02 91 01 94 6A。
牙刷与APP连接后,也许并没有刷牙,而是进行一些查询和设置,这些指令都是根据用户操作APP而进行查询和设置的。
APP查询电池电量,
A6 01 28 29 6A
例如,MCU正在充电,电量50%,回复,
A6 03 28 01 32 5E 6A
APP查询默认刷牙时长和工作档位,
A7 00 12 01 03 16 7A
例如,默认刷牙2分钟,默认档位是0x03,回复,
A7 00 12 05 03 00 78 03 01 96 7A
APP查询手动设置(自定义)档位,
A7 00 12 01 0A 1D 7A
例如,200HZ,50%占空比,时间2分钟,
A7 00 12 07 0A 00 00 C8 32 00 78 95 7A
APP查询二级档位默认值,
A7 00 12 01 0D 20 7A
例如,二级档位默认是0x07或者不支持,回复,
A7 00 12 02 0D 07 28 7A / A7 00 12 02 0D 00 21 7A
APP设置默认刷牙时长2分钟,默认档位0x03,
A7 00 12 05 02 00 78 03 01 95 7A
假设MCU接受这配置,
A7 00 12 02 02 00 20 7A
APP设置默认工作档位0x03,
A7 00 12 05 02 00 00 03 01 1D 7A
假设MCU接受这配置,
A7 00 12 02 02 00 20 7A
APP试用工作档位0x01,
A7 00 12 0E 06 01 01 FF 00 00 00 00 00 00 00 00 00 00 27 7A
假设MCU接受配置或者电池电量不足,
A7 00 12 02 06 00 1A 7A / A7 00 12 02 06 03 1D 7A
APP试用配置,200HZ,50%占空比,
A7 00 12 0E 06 FF 02 FF 00 C8 32 00 00 00 00 00 00 00 20 7A
假设MCU接受配置或者未知原因不能运行
A7 00 12 02 06 00 1A 7A / A7 00 12 02 06 01 1B 7A
APP设置手动设置(自定义)档位,200HZ,50%占空比,时间2分钟,
A7 00 12 07 09 00 00 C8 32 00 78 94 7A
假设MCU接受配置,
A7 00 12 02 09 00 1D A7
APP启动/关闭牙刷,
A7 00 12 01 0B 1E 7A
此时牙刷是停止状态,收到后,先回复,
A7 00 12 02 0B 00 1F 7A
启动默认档位,再回复,
A7 00 12 04 07 01 01 01 20 7A
APP设置二级档位默认值0x07,
A7 00 12 02 0C 07 27 7A
假设MCU接受配置,
A7 00 12 02 0C 00 20 A7
MCU主动设置电池电量,如果使用过程中电池状态发生变化,需要实时设置电池电量:
A6 03 27 00 64 94 6A
表示没有充电,电池电量100;
模块回复设置成功:
A6 02 27 00 29 6A
MCU启动刷牙档位0x01,主动上报:
A7 00 12 04 07 01 01 01 20 7A
刷牙过程中,牙刷进入阶段2,阶段3,阶段4:
A7 00 12 04 07 01 01 02 21 7A
A7 00 12 04 07 01 01 03 22 7A
A7 00 12 04 07 01 01 04 23 7A
开始刷牙,刷牙完毕后,MCU切换到刷牙模式0(关闭电机):
A7 00 12 04 07 00 01 FF 1D 7A
模块开始整理刷牙的数据,进行上报,上报成功后回复:
A7 00 12 02 FE 01 13 7A
MCU收到上报结果或者等待结果超时(例如10秒)或者BLE和WIFI不处于连接状态,MCU即可关闭WM05电源或者拉低EN脚。
Copyright © 2020 深圳市易连物联网有限公司 All rights reserved.