一、概述
1、缘起
低功耗蓝牙起源于Bluetooth4.0版本,至今已发展到5.3
4.0 bluetooth low enerngy 这个阶段低功耗蓝牙的基础框架已经稳定成型,后面版本主要退出新特性和扩展特性,同时保证和4.0的原生兼容性
4.1 multi role(主从一体),自动回连
4.2 data length extend,le secure connections pair ecdh密钥交换,(legacy pair)
5.0 2M phy,codeed phy(long range),扩展广播(31——>255)
5.1 增加方位和角度(用于定位,厘米级),比如apple tag
5.2 增加ble audio,
5.3 定期广播增加,加密密钥大小控制增加,亚速率连接(更快的更新连接参数),信道分类增强(从设备翻身做主,可对主机发出的信道策略提出更正)
二、架构
1、H-C设计(分层分工设计)
1.1、soc
soc设计是嵌入式开发中较为常见的开发设计方式,即controller和host在一颗芯片中搞定,典型如nordic,ti cc2640 2541,esp32等等
1.2、双芯片
双芯片就是host和controller分别放在一颗芯片中设计
2、controller
负责链路层及其以下的部分
链路层: 链路层定义了两个设备如何利用无线电传输信息,包含了报文、广播、数据通道的详细定义,也规定了发现其他设备的流程、广播的数据、连接建立、连接管理以及连接中的数据传输。
phy层: 物理层,底层基带信号调制(理解为二进制信号流即可)
看着事少,确是一切的基石
3、host
l2cap: 逻辑链路控制和适配器
ATT: 属性协议(蓝牙服务中的最小原子单位,可理解为军队中具体的一个士兵)
GATT: 属性协议配置规范
SM: 安全管理
GAP: 通用访问规范
应用层: 这是开发者大展拳脚的地方
4、hci
全称是host controller interface
VHCI:soc设计中典型方式(可理解为massage queue)
UART: H4,H5(不带流控,SLIP分包)
USB
SPI
SDIO
…
5、总体层次图
三、连接
1、广播与扫描
广播通道
1.1、广播事件
1.2、广播类型
可连接非定向广播(最常用)
可连接定向广播
不可连接非定向广播
不可连接可扫描广播
1.3、广播包数据结构
广播包有两种(广播包,广播响应包)
两种包数据结构相同,最大长度31(5.0->255),数据采用LTV格式来组织
L:length 1byre
T:type 1byre
V:value length-1byre
1.4、扫描
扫描分两种类型
主动扫描和被动扫描
2、连接
当扫描设备扫描到自己感兴趣的广播设备,即可再广播通道的广播事件锚点发出连接申请(connection indication),双方即可各种进入连接状态,准备交互数据
连接申请中包含的内容很丰富,挑几样来说
①初始连接参数
②通道选择算法和通道图(用于沟通初始通道和后续跳频)
③双方mac地址
④crc初始值
⑤传输窗口等等
3、状态转换关系
4、连接事件及连接参数
最小连接间隔
最大连接间隔
slave latency
super timeout
四、数据通讯
1、数据包格式
是不是感觉和自己定的串口通讯协议很像,前导码类似于AA55这种用来表示蓝牙数据包起始
以前感觉串口前面加的AA55这种很土,现在觉得很亲切很自然,因为连续的0101是最理想数字编码数据,连续多bit0和连续多bit1是最差的(容易误码)
蓝牙实际的抓包,空中包也确实是这个样子的
2、attribute
attribute table 中的最小单位,组成包括
attribute handle
attribute type(uuid)
attribute value
attribute permissions
实例
3、character
特征,几个attribute组成一个character,可以理解为一个attribute小组,小组中往往只有一个attribute是起数据通讯只用,其它attribure基本是对改主要attribute的辅助
4、service
服务,几个character组成一个service,可以理解为一个attribute部门,该部门持有几个character共同提供某一服务,不如A501,A502,A503,A508等共同组成我们公司的A5服务
5、profile
规范(规则),1个或者几个服务组成一个profile,可以理解为一个attribute 事业部,几个不同的子部门共同来支持这个事业部,比如穿戴事业部由系统部,应用部等等组成
6、profile示意图
7、数据发送方式
角色:server or client
注意:设备可以即是client又是server,典型的比如我们的手表或者苹果手机,苹果手机在作为client访问我们手表server数据的同时,它又同时作为server为我们提供了ams,ancs等服务(手表作为client)
上行:一般指server往client发数据
下发:一般指client往server发数据
上行数据方法
notify:无确认包,但保证交付
indicate:保证交互,且又明确的确认包
注意client想后续收到server的notify和indication,必须要先打开对应的配置(使能)
下发数据方法
write with rsp:保证交付,且有明确的结果返回
write without rsp:保证交互,没有明确的结果返回(正确对应ATT_WRITE_REQ,错误对应ATT_ERROR_RSP)
截取一些错误码,完整错误码请参考 core spec
8、提高数据发送速率及其原理
1、改变连接参数
连接参数来源,主机,主机,还是主机(扫描广播,并发起连接的设备)影响方法
①初始connection 包
②gap profile中的Peripheral Preferred Connection Parameters characteristic
③主机主动下发改变通知(有可能中途随机下发,450ota曾因此引发ota变慢的bug)
④从设备主动申请update,等待主机执行(从机也就只能吹吹枕边风,主机有可能直接拒绝(典型霸道如ios手机,需要满足公式,可参考苹果开发者手册),或者欣然接受,随后通过上面的方法3来具体下发生效的值)
从机申请更新连接参数,实例抓包
2、改变mtu和dle(两者配合)
dle <= 251
mtu <= 512
建议mtu <= (dle - 4)
3、使用2M phy(大于等于5.0版本)
传输速度直接翻倍
秘诀是啥?改变波特率(参考串口通讯,把9600改成115200)
1M phy(强制):1bit长度1us
2M phy(可选):1bit长度0.5us
4、问题来了,这些参数综合起来究竟如何影响数据传输速度?
连接间隔一定是越小越快?
mtu越大越好?
为啥实际数据传输速率达不到官方号称的1M or 2M?
五、ellisys抓包实战
1、准备硬件
硬件包括ellisys,待测设备(蓝牙主机,从机),电源插电,usb线插电脑
2、开启抓包
点击界面record开启盲抓(ellisys很强大)
3、开启过滤