一、常用过滤器
使用 Wireshark 分析蓝牙 HCI 日志,主要关注:连接请求、建连结果、连接句柄、断连原因和建连耗时。本文以经典蓝牙 BR/EDR 为主。过滤表达式复制到 Wireshark 顶部的"显示过滤器"中即可使用。
| 分析目标 | 显示过滤器 | 说明 |
|---|---|---|
| 所有 HCI 命令和事件 | `bthci_cmd | |
| 本地主动建连 | bthci_cmd.opcode == 0x0405 |
Create Connection |
| 收到对端连接请求 | bthci_evt.code == 0x04 |
Connection Request |
| 接受连接请求 | bthci_cmd.opcode == 0x0409 |
Accept Connection Request |
| 拒绝连接请求 | bthci_cmd.opcode == 0x040a |
Reject Connection Request |
| 查看建连结果 | bthci_evt.code == 0x03 |
Connection Complete,检查 Status |
| 查看成功建连 | bthci_evt.code == 0x03 && bthci_evt.status == 0x00 |
还需确认 Link Type 为 ACL |
| 取消正在进行的建连 | bthci_cmd.opcode == 0x0408 |
Create Connection Cancel |
| 本地主动发出断连命令 | bthci_cmd.opcode == 0x0406 |
Disconnect |
| 查看断连完成事件 | bthci_evt.code == 0x05 |
Disconnection Complete |
| 查看 L2CAP | btl2cap |
分析上层通道建立和断开 |
| 查看 A2DP 信令 | btavdtp |
分析音频流配置、打开、启动等 |
| 查看 AVRCP 相关交互 | btavctp |
分析音频控制交互 |
| 查看 RFCOMM | btrfcomm |
可用于分析 HFP 的 AT 指令交互 |
| 查看 BLE ATT 交互 | btatt |
分析属性读写、通知等 |
1. 建连、取消建连、断连综合过滤器
采用 == 和 || 写法,避免部分版本不支持集合语法的问题。
wireshark
(bthci_cmd.opcode == 0x0405) ||
(bthci_cmd.opcode == 0x0406) ||
(bthci_cmd.opcode == 0x0408) ||
(bthci_cmd.opcode == 0x0409) ||
(bthci_cmd.opcode == 0x040a) ||
(bthci_evt.code == 0x03) ||
(bthci_evt.code == 0x04) ||
(bthci_evt.code == 0x05)
包含以下关键节点:
| 命令或事件 | 含义 |
|---|---|
| Create Connection | 本地主动发起建连 |
| Connection Request | 收到对端连接请求 |
| Accept / Reject Connection Request | 本地接受或拒绝请求 |
| Connection Complete | 建连过程结束,结果由 Status 判断 |
| Create Connection Cancel | 取消正在进行的建连 |
| Disconnect | 本地主机发出断连命令 |
| Disconnection Complete | 控制器上报断连结果 |
排查失败时,建议使用完整过滤器,补看 Command Status / Command Complete:
wireshark
bthci_cmd || bthci_evt
2. 仅查看连接与断连关键事件
只关注"收到请求、建连完成、断连完成"三个时间点时,使用:
wireshark
bthci_evt.code == 0x04 || bthci_evt.code == 0x03 || bthci_evt.code == 0x05
以上两个综合过滤器针对经典蓝牙。BLE 连接结果需查看 LE Meta Event,见第六节。
二、如何判断连接是否建立
| 阶段 | 关键命令或事件 | 判断方法 |
|---|---|---|
| 本地主动发起 | Create Connection | 记录 BD_ADDR 和发起时间 |
| 收到对端请求 | Connection Request | 只代表收到请求,不代表建连成功 |
| 本地接受或拒绝 | Accept / Reject Connection Request | 确认本地主机的处理结果 |
| 建连过程结束 | Connection Complete | Status 为 0x00 表示成功,非零表示失败 |
| 确认 ACL 成功 | Connection Complete | 同时确认 Link Type 为 ACL,记录 Handle 和 Time |
注意:
- 本地主动建连时,不一定出现 Connection Request。
- 成功 Connection Complete 的时间,是 HCI 侧上报成功的时间。
- ACL 建立成功 ≠ A2DP/HFP 连接完成 ≠ 音频开始播放。
三、按 Handle 跟踪连接
建连成功后,记录 BD_ADDR 与 Connection Handle 的对应关系 。假设 Handle 为 0x000b:
wireshark
bthci_evt.connection_handle == 0x000b ||
bthci_cmd.connection_handle == 0x000b ||
bthci_acl.chandle == 0x000b
| 注意项 | 说明 |
|---|---|
| 双连分析 | 分别记录两个设备的 BD_ADDR 与 Handle |
| Handle 复用 | 断连后 Handle 可能复用,需要结合时间范围判断 |
| 字段兼容性 | 如果报错,在包详情中右键字段 → 作为过滤器应用 |
四、常见断连原因
在 Disconnection Complete 中查看 Connection Handle、Status、Reason。
| Reason | 含义 |
|---|---|
| 0x08 | Connection Timeout:连接超时 |
| 0x13 | Remote User Terminated Connection:对端用户终止连接 |
| 0x14 | 对端因资源不足终止连接 |
| 0x15 | 对端因关机终止连接 |
| 0x16 | Connection Terminated by Local Host:本地主机终止连接 |
判断断连发起方,应结合 Disconnect 命令、完成事件及上层日志,不要只凭 Reason 推断根因。
五、Wireshark 常用操作
| 需求 | 操作 |
|---|---|
| 显示绝对时间 | 视图 → 时间显示格式 → 当天时间(Time of Day) |
| 显示日期和时间 | 视图 → 时间显示格式 → 日期和当天时间 |
| 保留毫秒/微秒 | 时间显示精度选择毫秒或微秒,方便分析时序 |
| 搜索事件名称 | Ctrl + F → 字符串 → 数据包列表 |
| 添加 Handle / Status / Reason 列 | 在包详情中右键字段 → 作为列应用 |
| 标记关键包 | 选中包后按 Ctrl + M |
| 设置时间参考点 | 选中包后按 Ctrl + T |
| 限定抓包相对时间范围 | frame.time_relative >= 10 && frame.time_relative <= 20 |
计算建连耗时
- 找到对应的 Create Connection,按
Ctrl + T设置时间参考点。 - 将时间格式切换为"自参考或捕获开始的秒数"。
- 找到同一设备成功的 Connection Complete。
- 读取其 Time,例如
0.326表示约 326 ms。
说明:
- 设置参考点时,注意其他时间参考点对显示的影响。
frame.time_relative表示相对抓包起点的时间,不随 Time 列切换成绝对时间而改变。- 绝对时间依赖文件记录的时间戳及抓包设备时钟,单纯切换显示格式不能恢复缺失的真实时间。
六、BLE 建连过滤补充
| 分析目标 | 显示过滤器 | 说明 |
|---|---|---|
| LE Create Connection | bthci_cmd.opcode == 0x200d |
发起 BLE 建连 |
| LE Extended Create Connection | bthci_cmd.opcode == 0x2043 |
扩展建连命令 |
| LE Create Connection Cancel | bthci_cmd.opcode == 0x200e |
取消 BLE 建连 |
| LE Meta Event | bthci_evt.code == 0x3e |
包含连接完成等多种 LE 子事件 |
BLE 建连成功需检查 LE Connection Complete / LE Enhanced Connection Complete:
- 确认
Status = 0x00。 - 记录 Handle、Peer Address、Role。
- 查看连接间隔、外围设备延迟和监督超时等参数。
七、过滤器无法使用时的检查方法
| 现象 | 原因与处理 |
|---|---|
| 输入框变红 | 语法或字段不被识别,先单独测试 bthci_evt 和 bthci_cmd |
| 输入框绿色,但没有数据包 | 语法有效,但日志没有匹配项,或未解析成对应 HCI 协议 |
| 从 Markdown 表格源码复制后报错 | 表格源码中的竖线可能带转义反斜杠,实际过滤器中的逻辑或必须是两个竖线,不带反斜杠 |
| 字段名称不匹配 | 在包详情中右键 Event Code / Opcode → 作为过滤器应用,以自动生成的字段为准 |
建议从正文中的代码块复制综合过滤器,避免表格转义字符影响使用。
八、推荐排查顺序
- 定位连接请求或本地主动发起命令。
- 查看命令响应及最终建连结果。
- 记录 BD_ADDR 与 Handle 的对应关系。
- 结合时间参考点计算建连耗时。
- 若建连失败,查看 Connection Complete 的 Status 和 Reason。
- 若断连,查看 Disconnection Complete 的 Reason,并结合上层日志判断发起方。