Wireshark 蓝牙 HCI 日志分析常用操作速查

一、常用过滤器

使用 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

计算建连耗时

  1. 找到对应的 Create Connection,按 Ctrl + T 设置时间参考点。
  2. 将时间格式切换为"自参考或捕获开始的秒数"。
  3. 找到同一设备成功的 Connection Complete。
  4. 读取其 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 → 作为过滤器应用,以自动生成的字段为准

建议从正文中的代码块复制综合过滤器,避免表格转义字符影响使用。

八、推荐排查顺序

  1. 定位连接请求或本地主动发起命令。
  2. 查看命令响应及最终建连结果。
  3. 记录 BD_ADDR 与 Handle 的对应关系。
  4. 结合时间参考点计算建连耗时。
  5. 若建连失败,查看 Connection Complete 的 Status 和 Reason。
  6. 若断连,查看 Disconnection Complete 的 Reason,并结合上层日志判断发起方。
相关推荐
艾iYYY1 小时前
思考: C++ 万能引用与完美转发
c++·windows·microsoft
howdoyoudo2026063 小时前
AI基建融资信用分层:谁被挤出GPU抵押市场?
大数据·人工智能·安全·microsoft·ai·语言模型
小趴菜一只3 小时前
SIEM-wazuh安装过程
运维·windows·安全·网络安全
MOONICK3 小时前
COM 组件技术(三)
c++·windows
Source.Liu3 小时前
【A11】客户端登录流程笔记
windows·rust
clz13145214 小时前
Dify的Windows平台部署:从Docker安装到Dify运行
windows·docker·容器
蜗牛互联网4 小时前
Python Agent 工具调用:审批令牌、参数白名单和累计预算
java·开发语言·人工智能·windows·后端·python
夏虫不可与之言冰5 小时前
使用Flash Download Tool给ESP32烧录固件
c语言·c++·windows·单片机·物联网·iot
jack1868919 小时前
Devin 智能软件工程师实战应用指南
windows