一、概述
1、缘起
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 增加方位和角度(用于定位,cm级),如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.数据包格式
感觉和自己设置的串口通信协议很像吗?前导码类似AA用来表示蓝牙数据包的开始
以前感觉串口前加的。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
规范(规则)由一个或多个服务组成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、开启过滤