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。很多开发板把这两层做在一个芯片里,但概念上必须分开理解。
下面这张图,是我画的一个简化版协议栈架构,你一看就明白。
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 广播与扫描的时序关系
广播和扫描不是同时进行的。广播设备在三个信道上轮流发,扫描设备也在三个信道上轮流听。它们之间靠时间错开和信道跳频来碰运气。
下面这张图展示了广播和扫描的典型时序:
从图上你能看到,广播设备每隔固定时间发一次广播包,扫描设备则周期性地打开接收窗口。如果广播包落在扫描窗口内,就能被收到。否则,就得等下一个周期。
我记得有一次做室内定位,要求设备被发现的时间不超过1秒。我把广播间隔设成50ms,扫描窗口设成30ms,扫描间隔100ms。实测下来,99%的情况下设备在0.8秒内就能被发现。但代价是功耗翻了一倍。嗯,这就是trade-off。
2.6 小结
这一章我们聊了BLE协议栈的三层架构、物理层的信道和调制方式、链路层的五种状态,以及广播和扫描的机制。这些都是BLE开发的基石。你把这些搞懂了,后面讲连接、数据传输、安全时,就不会觉得云里雾里。