BLE(Bluetooth Low Energy,蓝牙低功耗)是一种无线技术标准,旨在提供低功耗和低延迟的无线通信。它是蓝牙技术的一种变体,特别适用于对电池寿命和功耗有严格要求的应用。
BLE 的特点
- 低功耗:BLE 设备在待机状态下消耗极少的电量,适合长时间运行的设备。
- 短距离通信:典型的通信范围为 10 米至 100 米,具体取决于环境和设备。
- 快速连接:BLE 设备能够快速连接和断开,适合需要快速响应的应用。
- 多设备连接:支持多个设备同时连接,适合物联网(IoT)场景。
协议栈
BLE 蓝牙协议栈是蓝牙设备之间通信的基础架构。它定义了数据的传输方式、设备的发现机制、连接过程以及应用层的服务交互。蓝牙协议栈通常分为多个层级,每个层次实现不同的功能,确保设备之间的可靠通信。以下是BLE协议栈的一个大致分层架构:
物理层(Physical Layer, PHY)
物理层是BLE协议栈的最低层,定义了如何通过无线电波传输数据。BLE使用的频段为2.4 GHz ISM(工业、科学和医学)频段,具体划分为40个通道(其中3个是用于广告数据的)。每个通道的带宽为1 MHz,传输速度最高为1 Mbps。
- 传输模式:基于频率跳跃的扩频技术(FHSS),避免干扰。
- 信号编码:采用GFSK(Gaussian Frequency Shift Keying)调制技术,支持较低的功耗。
链路层(Link Layer)
链路层负责数据包的格式、信道管理、设备发现、连接建立和连接维持等任务。它处理BLE设备之间的基础通信,负责信号的发送、接收和处理低层数据。
- 设备发现:BLE设备会广播自己的存在,其他设备可以扫描这些广告包来发现目标设备。
- 连接管理:链路层还负责连接的建立、断开、连接参数的协商和维护。
- 分包与重传:链路层实现了数据包的分割和重传机制,确保数据的完整传输。
控制器层(Controller Layer)
控制器层通常包括物理层和链路层,它负责所有与硬件直接交互的功能。在一些高端应用中,控制器层可能是单独的硬件模块,负责处理BLE信号的传输和接收。控制器层和主机层通过HCI(Host Controller Interface)进行通信。
主机层(Host Layer)
主机层位于协议栈的上方,负责处理高层应用和管理设备的连接、服务发现、数据传输等任务。主机层实现了以下几个关键协议:
GAP(Generic Access Profile):负责设备间的发现、连接管理以及角色定义。GAP协议定义了设备如何通过广播进行自我公开、如何扫描并建立连接,以及如何处理设备的连接和断开。它是BLE协议栈中管理设备访问行为的关键协议,确保设备能够在蓝牙网络中进行有效的通信。
L2CAP(Logical Link Control and Adaptation Protocol):提供数据分段、组装和传输的功能,允许多个应用层协议共享底层链路。
ATT(Attribute Protocol):用于设备间的属性数据交换。ATT定义了如何存取蓝牙设备的各种数据(例如,传感器数据),通过服务和特性进行访问。
GATT(Generic Attribute Profile):基于ATT协议之上的高层协议,定义了BLE设备之间数据交互的标准化方式。GATT使用“服务”和“特性”模型,设备通过特性(characteristic)交换数据。
应用层(Application Layer)
应用层是BLE协议栈的最高层,负责根据特定的应用需求处理业务逻辑。开发者可以在这一层设计BLE通信的具体行为,如控制设备、传输数据或处理用户输入等。应用层主要通过GATT协议进行操作,可以定义特定的服务和特性。例如:
- 心率监测器服务(Heart Rate Service)
- 电池服务(Battery Service)
- 自定义服务(例如,温度传感器)
此外,应用层也可以使用以下协议进行更高级的功能:
- SM(Security Manager):用于加密和认证设备间的通信,确保数据的安全性。
- L2CAP:提供面向连接的传输服务。
- 安全管理层(Security Manager, SM)
安全管理层负责对设备进行配对、身份验证和加密。BLE设备可以通过配对建立加密连接,以确保数据在传输过程中的机密性和完整性。常见的安全机制包括:
- 身份验证:通过PIN码、键盘、显示器或其他方式进行身份认证。
- 加密:采用AES加密算法保证数据的安全。
- 隐私:BLE设备支持地址隐私,以避免设备被追踪。
在蓝牙通信过程中,GAP(Generic Access Profile)和GATT(Generic Attribute Profile)是两个核心协议。
- GAP:管理设备的广播、扫描、连接建立和断开,决定设备的通信角色(中心、外围、广播者、观察者)。它是所有蓝牙连接的基础。
- GATT:依赖GAP协议建立的连接,负责数据的标准化交互。它基于ATT协议,提供数据读取、写入等功能,使用“服务”和“特性”的模型进行数据传输。
这张图很好地展示了两者的关系:
- GAP 位于较高的逻辑层,主要处理设备发现、连接和访问角色管理。它依赖于下层协议(如L2CAP)来完成数据传输的支持。
- GATT 基于 ATT 协议,用于具体的数据交互。它在 GAP 建立的连接基础上工作,服务于应用数据的传输。
GAP 协议
GAP(Generic Access Profile)是蓝牙低功耗(BLE)协议栈的一部分,属于主机层(Host Layer)。它定义了设备如何发现彼此、如何连接、如何广播信息以及如何设置通信角色。
主要特点:
GAP 协议定义了 BLE 设备的四种角色,角色的选择决定了设备在通信中的行为。
设备角色:GAP定义了设备在BLE通信中的角色,包括:
广播设备(Advertiser):发送广播包以进行设备发现。
扫描设备(Scanner):监听并响应广播包,发现其他设备。
主设备(Central):发起连接的设备(通常是手机或主控制器)。
从设备(Peripheral):被连接的设备(如传感器、穿戴设备)。
设备发现:GAP定义了设备如何通过广播和扫描发现其他设备。设备可以处于可发现模式或不可发现模式。
连接管理:GAP负责建立、管理和终止连接。它处理连接间隔、超时和其他连接参数。
应用场景:
GAP 广泛应用于各种 BLE 设备之间的发现和连接过程,确保设备能够有效地找到并连接到彼此。
GATT 协议
GATT(Generic Attribute Profile)位于蓝牙低功耗(BLE)协议栈中的主机层(Host Layer),位于ATT(Attribute Protocol)之上。
它定义了设备之间如何交换数据和互动的规则,并使用“服务”和“特性”这种方式来规范通信,让不同设备可以按照统一的标准进行数据传输和操作。
主要特点:
服务和特性:GATT基于服务和特性构建,服务是一组相关的特性。每个服务和特性都有唯一的UUID标识符。
数据模型:GATT使用层次结构的数据模型,设备通过服务和特性与其他设备进行交互。
数据传输方式:GATT支持读取、写入、通知和指示等操作:
读取(Read):客户端可以请求服务器读取特性值。
写入(Write):客户端可以向服务器写入特性值。
通知(Notify):服务器可以主动向客户端发送特性值的变化。
指示(Indicate):服务器向客户端发送特性值的变化,并等待客户端的确认。
应用场景:
GATT通常用于传感器、健康设备、智能家居设备等场景,如心率监测器、温度传感器等。这些设备通过GATT服务和特性与其他BLE设备(如手机应用)进行数据交换。
总结🙃🙃🙃
- GAP:负责设备发现和连接管理,定义设备的角色和连接过程。
- GATT:负责设备之间的数据交换和数据组织,通过服务和特性来定义如何读取、写入和通知数据。
这两个协议相辅相成,构成了蓝牙低功耗通信的基础,使得不同设备能够高效地进行数据交换和管理。
广播数据包格式
在 BLE 中,GAP 协议通过广播数据包的形式与其他设备进行交互。广播数据包的主要作用是:
- 设备发现:向周围设备提供设备的身份信息(如设备名称、UUID 等),使其他设备能够快速发现并识别蓝牙设备。
- 服务信息传递:传输设备支持的服务类型和功能。
- 连接准备:当其他设备响应广播并发起连接请求后,可建立 BLE 连接。
广播数据包的有效负载(Payload)最大为 37 字节,其中 31 字节 可供开发者使用。这 31 字节被分为一个或多个 AD Structure(广播数据结构),每个 AD Structure 包含以下部分:
- 长度字段(Length):1 字节,表示该结构的总长度。
- 类型字段(Type):1 字节,定义数据的类型(如设备名称、服务 UUID、设备类别等)。
- 值字段(Value):可变长度,包含具体的数据内容。
广播数据包不直接发起连接请求,而是通过提供设备信息,等待中心设备(Scanner)发起连接请求。一旦中心设备响应广播包并发起连接请求,双方可以建立 BLE 连接。
值得注意的是,设备地址(6 字节)用于标识设备,但不占用广播数据包的 31 字节有效负载空间。通过合理设计广播数据内容,可以实现快速设备发现和低功耗的连接准备。
每个AD Structure包含3部分内容,分别是:
- Length(1字节): 广播数据包的长度
- AD Type(1字节): 广播的类型
- AD Data(n字节): 数据
常见的广播类型如下
假设我此时有如下一组广播数据:
1 | // 假设这是一组广播数据 |
注意:
在设置广播的设备外观时候,要采用低位先行的方式,比如我们要设备外观为键盘,键盘对应的数据位 0x03C1,那么我们在广播数据中填写的值就要是 03 19 C1 03(这里要采用低位先行的策略)
其他的设备外观数据我们可以在蓝牙官方的已分配编号表中进行查找