安卓蓝牙如何查看和分析btsnoop.log

在做BLE的过程中好多人遇到这些问题:

1)为什么远端设备发给我的消息我没收到?

2)为什么远端设备发给我的消息和我接收到的不一样?

3)为什么我的消息发布出去?

等等。想要知道为什么,除了经典的logd(万能的printf)之外,Android蓝牙中有一个很重要的debug方式就是btsnoop.log.

这个log记录了host与controller通信的全部内容,列出了蓝牙协议栈的各个层的消息通信图谱。注意,由于这个log是协议栈自己生成的,它只列出了协议栈发出去的和接收到的消息,若是由于其它原因,例如UART 驱动丢包等导致的问题,则需要使用其它的log工具来寻找原因(例如uart sniffer)。

snoop log并不是蓝牙创造出来的东西,而是由SUN发明的一种log格式,主要应用到IEEE802 的各种log的身上。和任何文件一样,JPEG,MP3等,它有固定的格式。

感兴趣的同学可以到下面的链接来查看snoop log的格式:

http://www.fte.com/webhelp/FTS4BT/Content/Technical_Information/BT_Snoop_File_Format.htm

以及

https://www.rfc-editor.org/rfc/pdfrfc/rfc1761.txt.pdf

大致长这个样子:
这里写图片描述

我们在此不再详述snoop log文件本身的格式。知道了这些格式,其实我们自己也可以写一个btsnoop解析器,但是没有必要再造一个轮子。

wireshark和fte的capture file viewer都可以用来查看btsnoop log。

可以到如下网址下载wireshark软件。

https://www.wireshark.org/download.html

效果如下:
wireshark打开btsnoop的界面
或者到fte的网站上下载BPA500的capture file viewer软件来查看。

http://www.fte.com/products/BPA500-download.aspx

效果如下(frontline的viewer软件看起来更直观一点。):
frontline的软件打开btsnoop的界面
注意在打开btsnoop的时候右下角的打开文件格式选项要为*.log的格式。
注意选择打开文件的类型应为*.log

铺垫都说完了,再说说btsnoop log怎么样从安卓手机中来。 首先要打开手机的开发者模式(不知道怎么打开的可使用搜索引擎来搜索。笔者还记得有几个版本的安卓还需要连续点击多少下还是怎么的)并选中打开蓝牙HCI日志,例如笔者使用的的三星galaxy手机为:
打开HCI日志(此时bluedroid会生成btsnoop log)

打开这个设置之后,一般正常的手机都会生成btsnoop log,可以连上去ADB或者文件管理器来搜索查找这个文件,根据手机品牌以及型号的不同在手机里存储的位置也不同。

重要的问题来了,我们如何来查看这个文件的内容呢?

首先复习一点HCI的理论知识。

我们知道HCI其实严格意义上来讲不是一个层layer的概念(与L2CAP或者RFCOMM等相比),而是host和controller的接口,这两个接口之间传递的消息可称为HCI数据包。HCI的“纯”数据格式中并没有定义数据的流向,即是从host到controller还是相反。

host与controller传递消息时,在每个HCI包的前面会有一个indicater来指示这个HCI数据的类型,由此可以知道其方向如何。
HCI包的indicater

我们这里只说1-4的数据类型。

HCI Command Packet:host发给controller,主要是HCI 命令, 注意是命令,不是数据。

HCI Event Packet:controller发给host。对应于command packet。

HCI ACL Data Packet: host发给controller或者相反。主要是L2CAP发送和接收的数据,我们上层的所有数据,注意是数据,而不是命令,都是通过这个type来传递的。

HCI Synchronous Data Packet:用来传输语音(SCO)数据的。注意一般都会通过PCM接口来传输SCO数据。

对于一些设置名字,读取本机蓝牙地址等等的命令,都是通过HCI command packet来做的,例如:
读取本地地址的HCI命令
controller返回本机地址的event
而发送出去的和接收的上层数据都是通过ACL data packet的type来完成的,例如:
GATT读取handle 0a-0e的handle数据
返回的UUID

于是一来一回,我们就可以知道stack自己发出去(实际上是尝试发给controller)的数据,与我们从app发到stack的数据,以及stack接收到的数据,和发送到app的数据,是否一致,是否有遗漏。

上面所说的两个软件都比较清晰的列出了HCI,L2CAP以及ATT和GATT的各个层的命令和数据,也非常便于我们查看和找出问题在什么地方。

相同的,如果是调试安卓蓝牙的其它profile,例如HF或者PBAP等等,也是很方便的。

当然,这要求我们需要对协议栈的每个层次都要有基本的了解,这样才能看懂log。

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值