1. BLE基础与协议栈架构
做无线抓包分析,第一件事不是拿起设备就抓。你得先搞清楚——BLE到底是个什么东西?它的协议栈长什么样?谁在说话,谁在听?
这一章,我们就从最底层开始,把BLE的骨架搭起来。我个人习惯是,先理解架构再动手抓包,否则你看到的全是乱码。
1.1 BLE发展历程:从0到5.4
BLE不是一夜之间冒出来的。它经历了几个关键节点:
- 2010年:蓝牙4.0发布,BLE正式登场。当时叫“Bluetooth Smart”,主打低功耗。
- 2013年:蓝牙4.1,开始支持物联网场景,比如多角色切换。
- 2014年:蓝牙4.2,引入LE Secure Connections,安全性提升。
- 2016年:蓝牙5.0,最大变化——广播包扩展、2Mbps速率、长距离模式。
- 2019年:蓝牙5.1,加入方向定位(AoA/AoD)。
- 2020年:蓝牙5.2,LE Audio登场,LC3编码。
- 2023年:蓝牙5.4,带响应的周期性广播(PAwR)等新特性。
核心要点:抓包时,你遇到的设备版本不同,空中包的结构也会有差异。比如蓝牙5.0之后的扩展广播包,和4.x的经典广播包就不一样。我遇到过有人拿4.x的抓包工具去抓5.0的扩展广播,结果啥也看不到——嗯,工具不支持。
1.2 BLE与经典蓝牙的区别
很多人搞混这两个东西。说白了,经典蓝牙(BR/EDR)和BLE是两套完全不同的协议栈,只是共用“蓝牙”这个名字。
| 对比项 | 经典蓝牙 (BR/EDR) | BLE |
|---|---|---|
| 设计目标 | 连续数据流(音频、文件) | 低功耗、间歇性小数据 |
| 信道数 | 79个(1MHz间隔) | 40个(2MHz间隔) |
| 调制方式 | GFSK / π/4-DQPSK / 8DPSK | GFSK |
| 峰值速率 | 2~3 Mbps | 1 Mbps / 2 Mbps (5.0+) |
| 功耗 | ~30 mA(持续连接) | ~5 mA(连接态) |
| 连接建立时间 | ~100 ms | ~3 ms |
| 应用场景 | 耳机、音箱、车载 | 传感器、信标、穿戴 |
你想想看,经典蓝牙就像高速公路上的大卡车,一次拉很多货,但启动慢、油耗高。BLE就像共享单车,随用随走,但一次只能带个小包。
抓包提示:经典蓝牙和BLE的射频信道完全不同。抓BLE包时,你的抓包器必须锁定在2.4GHz频段的37/38/39三个广播信道(或者扩展广播信道)。我曾经用错频段,抓了半天全是噪声——别学我。
1.3 BLE协议栈分层结构
BLE协议栈分三层:Controller、Host、Application。每一层各司其职,中间通过HCI(Host Controller Interface)通信。
这张图我建议你多看几遍。抓包时,你看到的每一个数据包,都能对应到某一层。比如:
- PHY层:决定你用1M还是2M速率,调制方式是什么。
- LL层:负责信道选择、重传、加密。抓包时看到的“LLID”字段就在这里。
- HCI:Host和Controller之间的“翻译官”。抓包工具如果支持HCI日志,能看到更详细的信息。
- GAP:管广播、扫描、连接建立。你看到的“ADV_IND”、“SCAN_REQ”都是GAP的活。
- GATT:管数据交互。Service、Characteristic、Read/Write/Notify都在这里。
注意:抓包时,如果你只抓空中的射频包,你看到的是LL层和PHY层的信息。如果你抓HCI日志,你还能看到Host层的交互。两者结合,才能完整还原通信过程。我刚开始做抓包时,只抓了空中包,结果发现应用层的数据对不上——后来才意识到,HCI层的分段重组没抓到。
1.4 核心角色:Broadcaster、Observer、Peripheral、Central
BLE定义了四种角色。你想想看,这就像一场对话:
- Broadcaster(广播者):只管往外喊话,不关心谁在听。比如一个温度传感器,每隔几秒广播一次温度值。
- Observer(观察者):只管听,不回应。比如一个扫描器,收集周围所有广播包。
- Peripheral(外设):可以广播,也可以接受连接。比如一个心率带,广播自己的存在,等待手机连接。
- Central(中心):主动扫描并发起连接。比如手机,扫描到心率带后主动连上去。
| 角色 | 广播 | 扫描 | 发起连接 | 典型设备 |
|---|---|---|---|---|
| Broadcaster | ✅ | ❌ | ❌ | 信标、传感器 |
| Observer | ❌ | ✅ | ❌ | 扫描器、抓包器 |
| Peripheral | ✅ | ❌ | ❌ | 穿戴设备、外设 |
| Central | ❌ | ✅ | ✅ | 手机、网关 |
这里有个容易混淆的点:Peripheral和Broadcaster都能广播,但Peripheral可以接受连接,Broadcaster不行。我遇到过有人把信标配成Peripheral角色,结果手机连上去后,信标反而停止广播了——嗯,角色没选对。
抓包技巧:抓包时,你看到的广播包类型(ADV_IND、ADV_NONCONN_IND、ADV_SCAN_IND等)直接对应设备角色。比如ADV_NONCONN_IND一定是Broadcaster发出的,它不接受连接。如果你想抓连接过程,必须找ADV_IND或ADV_DIRECT_IND类型的包。
1.5 小结
这一章我们搭好了BLE的基础框架。你知道了BLE从4.0到5.4的演进,明白了它和经典蓝牙的区别,记住了协议栈的三层结构,也分清了四种核心角色。
这些概念,后面每一章都会用到。尤其是协议栈分层——抓包时,你看到的每一个字段,都能对应到某一层。理解了这个,你才能从“看热闹”变成“看门道”。