2. 低功耗蓝牙核心概念:BLE协议栈架构

各位同学,今天我们来聊聊BLE协议栈的骨架。说白了,就是蓝牙芯片内部那套软件和硬件怎么分工协作的。我刚开始接触BLE时,也被这堆分层搞得头晕,后来亲手调过几个项目,才慢慢摸清门道。

2.1 协议栈三层架构:Controller、Host、Application

BLE协议栈分三层,这个划分不是随便定的,而是有历史渊源的。早期蓝牙规范里,大家发现把射频控制和上层应用逻辑混在一起,代码维护简直是噩梦。所以后来干脆一刀切,分成三个独立模块。

  • Controller(控制器):负责最底层的射频收发、链路管理。通常跑在独立的MCU或硬件模块上。
  • Host(主机):负责逻辑链路控制、安全管理、属性协议等。这部分一般跑在主处理器上。
  • Application(应用层):你的业务逻辑,比如读取传感器数据、控制LED灯。

我个人习惯把Controller想象成「快递员」,Host是「分拣中心」,Application就是「收件人」。快递员只管把包裹送到分拣中心,分拣中心拆包分类,最后送到你手上。各司其职,互不干扰。

关键点:Controller和Host之间通过HCI(Host Controller Interface)通信。这个接口可以是UART、SPI或者USB。我在项目中遇到过HCI通信丢包的问题,排查了整整两天,最后发现是UART波特率不匹配。嗯,这种低级错误,犯过一次就长记性了。

2.2 物理层(PHY)与射频基础

物理层,说白了就是天线怎么把0和1变成电磁波发出去。BLE工作在2.4GHz ISM频段,这个频段大家都能用,Wi-Fi、Zigbee、微波炉都挤在这里。所以抗干扰设计特别重要。

BLE的物理层有几个关键参数:

参数 说明
工作频段 2.400 - 2.4835 GHz 40个信道,每个2MHz宽
调制方式 GFSK 高斯频移键控,简单可靠
数据速率 1 Mbps / 2 Mbps BLE 4.x用1M,5.x支持2M
发射功率 -20 dBm 到 +10 dBm 典型值0 dBm,约1mW

你想想看,为什么BLE要用GFSK而不是更复杂的QPSK?因为BLE追求的是低功耗,GFSK解调电路简单,省电。我记得有一次做低功耗门锁项目,为了省那0.5mA的电流,愣是把发射功率从0 dBm降到了-6 dBm,结果通信距离从30米缩到了8米。后来还是老老实实调回0 dBm,功耗和距离总要有个平衡。

避坑指南:我曾经在射频匹配电路上吃过亏。PCB走线没按50欧姆阻抗控制,结果天线效率直接掉了40%。所以做BLE硬件时,射频走线一定要算好阻抗,别偷懒。

2.3 链路层(LL)状态机

链路层是BLE协议栈里最核心的部分,它管理着设备之间的连接状态。说白了,就是设备什么时候该听、什么时候该说、什么时候该睡觉。

BLE链路层有5种状态:

  1. Standby(待机):啥也不干,最省电的状态。
  2. Advertising(广播):设备在广播信道上发小广告,告诉别人「我在这儿」。
  3. Scanning(扫描):设备在广播信道上监听,看看有没有小广告。
  4. Initiating(发起连接):扫描到广告后,主动发起连接请求。
  5. Connection(连接):双方建立连接,可以双向通信了。

这5个状态之间的切换,就是链路层状态机。我画了一张图,帮你理清它们的关系:

Standby 待机 Advertising 广播 Scanning 扫描 Initiating 发起连接 Connection 连接 启动广播 启动扫描 发起连接 收到连接请求 收到广播 连接成功 断开连接 实线:状态切换方向 虚线:返回待机 每个状态都可直接回到Standby

这张图我画了好一会儿,你仔细看看。每个状态都可以直接回到Standby,这是BLE省电的关键设计。比如广播设备发完广告包,如果没有收到连接请求,就立刻回到Standby睡觉,等下一个广播间隔再醒来。

连接状态里,设备分两种角色:Master(主设备)和Slave(从设备)。主设备负责决定什么时候收发数据,从设备只能乖乖听话。这种设计叫「主从架构」,好处是从设备可以精确知道自己什么时候该醒来,其他时间都在睡觉,省电。

注意:链路层状态机是BLE协议栈里最容易出bug的地方。我曾经在项目中遇到设备连上后频繁断连,查了三天,最后发现是广播间隔和扫描窗口没匹配好。主设备扫描窗口太短,漏掉了从设备的广播包,导致连接超时。这种问题用逻辑分析仪抓一下空中包,一眼就能看出来。

2.4 链路层的关键机制

链路层除了状态机,还有几个重要机制,我简单提一下:

  • 跳频(Adaptive Frequency Hopping):BLE在40个信道里跳来跳去,避免干扰。每次连接事件换一个信道。
  • 连接事件(Connection Event):主从设备约定好时间点,定期交换数据。每次交换就是一个连接事件。
  • 重传机制:数据包丢了怎么办?链路层会自动重传,最多重传4次。

跳频这个设计很有意思。你想想看,如果Wi-Fi占用了信道6,BLE就自动避开它,跳到其他干净的信道。我做过一个测试,在Wi-Fi干扰严重的环境下,不开跳频的BLE设备丢包率高达30%,开了之后降到1%以下。所以,千万别关跳频。

小技巧:调试链路层问题时,我习惯用BLE sniffer抓空中包。Nordic的nRF Sniffer配合Wireshark,能看到每个连接事件的细节,包括重传次数、RSSI变化。这比看代码日志直观多了。

好了,这一章的内容就这些。协议栈架构、物理层、链路层状态机,这三个概念是BLE的基石。下一章我们会深入GAP和GATT,那是你写应用层代码时天天要打交道的玩意儿。


公众号:蓝海资料掘金营,微信deep3321