1. BLE 协议栈初探:分层架构与核心模型
BLE 协议栈,说白了就是一套让蓝牙设备能互相说话的规则。我刚开始接触时也觉得这东西挺抽象,一堆分层、一堆术语。但后来发现,只要抓住几个关键点,整个协议栈的脉络就清晰了。
咱们先从整体架构看起。
1.1 三层架构:Controller、Host、Application
BLE 协议栈从上到下分成三层:Application(应用层)、Host(主机层)、Controller(控制器层)。这三层各司其职,有点像公司里的前台、行政和老板。
- Application:你写的业务逻辑。比如智能灯泡的开关、温湿度传感器的上报。
- Host:负责数据怎么组织、怎么传输。包括 GAP、GATT、L2CAP、SM 等模块。
- Controller:负责物理收发。包括物理层(PHY)、链路层(LL)、HCI 接口。
为什么这么分?我个人的理解是:解耦。你写应用代码时不用管射频怎么调,芯片厂商做射频时也不用管你的业务逻辑。各层之间通过标准接口通信,比如 Host 和 Controller 之间通过 HCI(Host Controller Interface)交换数据。
关键点:实际开发中,大部分芯片会把 Host 和 Controller 集成在一个 SoC 里,但概念上它们仍然是独立的。调试时如果遇到连接不稳定,我习惯先确认是 Controller 的射频问题,还是 Host 的协议处理问题。
1.2 物理层与链路层基础
物理层(PHY)是 BLE 的最底层,负责在 2.4GHz ISM 频段上发送和接收无线信号。BLE 使用 40 个信道,其中 3 个是广播信道(37/38/39),37 个是数据信道。
我记得第一次做 BLE 产品时,遇到一个奇怪的问题:设备在实验室里好好的,一到客户现场就断连。排查了半天,发现是现场有 Wi-Fi 干扰。后来我学乖了,设计时一定留出信道切换的余量。
| 参数 | BLE 4.0/4.2 | BLE 5.0 | BLE 5.1+ |
|---|---|---|---|
| 物理层速率 | 1 Mbps | 1 Mbps / 2 Mbps | 1 Mbps / 2 Mbps |
| 广播信道数 | 3 | 3 | 3 |
| 数据信道数 | 37 | 37 | 37 |
| 最大发射功率 | 10 dBm | 10 dBm | 10 dBm |
链路层(Link Layer)是 Controller 的核心。它负责:
- 状态机管理:Standby、Advertising、Scanning、Initiating、Connection 五种状态。
- 数据包封装:前导码、访问地址、PDU、CRC。
- 重传与确认:每个数据包都需要 ACK,否则重传。
- 跳频:每 1.25ms 或 1.875ms 切换一次信道,抗干扰。
避坑指南:我曾经在调试时发现设备连接后频繁掉线,抓空包一看,链路层的重传次数超过了阈值。原因是射频环境太差,但链路层没有自适应调整。后来我手动降低了发射功率,反而稳定了——因为功率太高导致接收端饱和。
1.3 GAP 与 GATT 角色模型
GAP(Generic Access Profile)和 GATT(Generic Attribute Profile)是 BLE 应用层最核心的两个概念。很多人容易搞混,我简单说说它们的区别。
GAP 负责设备的发现和连接。它定义了四种角色:
- Broadcaster:只发广播,不连接。比如信标。
- Observer:只扫描广播,不连接。比如扫描仪。
- Peripheral:从设备,发广播,等待连接。比如手环。
- Central:主设备,扫描并发起连接。比如手机。
GATT 负责连接后的数据交互。它定义了两种角色:
- Server:提供数据的一方。比如传感器设备。
- Client:读取/写入数据的一方。比如手机 App。
你想想看,一个设备可以同时是 GAP Peripheral 和 GATT Server,比如智能手环。也可以同时是 GAP Central 和 GATT Client,比如手机。
注意:GAP 角色和 GATT 角色是独立的。一个设备可以是 GAP Peripheral + GATT Client,比如手环从手机读取配置。这种组合在实际项目中很常见,但初学者容易默认 Peripheral 就是 Server。
1.4 协议栈分层架构图
下面这张图是我自己整理的 BLE 协议栈分层结构,包含了各层的主要模块和它们之间的接口。画图时我特意把 GAP 和 GATT 放在 Host 层,因为它们确实属于 Host 的范畴。
1.5 实际开发中的角色选择
做项目时,第一步就是确定你的设备是什么角色。我见过不少团队,产品定义都没想清楚就开始写代码,结果后面改来改去。
举个例子:
- 如果你做的是智能灯泡,它应该是 GAP Peripheral + GATT Server。手机是 Central + Client。
- 如果你做的是蓝牙网关,它可能是 GAP Central + GATT Client,同时扫描多个传感器并读取数据。
- 如果你做的是防丢器,它可以是 GAP Broadcaster,只发广播,不连接。
我的经验:选择角色时,要考虑功耗和连接数。Peripheral 通常比 Central 省电,因为 Central 需要持续扫描。如果设备需要同时连接多个从设备,那它必须是 Central,但功耗会高不少。
1.6 本章小结
这一章我们走了一遍 BLE 协议栈的骨架。从三层架构到物理层、链路层,再到 GAP 和 GATT 的角色模型。说白了,就是搞清楚:谁在发广播?谁在连接?连接后怎么交换数据?
我个人觉得,理解分层架构最大的好处是:出了问题知道该查哪一层。连接不上查 GAP,数据读不到查 GATT,断连查链路层。有了这个框架,后面优化性能才有方向。