3. BLE物理层与链路层:从空中信号到连接建立

各位同学,今天我们来聊聊BLE协议栈里最底层的两个家伙——物理层和链路层。说实话,很多做上层应用开发的工程师,一听到「物理层」就觉得头大,觉得那是射频工程师的事。但我要告诉你,不懂物理层和链路层,你写出来的蓝牙代码就像在沙滩上盖楼,看着漂亮,一阵风就倒了。

我在做蓝牙项目早期,就吃过这个亏。当时一个智能门锁项目,明明连接成功了,但距离稍微远一点就断连。折腾了两周,最后发现是物理层信道选择的问题。嗯,从那以后,我再也不敢跳过这两层了。

3.1 物理层信道与调制方式

BLE工作在2.4GHz ISM频段,这个频段大家应该不陌生——Wi-Fi、Zigbee、甚至微波炉都挤在这里。BLE把这段频谱分成了40个信道,每个信道带宽2MHz。

这40个信道怎么分配的呢?我习惯用「三七开」来记:

  • 3个广播信道:37信道(2402MHz)、38信道(2426MHz)、39信道(2480MHz)
  • 37个数据信道:0-36信道,用于连接后的数据传输

你想想看,为什么偏偏选这三个频率做广播信道?说白了,就是为了避开Wi-Fi的常用信道。Wi-Fi的1、6、11信道正好卡在2.4GHz频段的三个位置,而BLE的37、38、39信道巧妙地插在了它们之间的缝隙里。这个设计,我个人觉得非常聪明。

调制方式:BLE使用GFSK(高斯频移键控)调制,调制指数为0.5。简单说就是:传比特1时频率偏高,传比特0时频率偏低。速率方面,BLE 4.x/5.0支持1Mbps和2Mbps两种模式,BLE 5.0还引入了125kbps和500kbps的编码模式(Coded PHY),用于远距离通信。

我记得有一次做长距离测试,用1Mbps模式只能跑30米,换成125kbps编码模式后,直接干到了200米。代价是什么?数据速率慢了8倍。这就是工程上的取舍。

3.2 链路层状态机

链路层是BLE协议栈的核心,它维护着一个状态机。说白了,BLE设备就像一个人,在不同场景下扮演不同角色。

状态机一共有5个状态:

状态 角色 说明
Standby 空闲 啥也不干,省电模式
Advertising 广播者 向外喊话:「我在这儿,快来连我」
Scanning 扫描者 监听广播:「谁在喊话?我看看」
Initiating 发起者 主动连接:「就你了,连一下」
Connection 已连接 建立连接,双向通信

这里有个关键点:一个设备不能同时处于Advertising和Scanning状态。为什么?因为广播和扫描都需要使用射频资源,就像一个人不能同时喊话和听别人说话一样。

避坑指南:我曾经遇到一个项目,设备在广播状态下还想扫描其他设备,结果广播包和扫描请求在内部冲突了,导致广播间隔不稳定。解决方案很简单:用两个射频任务分时处理,或者干脆用两个BLE芯片。嗯,后者成本高,但稳定。

3.3 空中数据包格式

BLE在空中传输的数据包,结构其实挺清晰的。我习惯把它拆成四段来看:

| 前导码(1字节) | 访问地址(4字节) | PDU(2-257字节) | CRC(3字节) |
  • 前导码:固定为0xAA或0x55,用于接收端做时钟同步
  • 访问地址:广播信道固定为0x8E89BED6,数据信道由链路层分配
  • PDU:协议数据单元,包含实际数据
  • CRC:24位循环冗余校验

PDU内部又分两种:广播信道PDU和数据信道PDU。广播信道PDU包含报头(2字节)、MAC地址(6字节)和广播数据(最多31字节)。数据信道PDU则更复杂,包含LLID、NESN、SN等控制字段。

注意:BLE 5.0扩展了广播数据长度,从原来的31字节扩展到255字节。但代价是广播间隔变长,功耗增加。我建议:能用31字节就别用255字节,除非你真的需要传那么多数据。

3.4 CRC与白名单机制

CRC(循环冗余校验)是保证数据完整性的最后一道防线。BLE使用24位CRC,生成多项式是标准化的。接收端收到数据包后,重新计算CRC,如果和发送端的不一致,直接丢弃这个包。

你可能会问:「CRC校验失败的概率有多大?」以24位CRC来说,误检率大约是1/2^24,也就是约六百万分之一。对于消费级产品,这个概率完全可以接受。

白名单机制,说白了就是一个MAC地址过滤器。链路层维护一个白名单列表,只有白名单里的设备才能连接或扫描到。这个机制在安全场景下非常有用。

警告:白名单不是万能的。MAC地址可以被伪造,所以白名单只能作为第一道防线,不能替代加密认证。我见过有人把白名单当成唯一安全手段,结果被攻击者用MAC地址欺骗轻松绕过。记住:白名单是「防君子不防小人」。

白名单的实现其实很简单:在链路层收到连接请求或扫描请求时,先检查发送方的MAC地址是否在白名单中。如果在,就正常处理;如果不在,直接忽略。这个检查是在硬件层面完成的,速度极快,几乎不增加延迟。

我个人习惯在白名单里同时保存设备的IRK(身份解析密钥),这样即使设备使用随机地址,也能通过IRK解析出真实身份。嗯,这个做法在苹果的Find My网络中广泛使用。

小结

这一章我们聊了BLE物理层的信道分配和调制方式,链路层的五状态机,空中数据包的格式,以及CRC和白名单机制。这些都是最底层的东西,但理解它们,能帮你写出更稳定、更高效的蓝牙应用。

下一章,我们会进入GAP层,看看设备是如何发现彼此、建立连接的。到时候我会分享一个我在智能家居项目中遇到的连接超时问题,保证让你有收获。