2、BLE基础(一):BLE协议栈架构、物理层与链路层、广播与扫描机制

各位同学,咱们今天正式进入BLE的世界。说实话,BLE协议栈刚接触时确实有点绕,但别怕,我带你一层层剥开它。

2.1 BLE协议栈整体架构

BLE协议栈分三层:Controller、Host、Application。这三层分工明确,各管一摊。

  • Controller:负责射频收发、链路控制、物理层、链路层。说白了,就是管“怎么发出去、怎么收回来”。
  • Host:负责逻辑链路控制、属性协议、安全管理、通用访问规范等。它管的是“发什么内容、怎么组织数据”。
  • Application:你的业务逻辑。比如智能灯泡的开关、手环的心率显示。

我刚开始做BLE项目时,总把Controller和Host混在一起调,结果出了问题根本分不清是射频没发出去,还是协议栈内部处理错了。后来养成习惯:先确认Controller层能正常收发,再往上查Host层。这个顺序,能省你一半的调试时间。

核心要点:Controller和Host之间通过HCI(Host Controller Interface)通信。HCI就是一条“命令通道”,Host发指令给Controller,Controller回事件给Host。很多开发板把这两层做在一个芯片里,但概念上必须分开理解。

下面这张图,是我画的一个简化版协议栈架构,你一看就明白。

BLE协议栈三层架构 BLE协议栈三层架构 Application 业务逻辑、用户数据 Host GAP、GATT、ATT、SM、L2CAP 数据组织、安全、服务发现 Controller LL、PHY、RF 射频收发、链路控制 HCI接口位于Host与Controller之间,是调试的关键分界线

2.2 物理层(PHY)

物理层是BLE最底层的硬件。它决定了信号怎么在空中飞。

  • 频段:2.4GHz ISM频段,和WiFi、Zigbee共用。所以干扰是家常便饭。
  • 信道:40个信道,每个2MHz带宽。其中3个是广播信道(37/38/39),37个是数据信道。
  • 调制方式:GFSK(高斯频移键控)。简单说就是通过频率偏移来传0和1。
  • 速率:BLE 4.x/5.0是1Mbps,BLE 5.0还支持2Mbps和125kbps/500kbps(长距离模式)。

我的经验:在干扰严重的环境里,比如工厂或商场,我建议优先用1Mbps模式。2Mbps虽然快,但接收灵敏度会下降3-4dB,距离短一截。长距离模式(125kbps)能多穿一堵墙,但延迟也上去了。选哪个,看你项目最在乎什么。

2.3 链路层(LL)

链路层是Controller的核心。它管着设备之间的连接建立、数据收发、重传、加密等。说白了,链路层就是BLE的“交通警察”。

链路层定义了五种状态:

状态 说明 典型场景
Standby 空闲,不收发 设备刚上电
Advertising 广播数据包 信标、可发现设备
Scanning 监听广播包 手机扫描周围设备
Initiating 主动发起连接 手机点击“配对”
Connection 已建立连接 数据传输中

链路层还有一个重要概念:连接事件。连接建立后,主设备和从设备在约定的时间点交换数据包,这个时间点就叫连接事件。主设备会在每个连接事件开始时发送一个数据包,从设备收到后回复。如果没收到,链路层会自动重传。

注意:连接间隔(Connection Interval)不能设得太小。我见过有人设成7.5ms,结果两个设备靠太近时射频互相干扰,重传率飙升,功耗反而更大。一般建议20-50ms,兼顾实时性和功耗。

2.4 广播与扫描机制

广播和扫描是BLE设备互相发现的基础。没有广播,设备就是“隐形”的。

2.4.1 广播(Advertising)

广播设备(Advertiser)在三个广播信道(37/38/39)上轮流发送广播包。每个广播包包含:

  • 前导码:1字节,用于接收端同步时钟。
  • 接入地址:4字节,固定为0x8E89BED6。
  • PDU:协议数据单元,包含广播数据和头部。
  • CRC:3字节,校验数据完整性。

广播类型分四种:

类型 含义 能否被扫描 能否被连接
可连接可扫描广播 最常用,手机能发现也能连接 是 是
可连接不可扫描广播 用于定向连接 否 是
不可连接可扫描广播 信标类设备,只发数据不连 是 否
不可连接不可扫描广播 极少用,纯单向通知 否 否

广播间隔也很关键。间隔越短,被发现越快,但功耗越高。我做过一个信标项目,客户要求电池撑一年,我把广播间隔设成500ms,配合低占空比模式,实测功耗降到了10μA以下。

2.4.2 扫描(Scanning)

扫描设备(Scanner)在三个广播信道上轮流监听。扫描分两种模式:

  • 被动扫描:只收不发。扫描设备收到广播包后,不回复任何东西。
  • 主动扫描:收到广播包后,发送扫描请求(SCAN_REQ),广播设备回复扫描响应(SCAN_RSP)。这样能拿到更多数据。

你想想看,手机扫描周围设备时,用的就是主动扫描。它先收到广播包,然后问一句“你还有什么信息?”,设备再回复一个扫描响应包,里面可能包含设备名称、服务UUID等。

避坑指南:我曾经在一个项目中,扫描设备一直收不到某些广播包。查了半天,发现是广播信道37(2402MHz)被WiFi的1信道(2412MHz)严重干扰。解决办法:把广播信道改成只使用38和39,或者调整WiFi信道。记住,2.4GHz频段不是你家开的,干扰无处不在。

2.5 广播与扫描的时序关系

广播和扫描不是同时进行的。广播设备在三个信道上轮流发,扫描设备也在三个信道上轮流听。它们之间靠时间错开和信道跳频来碰运气。

下面这张图展示了广播和扫描的典型时序:

广播与扫描时序图 广播与扫描时序示意 t 37 38 39 37 广播间隔(如100ms) 扫描窗口 扫描窗口 扫描间隔(如200ms) 扫描窗口越大,越容易抓到广播包,但功耗也越高。一般扫描窗口设为扫描间隔的50%左右。 广播间隔和扫描间隔的匹配,直接影响发现延迟。

从图上你能看到,广播设备每隔固定时间发一次广播包,扫描设备则周期性地打开接收窗口。如果广播包落在扫描窗口内,就能被收到。否则,就得等下一个周期。

我记得有一次做室内定位,要求设备被发现的时间不超过1秒。我把广播间隔设成50ms,扫描窗口设成30ms,扫描间隔100ms。实测下来,99%的情况下设备在0.8秒内就能被发现。但代价是功耗翻了一倍。嗯,这就是trade-off。

2.6 小结

这一章我们聊了BLE协议栈的三层架构、物理层的信道和调制方式、链路层的五种状态,以及广播和扫描的机制。这些都是BLE开发的基石。你把这些搞懂了,后面讲连接、数据传输、安全时,就不会觉得云里雾里。