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 的范畴。

BLE 协议栈分层架构图 BLE 协议栈分层架构 Application(应用层) 用户业务逻辑:智能灯、传感器、手环等 Host(主机层) GAP GATT L2CAP SM ATT HCI(主机控制器接口) Controller(控制器层) 链路层(Link Layer) 状态机 / 重传 / 跳频 物理层(PHY) 2.4GHz / 40 信道 说明:实际芯片可能将 Host 和 Controller 集成,但概念分层不变 GAP 负责发现与连接,GATT 负责连接后的数据交互

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,断连查链路层。有了这个框架,后面优化性能才有方向。