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 物理层抓包实战要点
最后,我总结几个物理层抓包时容易踩的坑:
- 信道别搞错:抓广播包要锁定 37/38/39,抓数据包要跟着跳频序列走。很多抓包器默认只扫广播信道,抓不到数据包。
- PHY 类型要匹配:如果你的抓包器只支持 1M PHY,那 2M 和 Coded PHY 的包就抓不到。我建议至少准备一个支持 2M 的抓包器。
- CRC 错误别忽视:偶尔几个 CRC 错误正常,但如果超过 5%,就要查查干扰源或设备发射功率了。
- Access Address 是金钥匙:多连接场景下,用 Access Address 过滤包,能让你从混乱的空中数据里理出头绪。
一句话总结:物理层是 BLE 通信的基石。搞懂了 40 个信道怎么分、GFSK 怎么调、包结构长啥样、三种 PHY 有啥区别,你抓包时就能看懂那些波形和十六进制数据背后的含义了。
3.7 BLE 物理层知识体系图
下面这张图,帮你把本章的核心知识点串起来:
这张图从三个维度展开:信道划分、调制方式、包结构。最下面还列出了三种 PHY 类型。你抓包时,可以对照这张图,快速定位当前看到的是哪个层面的信息。