1. BLE基础与协议栈架构

各位同学,咱们今天聊聊BLE的根儿。做蓝牙开发这么多年,我见过太多人一上来就撸代码,结果连广播包都抓不明白。万丈高楼平地起,协议栈的地基打不牢,后面多设备连接准得翻车。

1.1 BLE发展史:从蓝牙到低功耗

蓝牙技术最早是1994年爱立信搞出来的,名字取自哈拉尔蓝牙王——这位国王统一了丹麦和挪威,蓝牙的初衷也是统一通信标准。经典蓝牙(BR/EDR)从1.0走到3.0,速率越来越高,但功耗也一直是个老大难。

转折点在2010年。蓝牙4.0发布,BLE(Bluetooth Low Energy)正式登场。说白了,BLE就是为物联网场景量身定做的——不需要传大文件,不需要高带宽,但要能靠一颗纽扣电池跑几个月甚至几年。

我记得当年第一次接触BLE 4.0,芯片是TI的CC2540。那会儿资料少,踩坑踩得我头皮发麻。但回过头看,正是这些坑让我把协议栈吃透了。

BLE版本演进关键节点:

  • 4.0(2010):BLE首次出现,双模架构
  • 4.2(2014):LE Secure Connections、数据长度扩展
  • 5.0(2016):2Mbps、长距离、广播扩展
  • 5.1(2019):方向寻向(AoA/AoD)
  • 5.2(2020):LE Audio、LC3编码

1.2 BLE与经典蓝牙的区别

很多新手会问:BLE和经典蓝牙到底啥关系?能不能互相通信?

答案是:不能直接通信。它们虽然都叫蓝牙,但物理层和链路层完全不同。双模芯片内部其实是两套独立的射频和基带,共用一根天线而已。

对比项 经典蓝牙(BR/EDR) BLE
设计目标 连续流、高吞吐 低功耗、间歇传输
信道数 79个(1MHz间隔) 40个(2MHz间隔)
调制方式 GFSK GFSK
峰值速率 ~3Mbps(EDR) 2Mbps(5.0+)
功耗 ~30mA(持续) ~5mA(峰值),μA级休眠
网络拓扑 微微网(7个从设备) 广播、连接、Mesh
应用场景 耳机、音箱、文件传输 传感器、信标、穿戴设备

嗯,这里要注意:BLE的40个信道里,3个是广播信道(37/38/39),37个是数据信道。广播信道故意避开Wi-Fi的1/6/11信道,减少干扰——这个设计很巧妙,我在做多设备共存项目时深有体会。

1.3 BLE协议栈分层架构

BLE协议栈分三层:Controller、Host、Application。你想想看,这其实和OSI七层模型一个思路——每层只管自己的事,层与层之间通过标准接口通信。

我的经验:调试BLE问题时,先定位问题出在哪一层。物理层连不上?查射频和时序。配对失败?查SMP。数据收不到?查ATT和GATT。分层debug,效率翻倍。

下面这张图是我自己画的协议栈架构,你把它存下来,后面每章都会用到。

BLE协议栈分层架构 Application(应用层) 用户自定义Profile、业务逻辑 Host(主机层) GAP(通用访问规范) GATT(通用属性规范) ATT / SMP / L2CAP HCI(主机控制器接口) Controller(控制器层) 链路层(LL) 物理层(PHY) HCI是Host与Controller之间的桥梁,通常通过UART/USB/SPI通信

1.4 物理层(PHY)基础概念

物理层是BLE最底层的硬件实现。说白了,就是天线怎么发信号、收信号。

BLE工作在2.4GHz ISM频段,和Wi-Fi、Zigbee、微波炉挤在一起。信道间隔2MHz,共40个信道。调制方式是GFSK(高斯频移键控),说白了就是通过频率偏移来表示0和1。

BLE 5.0引入了三种PHY模式:

  • LE 1M:1Mbps,兼容4.x,最常用
  • LE 2M:2Mbps,吞吐翻倍,但距离稍短
  • LE Coded:125kbps或500kbps,通过编码增益换距离,最远可达400米+

避坑指南:我曾经在一个项目中,为了省电强制所有设备用LE Coded PHY,结果发现连接建立时间比1M慢了将近3倍。后来才意识到,Coded PHY的前导码和编码开销很大,适合长距离但不太适合频繁连接的场景。选PHY一定要看实际应用场景。

1.5 链路层(LL)基础概念

链路层是BLE的核心。它负责设备发现、连接建立、数据收发、重传、加密等关键功能。

链路层定义了五种状态机:

状态 说明 典型场景
Standby 空闲状态,不收发任何数据 设备休眠
Advertising 广播状态,发送广播包 信标、可发现设备
Scanning 扫描状态,监听广播包 手机扫描设备
Initiating 发起连接状态 主动连接指定设备
Connection 连接状态,双向数据通信 数据传输中

链路层还有一个关键概念——连接事件(Connection Event)。两个设备建立连接后,并不是一直开着射频,而是约定好每隔一个连接间隔(Connection Interval)才交换一次数据。这个间隔可以设到7.5ms到4s之间。

我的建议:连接间隔设得越小,实时性越好,但功耗也越高。做穿戴设备时,我一般把连接间隔设在30-50ms,兼顾响应速度和续航。如果只是传传感器数据,100ms以上完全够用。

链路层还负责白名单(Whitelist)和直接广播(Directed Advertising)——这些在多设备连接场景中非常有用。比如你只想让某个特定手机连你的设备,就可以把手机MAC地址加入白名单,其他设备扫描到了也不响应。

嗯,基础概念先聊到这儿。链路层还有很多细节,比如数据信道跳频、重传机制、流控等,后面章节讲到多设备连接时我会结合实战案例展开。你先把分层架构和PHY/LL的框架记住,后面就好办了。