BLE 调试指南:从 HCI 日志到底能看出什么?
在调试 BLE(Bluetooth Low Energy)通信问题时,很多工程师都会抓取 HCI 日志(Bluetooth HCI Log / btsnoop)。
但很多人都会产生一个疑问:
HCI 日志到底能看到什么?
又有哪些关键链路信息是 看不到的?
这篇文章结合 BLE 协议分层和实际调试经验,系统讲清楚:
-
HCI 日志能看到什么
-
HCI 日志看不到什么
-
如何通过 HCI 推断链路行为
-
BLE 吞吐量到底由什么决定
如果你做过 BLE 开发、蓝牙模块调试或者 iOS / Android BLE 开发,这篇文章会帮你建立一套 完整的调试思维模型。
一、BLE 协议栈分层
首先要理解 BLE 的协议分层。
Application
↓
GATT
↓
ATT
↓
L2CAP
↓
Link Layer
↓
PHY
而 HCI(Host Controller Interface) 位于:
Host Stack
↓
HCI
↓
Controller (Link Layer + PHY)
也就是说:
HCI 是 Host(操作系统蓝牙栈)和 Controller(蓝牙芯片)之间的接口。
因此:
HCI 日志本质上记录的是:
Host ↔ Controller
之间的通信。
这意味着:
-
可以看到 Host 发给 Controller 的命令
-
可以看到 Controller 上报给 Host 的事件
-
但 无法直接看到真实空口通信
这点非常关键。
二、HCI 日志可以直接看到的信息
1 连接建立
例如日志中:
LE Enhanced Connection Complete
可以得到:
-
Peer Address
-
Role(Central / Peripheral)
-
Connection Handle
-
Connection Interval
-
Peripheral Latency
-
Supervision Timeout
例如:
Connection Interval: 15 ms
Peripheral Latency: 0
Supervision Timeout: 3000 ms
这是 BLE 链路最核心的三个参数。
2 连接参数更新
BLE 连接建立后,设备通常会更新连接参数。
HCI 日志会出现:
LE Connection Update Complete
可以看到:
-
新的 Connection Interval
-
新的 Latency
-
新的 Timeout
因此:
连接参数的变化可以通过 HCI 完整追踪。
3 MTU 协商
BLE 在 ATT 层会进行 MTU 交换。
日志中可以看到:
Exchange MTU Request
Exchange MTU Response
例如:
Request: 527
Response: 517
最终 MTU:
min(527, 517) = 517
这是 ATT MTU。
注意:
ATT MTU ≠ 空口数据包大小
这一点是很多工程师的误区。
4 GATT 服务与特征发现
HCI 日志会记录完整的 GATT 初始化流程:
Read By Group Type Request
Read By Type Request
Find Information Request
可以得到:
-
Service UUID
-
Characteristic UUID
-
Descriptor
-
Handle
这对于 逆向设备协议 或 分析蓝牙模块行为 非常有价值。
5 数据通信(Notify / Write)
HCI 日志可以看到:
Handle Value Notification
Write Request
Write Command
这意味着:
可以确认数据是否真的进入系统蓝牙栈。
例如:
场景
模块说:
我发了 Notify
但 App 没收到。
查看 HCI:
情况 A:
Handle Value Notification
存在
说明:
系统收到了
问题在 App / CoreBluetooth
情况 B:
没有 Notification
说明:
系统没收到
问题在模块 / 链路 / RF
HCI 在这里非常有价值。
6 RSSI
连接后可以看到:
Read RSSI Complete
RSSI: -45 dBm
用于判断链路质量。
7 断开原因
断开连接时:
Disconnection Complete
Reason: 0x16
可以判断:
-
本地主机断开
-
远端设备断开
-
链路异常断开
三、HCI 日志有时能看到的信息
Data Length Extension(DLE)
BLE4.2 引入了 Data Length Extension。
如果日志完整,可以看到:
LE Data Length Change Event
包含:
MaxTxOctets
MaxTxTime
MaxRxOctets
MaxRxTime
例如:
MaxTxOctets = 251
MaxRxOctets = 251
这表示:
Link Layer payload = 251 bytes
但需要注意:
某些平台(例如 iOS)可能不会完整展示 DLE 协商过程。
四、HCI 日志看不到的信息
接下来是最重要的部分。
1 Connection Event
BLE 通信基于:
Connection Interval
↓
Connection Event
每到 interval 就开启一个 event。
例如:
Interval = 15ms
表示:
每15ms开启一个 Connection Event
但:
Connection Event 不是一个参数字段。
因此 HCI 不会显示:
Event Start
Event End
2 每个 Event 发送多少包
在一个 event 内,通信可能是:
Master → Slave
Slave → Master
Master → Slave
Slave → Master
...
但 HCI 只会显示:
ACL Data TX
ACL Data RX
不会告诉你:
这些包属于哪个 event
所以:
无法精确得到 packets per event。
3 空口真实包长度
Link Layer PDU:
LL Data PDU
可能被:
-
拆包
-
合包
-
重传
而 HCI 看到的是:
ACL Data
所以:
HCI ≠ 空口真实数据
4 空口重传 / 干扰
HCI 无法显示:
RF干扰
CRC错误
重传
这些只能通过 Air Sniffer 看到。
例如:
-
Ellisys
-
Frontline
-
nRF Sniffer
五、如何通过 HCI 推测链路行为
虽然 HCI 看不到空口细节,但可以推测链路行为。
方法1 查看 DLE
寻找:
LE Data Length Change
得到:
MaxTxOctets
即可知道:
LL payload size
方法2 观察数据发送节奏
发送大量数据,例如:
Write Without Response
Notification
观察:
ACL packet数量
Completed Packets
可以推断链路利用率。
方法3 吞吐量反推
BLE 吞吐量大致公式:
Throughput ≈
(LL payload × packets per event)
÷ connection interval
例如:
payload = 251 bytes
packets/event = 4
interval = 15ms
吞吐:
≈ 67 KB/s
六、BLE 吞吐量真正由什么决定
很多人误以为:
BLE5.0 一定更快
其实不一定。
BLE速度主要由:
PHY
DLE
Connection Interval
Packets per Event
Controller Buffer
Write Type
决定。
而不是:
BLE version
七、BLE5.0 为什么有时更慢?
例如:
BLE5.0设备:
Interval = 30ms
PHY = 1M
DLE = 27
BLE4.2设备:
Interval = 7.5ms
DLE = 251
结果:
BLE4.2更快
因此:
BLE版本只是能力上限,不代表实际速度。
八、BLE 调试的三种日志
调试 BLE 时通常会结合三种日志。
1 App日志
查看:
CoreBluetooth回调
业务逻辑
适合排查:
代码问题
状态机问题
2 HCI日志
查看:
系统蓝牙栈行为
适合排查:
数据是否真的发送/接收
连接参数
MTU
GATT流程
3 Air Sniffer
查看:
真实空口通信
适合排查:
重传
干扰
event行为
packet数量
九、BLE 调试思维模型
可以总结为:
App日志
↓
HCI日志
↓
Air Sniffer
逐层定位问题。
十、总结
HCI 日志可以看到:
-
连接建立
-
连接参数
-
MTU 协商
-
GATT 服务发现
-
Notify / Write
-
RSSI
-
断开原因
-
部分 Link Layer 事件(DLE)
但 HCI 无法直接看到:
-
Connection Event
-
Packets per event
-
空口真实 packet size
-
重传
-
RF干扰
因此:
HCI日志用于分析系统蓝牙栈
Air Sniffer用于分析空口行为
两者在 BLE 调试中 缺一不可。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)