调试BLE设备时从bugreport提取BTSnoop.log遇btsnooz.py函数错误求助
解决华为Mate 10 Lite BLE日志提取及btsnooz.py函数报错问题
一、先聊聊为什么你的设备没生成直接的Bluetooth HCI Snoop Log文件
- 华为Mate 10 Lite开启该选项后,日志默认存在
/sdcard/Android/data/com.android.bluetooth/files/btsnoop_hci.log,你可以手动去这个路径排查下——有时候系统需要重启蓝牙甚至手机才会开始记录,或者存在轻微的生成延迟。 - 如果确实找不到,那通过bugreport提取是完全可行的,你拿到的
BTSNOOP_LOG_SUMMARY说明bugreport里已经包含了压缩后的HCI日志内容。
二、修复btsnooz.py中type_to_hci函数的错误
这个函数的核心作用是把bugreport里的日志类型转换成标准HCI类型,报错大概率是因为原函数的类型映射不完整,或者没有处理未知类型的情况。你可以直接替换成下面的完整实现:
def type_to_hci(type): """Returns the HCI type corresponding to a btsnooz type.""" # 覆盖所有常见HCI包类型的映射表,包括BLE相关的ACL数据类型 type_map = { 0: 0x01, # HCI Command包 1: 0x02, # HCI Event包 2: 0x03, # 发送的ACL Data包 3: 0x04, # 接收的ACL Data包 4: 0x05, # 发送的SCO Data包 5: 0x06, # 接收的SCO Data包 6: 0x07, # 发送的ISO Data包(适配BLE音频场景) 7: 0x08, # 接收的ISO Data包 } # 遇到未知类型时返回0x00作为默认值,避免抛出KeyError return type_map.get(type, 0x00)
修改说明:
- 原函数可能只实现了基础的几种类型,当遇到BLE特有的包类型时就会报错;
- 上面的代码补充了完整的HCI类型映射,还加入了对ISO数据的支持(如果你的BLE设备涉及音频功能),同时用
get方法处理未知类型,从根源避免报错。
三、正确运行脚本提取日志的步骤
- 先把bugreport文件解压(如果是压缩包的话),找到包含
BTSNOOP_LOG_SUMMARY的文本文件; - 运行修改后的脚本:
python btsnooz.py bugreport.txt > extracted_btsnoop.log - 生成的
extracted_btsnoop.log就可以直接用Wireshark打开,分析BLE设备的通信细节了。
额外调试技巧
如果修改后还是报错,你可以在函数里加一行调试代码,打印出传入的type值,看看是哪种未知类型导致的:
def type_to_hci(type): """Returns the HCI type corresponding to a btsnooz type.""" print(f"收到未匹配的类型值: {type}") # 临时调试用 type_map = { # ... 上面的映射表 ... } return type_map.get(type, 0x00)
根据打印出的数值,补充到映射表里就能彻底解决问题。
内容的提问来源于stack exchange,提问作者RelaX




