You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

调试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方法处理未知类型,从根源避免报错。

三、正确运行脚本提取日志的步骤

  1. 先把bugreport文件解压(如果是压缩包的话),找到包含BTSNOOP_LOG_SUMMARY的文本文件;
  2. 运行修改后的脚本:
    python btsnooz.py bugreport.txt > extracted_btsnoop.log
    
  3. 生成的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

火山引擎 最新活动