在调试 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 调试中 缺一不可

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐