【记录】BLE|百度的旧蓝牙随身音箱手机能配对不能连接、电脑能连接不能使用的解决思路(Wireshark捕获并分析手机蓝牙报文)

发布于:2025-07-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

写在最前:我觉得我整个分析推理过程比某些推理小说好看(bushi)。

版本信息

问题设备:一台很久没用的小度智能音箱随身版,2021版,型号XD-SDA11-2101,现在买都买不到了。只有两个按键,电源键和语音键,并且语音键需要连上小度APP才能使用,电源键也不具备恢复设备的出厂设置的功能,并且也不具备手动重新开始蓝牙配对过程(这很关键,一方面,如果能恢复我肯定直接恢复出厂设置,那问题解决得就会快很多;另一方面,蓝牙配对模式一直没办法手动开启,我不知道怎么切换它的蓝牙配对,也不知道连上了之后是不是真连上了,这也是问题和最终解决方案的根源)。
问题设备来源:是活动送的,所以我不好直接联系卖家(这很关键,因为如果是买的我用不了早就去淘宝店质问了)。
调试器:Wireshark 4.2.0(我不喜欢更新安全软件,我怕更新了之后有bug),和一根能传数据的数据线(不说是USB数据线是因为连雷电接口也可以调试)。
手机型号:vivo(这个决定了开发者选项如何打开)
在这里插入图片描述

前置分析过程

问题背景:我的手机连不上,但能配对;香橙派(和树莓派差不多的东西,系统是Ubuntu22)能连上,但是无法作为音频设备;Windows电脑能找到设备,但连不上。

首先,怀疑了手机的问题,但试了新手机(2024购入)旧手机(2019购入)都连不上。

其次,怀疑了APP版本问题,根据手机的提示,当BLE设备连接不上时会提示需要用官方APP去连接,也就是小度APP。我在网上搜了半天,试了从2021年到2025年的所有年份的各一版本,APP里都让我去手机自带的蓝牙那里连接,而且都显示连不上。如下图所示:

在这里插入图片描述

进一步,我怀疑BLE设备就是单纯连不上,或许手机自带的蓝牙根本不支持BLE,香橙派是嵌入式设备为了接低功耗肯定BLE支持得非常好。于是我下载了“BLE调试助手”,没想到真的一下子就连上了,这让我对这一切都是BLE导致的深信不疑

于是我开始找手机如何降级支持BLE设备,我选择把AVRCP协议版本降级到最低,然后重启蓝牙,发现没什么用,而且说实话这也不可能有用,因为蓝牙分经典蓝牙和低功耗蓝牙BLE,AVRCP协议是经典蓝牙的应用层协议,和BLE一毛钱关系都没有:
在这里插入图片描述

简单来说是这样:

维度 BLE 经典蓝牙
技术类型 应用层协议 独立协议栈(蓝牙4.0+)
主要功能 低功耗间歇性数据传输 高数据速率传输(如音频)
依赖协议 GATT/GAP(BLE协议栈) A2DP/AVRCP等
典型应用 智能手环、传感器 蓝牙音箱、文件传输

那么真相就只剩一个,就是手机Android高版本就不支持BLE连接,而小度APP起到一个BLE连接的作用,我理应用小度APP完成这个连接。但是,很可能因为后台的协议发生了变化(毕竟百度是用私有协议去做连接的),小度后台无法正确处理和响应这个老固件的请求,所以固件太老了,要更新。这种兼容性问题官方肯定早就升级了固件,我只要找到新的固件,就可以解决它太旧的问题。

为了推送和升级固件,我下载了nRF Connect这个安卓软件(这个软件的具体教程可以参考【BLE】nRF Connect 较全面的功能介绍-CSDN博客),去连接我的设备,在重启的那一瞬间能够连接成功(它也是支持内部修改协议栈的,我用了支持BLE 4.0的连接方式去连就成功了,如下图所示,一开始没用就会显示147错误码)

在这里插入图片描述
在这里插入图片描述

刚连接时能听到小度的提示音,并且能够查询到一些报文,但是并没有音视频相关的。

我把没用音视频相关的报文的这一点,飞快地归结为都怪百度用的是私有协议,而且我觉得这肯定是协议不匹配、交互到一半的时候突然挂了。

综上所有,我觉得,要想正常连接,最终还是得从小度APP着手。我并没有非常智障地去打开逆向或者MT管理器去分析APP源代码,一方面因为所有的设备交互方案理应是存储在后台的,不然小度每年那么多设备每次都要更新一次APP烦不烦;另一方面我APP逆向和分析的水平很一般,等我在二进制代码里找到交互协议栈了我估计黄花菜都凉了。

我的想法非常简单,那就是抓取小度连接音响时的蓝牙的报文。我得到这个想法是因为我在前面调整蓝牙的协议版本的时候,打开开发者选项正好看到了vivo开发者选项里支持启用记录蓝牙HCI日志,我觉得这个东西应该就是蓝牙的完整的日志,应该可以看到连接情况。

于是我打开电脑,连接adb导出(adb是我之前就下好的,这种东西很小就几MB,建议随便网上找个)。参考Vivo 手机抓取 HCI 日志操作手册_vivo蓝牙日志代码-CSDN博客。通过以下方式就可以导出日志:

adb bugreport vivo_btsnoop

如果导不出那可以这三条依次执行一下,重启一下连接:

adb kill-server
adb start-server
adb root

导出的结果解压,然后找到cfa文件,(后缀如果还有别的东西也可以一并删除),改名成cap文件,然后用wireshark打开就好了。

然后我发现蓝牙报文分析起来和网络报文差异很大,没有办法类似直接ip.addr过滤所有的某个蓝牙的。蓝牙的要用bluetooth.某某,但是我发现并不是所有的报文里都有mac地址,更多的是只有host和controller。

总之我找了一会儿我根本就没找到哪个报文是小度连音响时候的报文。此时我甚至已经在想,要不还是联系联系店家吧,我还打开了拼多多,发现最新款小度随身智能音响也只要三十多块钱了,我再买一个都行。但是如果买的话就无法贯彻落实我的废物利用计划,就感觉不完美了😭,而且这个旧的设备音质还蛮不错的,比较浑厚的音效。

突然,看到手机上nrf connect提示我“有新设备(电脑)连接,是否要对其调试”,我点了半天是不知道为什么没反应,但是我根据这个启发又有了一个点子:nrf connect能够直接获取手机上的蓝牙报文,那我能不能wireshark连接nrf connect这个软件然后用它监听的结果呢?

于是我打开了捕获准备看看有没有可疑的网卡,结果非常乐观,我发现vivo打开usb调试并允许电脑调试,就直接存在多渠道的调试网卡了,详见下图,从蓝牙到Crash等Logcat事件一应俱全:

在这里插入图片描述

正经分析过程

基础分析思路

根据前面的分析,最简单的手机蓝牙报文分析方式是直接打开wireshark、开usb调试,然后选自己手机的蓝牙的那个驱动(就是初始化时间比较长)。

在捕获的时候,可以右键设置过滤器,来便捷地忽略大量自己不想要的报文,比如这样:
!(_ws.col.info == "Rcvd LE Meta (LE Extended Advertising Report)"),这是一个广播包。

在这里插入图片描述

报文可以选取有用的信息(比如报文详情中复制所有可见项),复制粘贴给问小白或者别的大模型,它们会告诉你蓝牙交互的过程和交互的结果及成因。

第一阶段 连接超时情况的解决

经过研究我发现我的音响能够正确返回Status报文,但是我的手机莫名其妙就只等了五秒钟,就直接又发了个Complete报文,难道是响应太慢了?

在这里插入图片描述

根据我之前调试经验,我感觉应该不是这个问题,应该是我的垃圾设备没有进入配对状态(因为我有一次尝试nRF Connect直接连接连不上,但是重启之后就能连上)。所以我重启之后再尝试,果然这次连上了,我还听到设备发出“叮咚”的连接声音,但是还是连接失败了(可以看到这回的第一次Complete时间很短只有1秒钟,说明之前出现超时确实单纯是没进入广播状态):

在这里插入图片描述

第二阶段 BLE资源不足情况的解决

虽然第一阶段第一次连接没问题,但是,我发现第一次连接时的Complete报文携带了连接失败的错误码是0x0d,查了一下说是BLE资源不足……如内存不足、连接数超限,无法处理新的连接请求。

所以可能是我的这个音箱同时连了多个设备,那么问题来了,到底谁被它连接了呢!

我不由想起了一切……已知我有一个平板、一个手机、一台电脑、一个香橙派,都尝试连接过这台设备……而现在,这些设备都在我身边。

此时我就意识到了我离真相不远了,而且我还想起来了,这个音响它有个很大的特点就是会同时搜到两个蓝牙设备,当搜到不带BLE标识的才能正常连接,只搜到一个就连不上。

我想起来了😢我全都想起来了😫。
难道真相真的只有这么简单吗?我分析了这么久折腾了这么久竟然只是设备占用?我不愿意相信,但是这就是现在最可能的原因,我还是需要试试……我一一全部先取消配对,并且干脆把蓝牙都直接关掉。

果然,新连接的报文出现了明显的不同,开始解密了:

在这里插入图片描述

但遗憾的是最终还是寄了。

我的内心竟然有一丝窃喜,因为这说明我的分析还是有价值,这个问题似乎并没有那么简单。

第三阶段 APP刷新不及时情况解决

此时有个非常诡异的现象是小度界面出现了2个可连接设备:

在这里插入图片描述

根据我的经验,我很快就怀疑是因为我没有刷新APP,我的第一次连接有问题,第二次刷出来的设备才是真的可连接但我点的是第一次。

所以我退出APP重新连接了一下,果然只有一个可连接设备,并且这次连!上!了!

在这里插入图片描述

在这里插入图片描述

恭喜我!原来之前都是因为平板占用连接了所以一直连不上!

但是又别恭喜我,因为我居然为了这点事分析了整个蓝牙交互过程……

经验总结

总结一下,这件事情告诉我们:

  1. BLE设备本来就是低功耗设备,连不上往往是因为它只能连接有限的设备,但其实经典蓝牙也是一般只能连1台,比如小度这种音箱只能连接1台设备。第一时间应该检查是否被其他的连接占用
  2. 经典蓝牙的AVRCP版本往往影响不了什么,我2021年的设备,新的协议往往还是能用的!
  3. 几乎所有的蓝牙设备的连接状态都是指示灯闪烁,不闪就真得小心了,很可能是被其他设备占用了。
  4. 调试蓝牙连接情况很简单,只要找个能传数据的线连手机和电脑,电脑上下载wireshark,手机上打开开发者模式和USB调试,就可以了,没有必要非得打开蓝牙HCI日志(因为如果不是实时分析,根本看不懂也找不到哪个报文是目标交互过程,追踪流也是灰色的不可点)
  5. 记录的蓝牙的那个模块一般含有btsnoop这个关键词,找这个相关的通常没问题。
  6. 百度的这个设备不知道为什么,搞两个蓝牙模块,一个BLE一个经典蓝牙,支持用BLE发起连接,经典蓝牙也支持直接连接。但是问题是经典蓝牙被占用了,经典蓝牙就搜不到了(正常来说所有的设备都应该要能搜到经典蓝牙的),BLE能搜到但又连不上,非常有迷惑性。
  7. 手机就是不支持BLE直接连接,另外,如果配对成功之后如果没有出现如下图所示的媒体设置信息就说明找到的蓝牙设备有问题,压根就不是音频设备
    在这里插入图片描述

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/149317187。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。