本文旨在说明根据BLE协议的相关知识,对应用,协议开发、功耗进行分析。了解清楚该文档,可以针对一些蓝牙应用开发问题和协议进行一定的定位排查。
图片有摘引,如有侵权,请联系删除。图片有私印,可以查找对应原文作者。
Written by: Zhai Xiufeng
目录
BLE即蓝牙低能耗(Bluetooth Low Energy)。本文将剖析BLE协议栈的结构,包括物理层、链路层、主从协议、GATT(Generic Attribute Profile)以及L2CAP(Logical Link Control and Adaptation Protocol)等关键组成部分。深入了解这些协议的交互过程有助于理解BLE在通信中的基本原理和解决应用、协议开发的问题。同步研究包括连接参数、广播机制、休眠模式以及硬件和软件层面的优化策略。介绍在实际应用中可以从哪些方面降低功耗,从而延长设备的电池寿命。
BLE协议栈的框架如下图所示:
PHY层(Physical layer物理层):
PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。
LL层(Link Layer链路层):
LL层是整个BLE协议栈的核心,执行一些基带协议,底层的数据包管理协议。
HCI(Host controller interface):
主机控制接口层,可以理解为蓝牙modem的射频的驱动。但是相对广泛,例如:如果蓝牙芯片内不包含协议栈,那么HCI就为通信协议(UART/SPI/IIC等)和蓝牙芯片与搭载协议栈芯片的数据解析交互接口的集合。
GAP层(Generic access profile):
GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
L2CAP(逻辑链路于适配器协议层):
L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
SMP(Secure manager protocol):
SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
ATT(Attribute protocol):
generic attribute profile(GATT)(属性协议层)
2.1 协议包问题排查
协议包问题排查需要抓包对协议进行比较分析,手机抓包工具推荐BLE调试助手。
2.1.1 广播包抓包
首先开启模组的广播,广播出一包蓝牙名字为:Lelouch的广播包0x08094C656C6F756368020A01。如下图。
数据包分析:
0x08094C656C6F756368020A01
08:广播数据长度,不包含08本身。最大是1e。(0x1e即30长度,加上1e字节,总共31字节,对应广播数据长度31字节。)
09:广播数据类型,09,表示广播中的名称
4C656C6F756368:十六进制字符串,ASCII码对应的是Lelouch
02:此为自定义类型,广播数据长度。
0A:此为自定义类型,广播数据类型,0A,广播射频发射功率。
01:此为自定义类型,射频发射功率。
2.1.2 协议帧抓包
协议帧抓包需要使用蓝牙适配器和Wireshark进行抓包,由于环境限制,此处不做详细说明。如果后续环境准备完成,在做补充。
简单的步骤是使用蓝牙DANGLE(硬件,需在淘宝购买),链接驱动和抓包软件。完成后就可以通过抓包软件解析出协议帧。
3. BLE状态迁徙协议详解
3.1 发起连接流程
该处流程有master发起,其中简化的连接过程如下。
主机连接是需要设定两个参数BLEADDR与地址类型。
Public Device Address:用来唯一识别一个物理设备,通常使用的是该地址。注意:有的设别支持修改该地址,所以修改时需要特别注意使用附近不可有相同的地址。
Static Device Address:设备在上电时随机生成的地址,下一次上电的时候可以改变。但不是强制的,因此也可以保持不变。如果改变,上次保存的连接等信息,将不再有效。
Private Device Address:通过定时更新和地址加密两种方法,提高蓝牙地址的可靠性和安全性。
3.2 广播与扫描
3.2.1 广播与扫描的流程
广播与扫描的流程如图,广播包即为上文的广播抓包的数据。下图以模组为slave手机作为master,扫描的模型如下。
Slave每次广播时,会在3个广播信道上发送相同的报文。这些报文被称为一个广播事件,如图中的蓝色小框。除了定向报文以外,模组每个广播事件均可以选择20 毫秒~40.96 秒不等的间隔。两个相邻广播事件之间的时间称为广播间隔。
Master扫描窗口为绿色框,扫描框会比较宽,为了缩短发现Slave的广播时间,会尽可能的增大扫描窗口期,和减小扫描的周期。
如图,其中Slave间歇性的不断的发送广播,Master开启扫描窗口,有且只有当扫描窗口和广播发送的窗口匹配成功,Master才可以接收到Slave的广播信号,并且当扫描周期与广播周期一致时,理论上是有可能无法扫描到设备的。
这种广播与扫描,就成了一个概率事件,Master可以很快扫描到Slave,比如只要一个广播事件,有事又很慢才可以扫到Slave,比如需要十几个广播事件。
3.2.2 白名单作用流程
白名单处理流程,Master在扫描窗口期,收到一包广播包,Master会发送一包scan req包,此时如果是白名单的设备,从机会回复一包scan response,否则不会回复。用该流程来避免非白名单的Master设备发现该从设备。scan response回复包是不带有目标的识别信息的,会被其他的设备误认。
具体的情况是:Master A为白名单设备,Master A和Master B设备同时收到从机的广播, Master A和Master B同时向从机发送扫描申请,从机接收到Master A设备的scan request包后,会回复scan response,由于scan response回复包是不带有目标的识别信息的,所以Master A和Master B设备都会在上层显示扫描到了该从机。
广播过滤策略:
0 不采取任何过滤措施,任何设备都可以对其扫描、连接
1 只允许白名单中的设备对其扫描,允许任何设备进行连接。
2 允许任意设备对其扫描,只允许白名单设备对其连接
3 只允许白名单中的设备对其扫描和连接
3.3 配对
3.3.1 配对流程
在建立连接后,可以通过配对来对连接进行加密连接。
配对需要Master设备发起,但是可以由Slave设备发送security request,来通知Master设备来发起配对。然后进行秘钥的交换,具体的加密方式,此处不做研究。
根据PIN码的确认方式,配对分为两种方式。
Passkey Entry:由有输入输出能力的设备输入PIN码
Numeric Comparison:由有输出和输入YES和NO能力的设备确定PIN码是否正确。
具体采取什么方式,可以根据设备的显示能力,确立配对方式,参照以下表格。
上述举例说明:设备A为主机配对能力为DISPLAYYESNO,设备B为从机主机配对能力为DISPLAYYESNO。此时master A发起配对流程,这时候两台设备都会显示一个PIN码,用户可以此时可以确认PIN码是否一致,如果一致,则需要Master A,Slave B两端都输入确定PIN码一致的确认。
需特别注意:配对时需要匹配相应的能力,蓝牙协议会根据能力选择相应的能力对PIN码进行确认。
固定PIN码:即在配对时使用固定的PIN码,来参与配对流程。
从机固定PIN码:固定Slave侧的PIN码,需 Slave侧设置成具备显示能力IO能力。
3.3.2LMP(Link Manager Protocol)协议
配对过程需要LMP(Link Manager Protocol)协议介入,该协议是管理蓝牙链路的协议。也就是管理蓝牙链接状态和对应状态的操作和异常处理,具体的作用分别是:
设备发现与识别:在连接建立之前,蓝牙设备需要发现周围的其他设备并识别它们。LMP协议通过设备发现机制,使得设备能够感知到彼此的存在。
连接请求与响应:主设备通过发送连接请求命令启动连接过程。连接请求中包含一些关键的参数,例如设备地址、通信参数等。从设备在收到连接请求后,通过发送连接响应命令响应连接请求。连接响应包含从设备同意连接的相关信息。
连接参数协商:LMP协议负责在连接建立阶段协商连接的参数,例如连接间隔、连接窗口、数据包类型等。这些参数决定了在连接期间的通信规则。
链路加密:LMP协议支持链路层的加密机制,通过在连接过程中协商加密密钥,确保数据在物理链路上传输时的安全性。
设备认证:LMP协议支持设备之间的认证机制,以确保连接的安全性。认证可以通过 PIN 码(Personal Identification Number)或其他方法进行。
连接管理:一旦连接建立,LMP协议负责在连接期间进行管理,包括监测链路状态、处理断开连接请求等。
3.4 GATT属性
下图为GATT协议的框图。
通用属性配置文件Generic Attribute Profile简称GATT。
GATT中定义了2种角色:服务器server和客户端client。
GATT的服务器是指提供数据的设备,而GATT的客户端是指通过GATT的服务器获取数据的设备。
ProfileProfile:
并不是实际存在于 BLE 外设上的,它只是一个预先定义的所有的 Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service。所有官方通过 GATT Profile 的列表可以从这里找到。
ServiceService:
是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。
Characteristic:
在 GATT 事务中的最低界别的是 Characteristic,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据。
Client Characteristic Configuration:
包含特征的客户配置(Client Characteristic Configuration)条目、特征的用户描述(Characteristic User Description)条目描述符是一个额外的属性以提供更多特性的信息,它提供一个人类可识别的特性描述的实例。具体可以参照BLUETOOTH SPECIFICATION Version 5.0 | Vol 3, Part G page 2236。
其中需特别注意2902的UUID,如下图。如果客户需要不主动读,就能得到一包明文数据,就需要对Characteristic添加该特征描述符。
3.5 L2CAP通道
3.5.1 L2CAP通道介绍和功能
L2CAP(Logical Link Control and Adaptation Protocol),位于蓝牙协议栈的传输层之上。它负责在蓝牙设备之间建立逻辑连接并提供适配层服务,以适应不同的应用层需求。主要功能包括数据的分段与重组(因资源限制,需要切割和组合适当的数据包大小)、流控制、QoS(Quality of Service)支持(低延迟/高吞吐量的实现,具体做法为修改数据分段与重组的大小,通过最小包/最大包,减少应用层待发包的构成和协议层延时,交换动态资源信息,来调整射频频率/发包频率来实现质量和低延时的功能)等。
3.5.2 L2CAP建立流程
L2CAP建立链接,实际可分为两种:
- BLE建立链接
- BLE建立L2CAP安全链接,
但是通常说建立L2CAP链接就是指建立L2CAP安全链接。
上面的介绍我们可以知道,L2CAP是位于蓝牙协议栈的传输层之上,所以想要建立L2CAP链接,需要先建立蓝牙的传输层;也就是需要先配对,配对的流程可以参考3.3章。
当配对完成,就可以开始建立L2CAP的通道。
建立L2CAP通道的流程相对比较简单,必须由主机发起建立,从机进行回复ACK就可以建立通道链接。
L2CAP Connection Request帧主要包含由最大传输单元 (MTU),源通道标识符(Source CID),标志位(Flags)、连接请求结果(Result)和连接请求状态(Status)等参数。特别注意与上层应用相关的是MTU,也就是建立链接前需要设定MTU的值。
3.5.3 L2CAP协议帧构成
通道建立之后就可以收发数据。了解收发数据需要先了解协议帧构成。下图是蓝牙协议Core_V5.3文档内描述的L2CAP的协议帧。但是需要注意该协议帧只是描述协议栈内部用于传递信息的基本数据单元,它并不直接对应于蓝牙射频传输中的射频信号数据。
以上内容是最小帧结构,其中Information payload能够拓展,还能包含PSM(Protocol/Service Multiplexer,标识上层协议或服务,结构如下:
L2CAP Header:
- Length:包括头部和数据的长度
- Channel Identifier:通道标识符
- PDU Type: PDU 类型
Data Field:
- Destination CID:目标通道标识符
- Source CID:源通道标识符
- PSM:标识上层协议或服务
- Length:数据字段的长度
- Serial Data:16进制的数据
3.5.3.1通道标识符
通道标识符的作用是区分通道的作用,通过该标识符,对链接和应用进行区分,常用的CID如下,详细描述查找BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 3, Part A PAGE1022。
CID (16进制) | 用途 |
0x0001 | L2CAP 信令通道(Signaling Channel) |
0x0002 | L2CAP 无连接数据通道(Connectionless Data Channel) |
0x0003 | AMP 管理协议通道(AMP Manager Protocol) |
0x0004 | SDP 通道(Service Discovery Protocol Channel) |
0x0040 - 0x007F | RFCOMM 通道(串口通信服务) |
其他值 | 取决于具体的协议和服务 |
3.5.3.2 PDU 类型
PDU 类型是用来指示数据帧的类型,也就是指示帧的动作类型。详细内容BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 3, Part B PAGE1189,例如:
0x01:Connect Request(连接请求)
0x02:Connect Response(连接响应)
0x03:Configure Request(配置请求)
0x04:Configure Response(配置响应)
0x05:Disconnection Request(断开连接请求)
0x06:Disconnection Response(断开连接响应)
0x07:Echo Request(回显请求)
0x08:Echo Response(回显响应)
0x09:Information Request(信息请求)
0x0A:Information Response(信息响应)
0x0B:Credit-based Flow Control(基于信用的流控制)
0x1F:Command Reject(命令拒绝)
3.5.3.3 Destination/Source CID
Destination/Source CID是用来表明CID的,这个是链接后自动分配的,有点类似于IP协议的中的Port。详细描述参考BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 3, Part A PAGE1023,协议详解中描述如下:
3.5.3.4 PSM
PSM的作用是指示L2CAP连接上正在使用的上层协议或服务。在L2CAP连接建立时,会通过PSM来标识所使用的服务类型。具体的PSM数值由蓝牙协议分配和维护,确保了在蓝牙通信中不同的上层服务可以通过不同的PSM进行标识,避免冲突和混淆。协议文档BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 3, Part A PAGE1044点开链接,蓝牙官网有详细描述。 典型的标识举例如下:
PSM (16进制) | 服务类型 |
0x0001 | SDP (Service Discovery Protocol) 服务 |
0x0003 | RFCOMM(串口通信服务) |
0x0005 | TCS-BIN(电话控制服务二进制) |
0x0011 | OBEX(对象交换协议) |
0x0013 | BIP(基础图像协议) |
0x0017 | HFP(蓝牙音频网关协议) |
0x0019 | AVCTP(音视频控制传输协议) |
0x001B | HID(人机界面设备) |
0x001D | PAN(个人局域网协议) |
0x0100-0xFFFF | 自定义或其他服务类型 |
3.6 蓝牙发起连接业务
初始化蓝牙芯片: 主要是包含蓝牙协议栈上电、配置设备,白名单使能的可见性等参数。
扫描附近的蓝牙设备: Master扫描附近的外围设备(Peripheral)。扫描时,设备可以获取附近可连接设备的信息。一般扫描设备是维护设备,资源更多。
选择目标设备: 查找到对应的Slave设备,也就是发出广播设备。
发起连接: 主设备发起连接请求流程。
参数协商:Master与Slave设备之间会进行连接参数的协商,包括连接间隔、超时等。这由 L2CAP 层进行管理。
数据交换(可选): 连接建立后,设备可以通过 L2CAP 协议在连接上进行数据交换。L2CAP 为上层协议(如 GATT、RFCOMM)提供了一个数据通道。
配对(可选): 设备进行安全配对,以确保通信的保密性和完整性。
发起配对后的 L2CAP 连接(可选): 在配对后,能够建立安全L2CAP连接。
加密数据交换(可选): 通过GATT或L2CAP进行安全数据交换。
4. 功耗详解
4.1 影响功耗因素
发射功率: 发射功率决定了蓝牙设备的信号强度。更高的发射功率通常意味着更大的覆盖范围,但同时也伴随着更高的功耗。
通信距离: BLE设备之间的通信距离影响功耗。较长的通信距离可能需要更高的发射功率,从而增加功耗。
连接间隔: BLE设备在连接期间的活动和空闲时间之间的间隔,即连接间隔,对功耗有影响。较长的连接间隔可以减少功耗,但可能会牺牲实时性。
广播间隔: 在广播模式下,设备以固定的间隔广播其存在。较短的广播间隔可能会提高实时性,但也会增加功耗。
连接事件: BLE连接期间,设备之间会发生连接事件,包括数据传输和空闲时间。连接事件的频率和持续时间直接影响功耗。
负载大小: 传输的数据负载大小对功耗有影响。较小的数据包通常会减少功耗,因为设备在传输期间可以更快地进入低功耗模式。
协议栈实现: 设备上运行的蓝牙协议栈的实现方式也可以影响功耗。一些优化的协议栈可以更有效地管理功耗。
低功耗模式: BLE设备通常具有不同的低功耗模式,如睡眠模式、待机模式等。有效利用这些模式可以降低功耗。
硬件设计: 设备的硬件设计也对功耗有重要影响。采用低功耗芯片、优化功耗电路和使用省电元件都是有效的措施。
环境条件: 周围环境的干扰、信号衰减等因素也可能影响设备的功耗。
4.2 优化功耗方向
在实际应用中,我们开发者注意的相关的因素和综合成本人力等成本考虑,选择最优的设计。1. 发射功率:根据距离/环境等因素,我们可以更改蓝牙的射频功率,来适配项目相关的功能。
2. 连接间隔:应用层优化,增加每次进行的数据吞吐量,以减小通信的次数。
3. 广播间隔:一般功耗敏感的设备,在不进行业务逻辑运行时,会进入到低功耗的状态,所以每次唤醒都希望能够尽快的连接配对进行数据交互。根据3.1章发起连接流程了解到,当广播间隔越小,发起配对的时间越快,所以可以适当的缩短广播时间,但广播间隔越快,功耗越高,这也意味着不能一味的缩短广播间隔。具体需要根据功耗曲线进行测试和调整。
4. 负载大小:减小吞吐的数据量也是一个不错的方式来节省功耗,比如对数据进行压缩或者建立用户自己的规约,来增加数据的信息载量。
5. 低功耗模式:减小蓝牙Modem的运行时间,也能降低较大的功耗,可以通过芯片控制,或者增加休眠断电的功能来达到降低功耗的目地。
以上都是可以优化的参考方向,这些方向主要是对上层应用和配置进行降低功耗。往下还可以通过协议层的流程来进行,如下:
- 流程集成:对协议栈流程进行集成,当设计产品时,可以将流程进行集成,比如预先配置白名单,MTU,读写能力等。然后直接发起连接,并直接达到最终需要使用的数据交互环境。比如最终业务需要L2CAP安全通信,那么可以直接在业务中集成发起连接,与配对流程,并且建立L2CAP安全通道。减小传输控制指令的等待和BLE处于非理想状态的时间。
- 协议栈优化:需要非常熟悉BLE协议。
参考资料
- Core_v5.3.pdf