智能手环蓝牙私有通信协议文档百度在线网络技术(北京)有限公司(版权所有,翻版必究)目录前言 (5)1名词解释与约定 (6)1.1名词解释 (6)1.1.1设备 (6)1.1.2手机 (6)1.2约定 (6)1.2.1协议栈字节序 (6)1.2.2 L2 层V-length注意项 (6)2协议结构介绍 (6)2.1协议栈结构图 (6)2.2 L0(UART Profile) (7)2.2.1模块图 (7)2.2.2协议层功能描述 (7)2.3 L1(Transport layer) (8)2.3.1协议层功能描述 (8)2.3.2协议层数据包结构 (8)2.3.3 L1版本号 (9)2.4 L2(Application layer) (9)2.4.1协议层数据包结构 (9)3 L2 command详解 (9)3.1 Command 列表 (9)3.2固件升级命令(command id 0x01) (10)3.2.1 L2 版本号 (10)3.2.2固件升级命令key列表 (10)3.2.3进入固件升级模式请求key (10)3.2.4进入固件升级模式返回key (10)3.3设置命令(command id 0x02) (11)3.3.1 L2 版本号 (11)3.3.2设置命令key列表 (11)3.3.3时间设置key (11)3.3.4闹钟设置key (12)3.3.5获取设备闹钟列表请求key (12)3.3.6获取设备闹钟列表返回key (12)3.3.7用户profile设置key (13)3.3.8防丢设置key (13)3.3.9计步目标设定 (13)3.3.10久坐提醒设置key (14)3.3.11左右手key (14)3.3.12 手机操作系统设置 (14)3.3.13 来电通知电话列表设置 (15)3.3.14 来电通知开关 (15)3.4绑定命令(command id 0x03) (15)3.4.2绑定命令key列表 (15)3.4.3绑定用户请求key (16)3.4.4绑定用户返回key (16)3.4.5用户登录请求key (16)3.4.6用户登录返回key (16)3.4.7用户解除绑定key (17)3.4.8超级绑定key (17)3.4.9超级绑定返回key (17)3.5提醒命令(command id 0x04) (17)3.5.1 L2 版本号 (17)3.5.2提醒命令key列表 (17)3.5.3来电提醒key (18)3.5.4来电已接听key (18)3.5.5来电已拒接key (18)3.6运动数据命令(command id 0x05) (18)3.6.1 L2 版本号: (18)3.6.2运动数据命令key列表 (18)3.6.3请求数据key (19)3.6.4运动数据返回key (19)3.6.5睡眠数据返回key (20)3.6.6 More flag key (20)3.6.7睡眠设定数据返回key (20)3.6.8数据实时同步设置key (21)3.6.9历史数据同步开始key (21)3.6.10历史数据同步结束key (21)3.6.11当天运动状态同步 (22)3.6.12最近一次运动状态同步 (22)3.6.13当天总运动数据校准 (22)3.6.14当天总运动数据校准返回 (22)3.7工厂测试命令(command id 0x06) (23)3.7.1 L2 版本号: (23)3.7.2工厂测试命令key列表 (23)3.7.3请求echo服务key (23)3.7.4 Echo服务返回key (24)3.7.5请求Charge信息key (24)3.7.6返回charge信息 (24)3.7.7点亮led请求key (24)3.7.8震动马达请求key (24)3.7.9 SN写请求key (25)3.7.10 SN读请求key (25)3.7.11 SN 返回key (25)3.7.12 test flag写请求key (25)3.7.13 test flag 读请求key (25)3.7.15请求sensor数据key (26)3.7.16返回sensor数据key (26)3.7.17进入测试模式,超级命令key (26)3.7.18退出测试模式,超级命令key (26)3.7.19按键测试key (27)3.7.20马达老化测试key (27)3.7.21 LED老化测试key (27)3.8控制命令(command id 0x07) (27)3.8.1 L2 版本号: (27)3.8.2控制命令key列表 (28)3.8.3拍照控制key (28)3.8.4单击控制key (28)3.8.5双击控制key (28)3.8.6相机应用状态请求key (28)3.9 Dump Stack命令(command id 0x08) (29)3.9.1 L2 版本号: (29)3.9.2Dump Stack命令key列表 (29)3.9.3请求手环assert位置信息key (29)3.9.4返回assert位置信息key (29)3.9.5返回assert位置信息key (29)3.9.6请求获取Assert时的栈信息key (30)3.9.7反馈assert栈信息key (30)3.10 测试flash读取命令(command id 0x09) (30)3.10.1 L2 版本号: (30)3.10.2测试flash读取命令key列表 (30)3.11 日志命令(command id 0x0a) (30)3.11.1 L2 版本号: (30)3.11.2日志命令key列表 (30)3.11.3打开日志功能key (31)3.11.4关闭日志功能key (31)3.11.5日志发送key (31)前言本文档定义了百度Dulife客户端与百度智能手环之间的通信协议,该协议描述了百度Dulife客户端是怎样与百度智能手环之间建立蓝牙连接、收发命令、以及进行数据同步的。
智能手环软件开发人员在进行手机与手环之间的通信联调时可能需要参考本文档,但开发人员不可在手环端软件里随意更改、增加或删减协议的功能,否则有可能会导致手环与手机客户端之间不兼容。
如有需求需要修改或删减协议功能,请联系百度相关负责人进行评估。
本文档最终解释权归百度在线网络技术(北京)有限公司。
1名词解释与约定1.1名词解释1.1.1设备指手环,手表,电子秤。
一般是蓝牙的master端。
1.1.2手机有BLE支持的智能手机,也有可能是指bluetooth usb dongle。
1.2约定1.2.1协议栈字节序在本文档覆盖的内容中,所有和字节序相关的都是用big-end(大端模式)。
比如一个uint16_t a = 0xABCD,那么传输的时候按照字节流从低到高的顺序为A,B,C,D。
同理,如果在字节流中的一个字节(1byte)包含了两个值a=0xa,b=0xb,每一个值占用4bit,字节流地位为a,高位为b。
那么字节流中这一个字节的内容应为(二进制表示):1010 1011。
1.2.2L2 层V-length注意项当某一个command下面的某一个key的value值为空时,v-length的值为0,v-length 同样占用传输字节流中的1个字节,而不应该使v-length为空。
2协议结构介绍2.1协议栈结构图2.2 L0(UART Profile)2.2.1模块图2.2.2协议层功能描述L0层在系统的蓝牙协议栈上实现,所以在mater 端和device 端实现方式不一样。
在device 端(master ),实现uart profile (UUID 为”6e400001-b5a3-f393-e0a9-e50e24dcca9e ”) 。
UART profile 包含了2个character ,一个为write character (UUID 为”6e400002-b5a3-f393-e0a9-e50e24dcca9e ”),另一个为read character L0 Phone(slave) device(master)Read Character Write Character Receiveinterface Writeinterface L0 Character operate Character operateno fy write Receive interfaceWrite interface(UUID 为6e400003-b5a3-f393-e0a9-e50e24dcca9e),read character 为notification模式。
在UART profile的基础上实现了write interface和receive interface。
在phone端(slave),实现了character operation, 并在operation的基础上实现了write interface和receive interface。
因为phone端的receive interface是基于notify mode实现,device 端的receive interface 是基于write character实现,所以receive interface是callback的方式实现,即数据的读取不是pull的方式,而是push的方式,所以命名为receive interface。
(而不是read interface)。
Receive interface和write interface的MTU为20 byte。
2.3 L1(Transport layer)2.3.1协议层功能描述L1传输层,在L0之上,实现了可靠的传输实现,包括数据的发送和接收。
因为L0 MTU 为20 byte,为了满足L2大数据包的发送需求,L1实现了504 byte的MTU,所以在L1实现了拆包,组包逻辑。
为了实现可靠的传输,L1在L0基础之上,实现L0 MTU的重传,如果重传几次失败后,L1会把失败结果报告给L2。
同时为了保证L1 MTU的可靠性传输,L1实现了acknowledge机制。
在L1 header 包含2 byte的sequence id。
Send 往receive发送packet,packet的L1 header 中ACK flag置为0,表示是data packet, sequence id 为当前packet的sequence 号。
当receive 收到这个packet 后,magic检查和CRC校验,如果出错,表示packet传输不正确,发送error ACK packet,如果正确,发送success ACK packet。