Android4.2之前抓取hci log都是通过hcidump命令完成的,但是Android4.2 Bluetooth引入了Bluedroid,这是一个新的蓝牙协议栈。所以抓取hci log的方法也改变了。
在我的Bluetooth计划里,本来是没打算写这篇blog的,但是在留言里看见有人问,所以写出来分享给那些目前还不会的。
在Android 4.2之后, Bluetooth控制hcidump 的写开关和默认保存的hci log的路径,以及各种级别的log 开关是在/etc/bluetooth/bt_stack.conf 文件里. 如果你需要hci log,那你首先需要从手机把这个文件adb pull出来,然后修改这个文件的内容,然后adb push回去。文件里你修改的BtSnoopFileName这个值就是你需要的hci log文件路径。
bt_stack.conf的文件内容如下
# Enable BtSnoop logging function
# valid value : true, false
BtSnoopLogOutput=true //默认是false,如果需要抓取hcidump 的话,改成 true
# BtSnoop log output file
BtSnoopFileName=/sdcard/btsnoop_hci.log //默认写hcidump 的路径,btsnoop_hci.log 就是hcidump的log。可以按照你自己的需要修改。
# Trace level configuration
# BT_TRACE_LEVEL_NONE 0 ( No trace messages to be generated )
# BT_TRACE_LEVEL_ERROR 1 ( Error condition trace messages )
# BT_TRACE_LEVEL_WARNING 2 ( Warning condition trace messages )
# BT_TRACE_LEVEL_API 3 ( API traces )
# BT_TRACE_LEVEL_EVENT 4 ( Debug messages for events )
# BT_TRACE_LEVEL_DEBUG 5 ( Full debug messages )
# BT_TRACE_LEVEL_VERBOSE 6 ( Verbose messages ) - Currently supported for TRC_BTAPP only.
//下面默认值是2,哪个模块需要抓取更多的log,可以把值改成你想要的.
比如说,你想看各个模块的log,你就全改成5 Full debug messages
TRC_BTM=5
TRC_HCI=5
TRC_L2CAP=5
TRC_RFCOMM=5
TRC_OBEX=5
TRC_AVCT=5
TRC_AVDT=5
TRC_AVRC=5
TRC_AVDT_SCB=5
TRC_AVDT_CCB=5
TRC_A2D=5
TRC_SDP=5
TRC_GATT=5
TRC_SMP=5
TRC_BTAPP=5
TRC_BTIF=5
这里介绍一种在Android上捕获蓝牙数据包的方法
1. 前提
首先你要有一部Android手机
然后你的Android系统版本要在4.4及以上
我没有做过Android开发,不清楚开发者们是如何抓蓝牙包的
不过我知道可以使用hcidump来抓取蓝牙数据包
这里并不介绍这种方法(后续可能会去了解一下)
2. 开启功能
在开发者选项中有一个功能
- [Enable Bluetooth HCI snoop log/启用蓝牙 HCI 信息收集日志]
开启它
3. 抓包
然后你可以进行各种蓝牙操作,结束后的抓包文件就在
/sdcard/btsnoop_hci.log
将它拷贝出来放在电脑上,就可以用Wireshark直接看了
可以使用比如bthci_acl, btl2cap, bthfp等过滤器来过滤数据包查看你所关心的协议