目录

1 前言

2 btmon实现日志获取/解析

2.1 日志获取

2.2 日志解析

3 hcidump实现日志获取/解析

3.1 日志获取

3.2 日志解析

4 总结

1 前言

        在蓝牙开源协议栈BlueZ中,btmon 和 hcidump 都是用于监听和分析蓝牙通信过程的工具,两种工具通过监听蓝牙适配器的 HCI(Host Controller Interface)接口来捕获蓝牙数据包,并将其以可读的格式输出。它们之间的区别主要在于它们的实现和使用方式。

        btmon 提供了更高级的分析功能,可以解析和显示蓝牙协议栈中的各个层级的信息,包括 HCI 层和 L2CAP 层等。btmon 的输出可以用于调试和分析蓝牙协议交互,对于开发和故障排除非常有用。

        btmon抓取到数据以后搭配Ellisys Bluetooth Analyzer(一个windows端的蓝牙协议分析工具)解析数据,是笔者比较推荐的蓝牙日志分析方式。

        相比较而言,hcidump 的输出更加原始,其以十六进制格式显示蓝牙数据包的内容。hcidump 不提供对数据包的解析和分析,它只是将原始的数据包内容以较低级别的形式呈现出来。hcidump 通常用于快速捕获和查看蓝牙数据包,对于简单的调试和数据获取很有用。

        笔者接下来会根据实际应用场景逐一介绍在Linux两种工具日志的抓取方式和解析过程。

2 btmon实现日志获取/解析

        以蓝牙协议栈bluez-5.47为例,btmon源码在bluez-5.47/monitor/,BlueZ编译成功以后,生成的btmon二进制文件在该路径下获取。

2.1 日志获取

        btmon的用法如下所示:

/var/mnt/usbstate/back/bluetooth # ./btmon -h
btmon - Bluetooth monitor
Usage:
        btmon [options]
options:
        -r, --read <file>      Read traces in btsnoop format
        -w, --write <file>     Save traces in btsnoop format
        -a, --analyze <file>   Analyze traces in btsnoop format
        -s, --server <socket>  Start monitor server socket
        -p, --priority <level> Show only priority or lower
        -i, --index <num>      Show only specified controller
        -d, --tty <tty>        Read data from TTY
        -B, --tty-speed <rate> Set TTY speed (default 115200)
        -t, --time             Show time instead of time offset
        -T, --date             Show time and date information
        -S, --sco              Dump SCO traffic
        -A, --a2dp             Dump A2DP stream traffic
        -E, --ellisys [ip]     Send Ellisys HCI Injection
        -h, --help             Show help options

    常用的参数如下所示:

-w:将数据写入文件xxx.log中,该文件最好为未存在的文件,否则可能会有问题

-T:显示时间和日期

-s:开始监控的socket

-r:读取之前-w写入的文件,仅支持btmon -r xxx.log读取

-i:监控的控制设备,一般为hci0

用法示例1:日志文件保存:btmon -i hci0 -w btmon_debug.log &(&符比较重要,正常抓日志都是需要保持后台运行)

用法示例2:日志文件内容读:btmon -r btmon_debug.log

用法示例3:将读出的转为(重定向)txt文件,方便文本查看btmon -r btmon_debug.log > 1.txt

        简单地,后台可以使用类似:btmon -i hci0 -w btmon_debug.log &的方式抓取linux应用的蓝牙日志。该指令在运行的时候,会直接在当前终端打印日志内容,如下图所示,在某些时候,比如单纯做一些统计的时候或者有目的地确定一些数据点,通过直接看打印,反而更直观。

     

2.2 日志解析

        抓取的btsnoop日志*.log文件可以用wireshark、Ellisys Bluetooth Analyzer等工具打开

使用wireshark解析.log文件操作顺序如下图所示

        使用Ellisys Bluetooth Analyzer解析日志文件的操作顺序为File->Import->HCI data,commands and events->BT Snoop HCI,然后加载.log文件。如下图 所示。

        解析出来的数据可以在页面上操作查看,此过程和解析一些网络协议包的内容类似,大同小异。但是相比之下,Ellisys Bluetooth Analyzer的UI更友好,且专业性更好一点。如下图所示

         至于对解析出的每个HCI包的内容分析,在笔者后面的文章会逐步向大家讲解。

3 hcidump实现日志获取/解析

        以蓝牙协议栈bluez-5.47为例,btmon源码在bluez-5.47/tools/,BlueZ编译成功以后,生成的hcidump二进制文件在该路径下获取。

3.1 日志获取

        hcidump的用法如下图所示

/var/mnt/usbstate/back/bluetooth # ./hcidump -h
Usage: hcidump [OPTION...] [filter]
  -i, --device=hci_dev       HCI device
  -l, --snap-len=len         Snap len (in bytes)
  -p, --psm=psm              Default PSM
  -m, --manufacturer=compid  Default manufacturer
  -w, --save-dump=file       Save dump to a file
  -r, --read-dump=file       Read dump from a file
  -t, --ts                   Display time stamps
  -a, --ascii                Dump data in ascii
  -x, --hex                  Dump data in hex
  -X, --ext                  Dump data in hex and ascii
  -R, --raw                  Dump raw data
  -C, --cmtp=psm             PSM for CMTP
  -H, --hcrp=psm             PSM for HCRP
  -O, --obex=port            Channel/PSM for OBEX
  -P, --ppp=channel          Channel for PPP
  -S, --sap=channel          Channel for SAP
  -D, --pppdump=file         Extract PPP traffic
  -A, --audio=file           Extract SCO audio data
  -Y, --novendor             No vendor commands or events
  -h, --help                 Give this help list
  -v, --version              Give version information
      --usage                Give a short usage message

        常用的参数如下所示

-i:选定设备节点,一般后接hci0

-w:保存数据包到文件,一般后接形如xxx.cfa的文件格式

-t:显示时间戳

-r:读取文件内容,后接要读取的文件名

        同理简单地,后台可以使用类似:./hcidump -i hci0 -t -w bt_debug.cfa &的命令来抓取蓝牙hci日志。在Linux终端执行结果如下所示

/var/mnt/usbstate/back/bluetooth # ./hcidump -i hci0 -t -w bt_debug.cfa &
/var/mnt/usbstate/back/bluetooth # HCI sniffer - Bluetooth packet analyzer ver 5.47
btsnoop version: 1 datalink type: 1002
device: hci0 snap_len: 1500 filter: 0x0

3.2 日志解析

        hcidump获取到日志文件*.cfa后,可以采用wireshark打开,如下图所示打开的是一份抓取环境中蓝牙广播数据的日志文件

        对于数据的解析,wireshark也能提供比较完备的UI和操作。另一方面.cfa的蓝牙日志文件用Ellisys Bluetooth Analyzer其实也能打开。    

4 总结

        两种抓取蓝牙日志的方法,在通常的蓝牙应用中区别不大,笔者因为习惯用btmon来分析BlueZ运行过程中的蓝牙日志,所以更倾向于推荐该工具来抓取蓝牙数据,再者也可以搭配比较专业的蓝牙分析工具,使用起来比较顺手.

        hcidump一般蓝牙芯片原厂(比如Realtek)比较推荐使用,当我们应用他们的蓝牙方案出现问题,他们会要求我们复现场景并且抓取hcidump日志提供分析问题。

        后续如果有更方便的抓取蓝牙log和分析log的工具,会持续分享给大家。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐