调试Android上的BLE应用,有时需要用到btsnoop文件以检查手机端的蓝牙行为。
理想情况下,手机端在开发者选项中打开蓝牙日志选项,即可生成btsnoop文件,但是不同的手机生成btsnoop文件的位置不同,难以查找,更甚者,许多手机完全关闭了这一功能。
本文介绍如何获知手机是否支持生成btsnoop文件,以及它的获取方式。
btsnoop配置信息
从网上下载Android调试命令行工具adb。
用USB连接Android手机,开启USB调试功能,然后在cmd窗口中执行:
adb shell cat system/etc/bluetooth/bt_stack.conf
将打印出btsnoop的使能即保存地址信息:

如果BtSnoopLogOutput无论如何都为false,那么这台手机无法输出btsnoop文件。如果能输出的话,BtSnoopFileName指示了保存位置。
btsnoop内容
如果手机不支持输出btsnoop,还有一个抢救方法。
在cmd窗口中执行:
adb shell dumpsys bluetooth_manager > dump.txt
该命令将蓝牙相关的信息保存在dump.txt文件中,打开dump.txt,在底部会看到以下形式的内容:
--- BEGIN:BTSNOOP_LOG_SUMMARY (18294 bytes in) ---
AovprobqogUAeJzlWwl4FdUVvndm3pqXvI2ErC+DwUDIBgnBEEAS
...
...
--- END:BTSNOOP_LOG_SUMMARY ---
这部分内容其实就是btsnoop文件压缩(deflate)再base64后的信息,我们将其解析出来,就能获得btsnoop文件。
Google已经提供了一个解析脚本:btsnooz.py
在cmd窗口中执行:
python2 btsnooz.py dump.txt > btsnoop.log
# 注意,这个脚本只支持Python2
就能获得我们期望的btsnoop文件。
btsnoop解析
把btsnoop.log拖到wireshark软件中,就能够解析出蓝牙的帧序列。
很不幸,当你这样操作时,wireshark会报错。
btsnoop有两种协议格式,version 1和version 2,Wireshark解析方法基于version 1,Google提供的这个脚本也是基于version 1。
然而version 1是淘汰的版本,我们手机产生的数据是基于version 2,版本不一致导致出错。
网络上诸多相关的帖子都在误导人。
TODO
现在我没有动力去研究btsnoop version 2,期待有大神能够挺身而出搞定它。
dump.txt文件的形成逻辑,实现脚本需要参考:link 1, link 2
(完)
对不起,对于我的Google翻译,问题是您需要在macos或linux上运行,Windows上的文件格式设置了错误的字符集,wireshark无法识别。