3. 空中包物理层解析:BLE 的信道、调制与包结构

各位好,我是你们的讲师。今天咱们聊聊 BLE 物理层那些事儿。说白了,就是数据在空气中到底长什么样。我刚开始做 BLE 抓包时,看着频谱上那些跳来跳去的信号,也是一头雾水。后来摸清了门道,才发现物理层其实挺有规律的。

3.1 BLE 的 40 个物理信道

BLE 在 2.4GHz ISM 频段工作,一共划分了 40 个物理信道,编号从 0 到 39。每个信道带宽 2MHz。你想想看,Wi-Fi 一个信道就占 20MHz,BLE 这么窄,就是为了躲开干扰。

这 40 个信道分成了两类:

  • 3 个广播信道:37、38、39。专门用来发广播包、建立连接。
  • 37 个数据信道:0-36。连接建立后,双方在这上面传数据。

为什么要特意留 3 个广播信道?我遇到过不少新手问这个问题。其实很简单——为了避开 Wi-Fi 的 1、6、11 信道。37、38、39 正好卡在 Wi-Fi 信道的缝隙里,这样广播不容易被 Wi-Fi 冲掉。

核心要点:抓包时,如果你只看到 37/38/39 上有包,说明设备还在广播状态,没连上。一旦看到数据信道上有流量,连接就建立了。

3.2 GFSK 调制方式

BLE 用的是 GFSK(高斯频移键控)。说白了,就是用频率变化来表示 0 和 1。

  • 频率比中心频率高一点 → 表示 1
  • 频率比中心频率低一点 → 表示 0

GFSK 前面加了个“高斯滤波器”,让频率切换更平滑。这样做的好处是:频谱利用率高,不容易干扰别人。

我记得有一次调试一个产线测试工具,发现某些设备灵敏度差。后来查出来是 GFSK 调制指数偏了。标准要求调制指数在 0.45~0.55 之间,那批货只有 0.38,导致接收端误码率飙升。嗯,这里要注意:调制指数是物理层的关键指标,抓包时如果看到 CRC 错误特别多,不妨怀疑一下发射端的调制质量。

3.3 数据包结构

一个标准的 BLE 空中包,长这样:

| Preamble (1字节) | Access Address (4字节) | PDU (2-257字节) | CRC (3字节) |

咱们逐个拆开看。

3.3.1 Preamble(前导码)

固定 1 个字节,用于接收端做频率同步和位时钟恢复。1M PHY 下是 0xAA 或 0x55,取决于 Access Address 的第一个 bit。2M PHY 下是 2 个字节的重复序列。

3.3.2 Access Address(访问地址)

4 个字节,这是包的“身份证”。

  • 广播包:固定为 0x8E89BED6
  • 数据包:连接建立时由链路层随机生成,每个连接唯一

抓包时,我经常用 Access Address 来区分不同的连接。如果空中同时有多个 BLE 设备在通信,看 Access Address 就能把包分到对应的连接里去。

3.3.3 PDU(协议数据单元)

PDU 是包的“肉”,里面装着真正的数据或控制命令。广播信道和数据信道的 PDU 格式略有不同,咱们后面章节会细讲。

3.3.4 CRC(循环冗余校验)

3 个字节,用于校验包在传输过程中有没有出错。接收端收到包后重新算一遍 CRC,如果和包尾的 CRC 对不上,就直接丢包。

抓包小技巧:如果你在抓包软件里看到大量 CRC 错误,先别急着怀疑干扰。我曾经遇到过一例,是设备的天线匹配电路焊错了,导致发射功率不够,接收端信噪比太低,CRC 就过不了。换个设备就好了。

3.4 1M / 2M / LE Coded PHY 的区别

BLE 4.0/4.1/4.2 只有 1M PHY。从 BLE 5.0 开始,新增了 2M PHY 和 LE Coded PHY。这三者的区别,我用一张表来说明:

特性 1M PHY 2M PHY LE Coded PHY (S=2) LE Coded PHY (S=8)
数据速率 1 Mbps 2 Mbps 500 kbps 125 kbps
编码方式 无 无 卷积编码 (1/2) 卷积编码 (1/8)
覆盖范围 基准 约 80% 的 1M 范围 约 2 倍 1M 范围 约 4 倍 1M 范围
功耗 基准 略低(传输时间短) 略高(传输时间长) 更高(传输时间更长)
典型场景 兼容性要求高 高速数据传输 中等距离 超远距离

我个人习惯这样选:

  • 如果设备离得近(几米内),用 2M PHY,速度快,省电。
  • 如果需要穿墙或远距离(几十米到上百米),用 LE Coded PHY (S=8),虽然慢,但稳。
  • 如果要做兼容性测试,老老实实用 1M PHY,所有 BLE 设备都支持。

避坑指南:我曾经在一个项目中,为了追求远距离,所有设备都配了 LE Coded PHY (S=8)。结果发现手机端抓包时,广播包还是用 1M PHY 发的,只有连接后的数据包才用 Coded PHY。后来才意识到:广播信道只能用 1M PHY,这是规范强制的。所以抓包时,广播阶段你永远看不到 Coded PHY 的包。

3.5 三种 PHY 的包结构差异

1M 和 2M PHY 的包结构基本一样,只是 2M 的 Preamble 是 2 字节,且整个包传输速率翻倍。

LE Coded PHY 的包结构就不同了:

| Preamble (4字节) | Access Address (4字节) | CI (2位) | TERM1 (3位) | 编码后的 PDU + CRC | TERM2 (3位) |

多了几个新字段:

  • CI (Coding Indicator):2 位,表示编码速率。00 表示 S=2,01 表示 S=8。
  • TERM1 / TERM2:用于卷积编码的状态归零。
  • PDU 和 CRC 在发送前会经过 卷积编码,增加冗余,提高抗干扰能力。

抓包时,如果你看到包长比普通包长很多,而且速率显示是 125kbps 或 500kbps,那基本就是 LE Coded PHY 的包。

3.6 物理层抓包实战要点

最后,我总结几个物理层抓包时容易踩的坑:

  1. 信道别搞错:抓广播包要锁定 37/38/39,抓数据包要跟着跳频序列走。很多抓包器默认只扫广播信道,抓不到数据包。
  2. PHY 类型要匹配:如果你的抓包器只支持 1M PHY,那 2M 和 Coded PHY 的包就抓不到。我建议至少准备一个支持 2M 的抓包器。
  3. CRC 错误别忽视:偶尔几个 CRC 错误正常,但如果超过 5%,就要查查干扰源或设备发射功率了。
  4. Access Address 是金钥匙:多连接场景下,用 Access Address 过滤包,能让你从混乱的空中数据里理出头绪。

一句话总结:物理层是 BLE 通信的基石。搞懂了 40 个信道怎么分、GFSK 怎么调、包结构长啥样、三种 PHY 有啥区别,你抓包时就能看懂那些波形和十六进制数据背后的含义了。

3.7 BLE 物理层知识体系图

下面这张图,帮你把本章的核心知识点串起来:

BLE 物理层知识体系图 BLE 物理层知识体系 BLE 物理层 40 个物理信道 GFSK 调制 3 广播信道 (37/38/39) 37 数据信道 (0-36) 1 表示频率偏高 0 表示频率偏低 数据包结构 Preamble | Access Address | PDU | CRC 1M PHY | 2M PHY | LE Coded PHY (S=2 / S=8) 包结构 PHY 类型

这张图从三个维度展开:信道划分、调制方式、包结构。最下面还列出了三种 PHY 类型。你抓包时,可以对照这张图,快速定位当前看到的是哪个层面的信息。