蓝牙设备配对成功,指示灯显示已连接,但就是无法使用——耳机没声音、鼠标不动、App读不到数据。这种“配对但无服务”的问题往往比连接失败更让人头疼,因为物理链路已经建立,问题隐藏在更深层的服务发现或加密协商中。此时,蓝牙抓包是揭开真相的利器。
为什么配对成功却没有服务?
经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)的服务发现机制不同。配对成功只表示链路层认证和加密完成,但上层应用需要进一步探知对方提供了哪些服务(如电池服务、设备信息服务、音频服务等)。如果服务发现过程受阻,设备就会“假死”。常见原因有:主机未发起服务发现请求、从机未正确响应、MTU协商失败、服务的UUID不匹配、某些特征需要加密但秘钥未正确分发。
用蓝牙抓包捕获关键交互
要定位这类问题,需要抓取空口包。可以使用USB Dongle(如Nordic 52840 DK)配合Wireshark,或者抓取手机端的HCI日志(Android 开启“蓝牙HCI snoop log”)。蓝牙抓包能得到主机与从机之间的完整交互序列。
重点关注三个阶段:连接建立后,主机发送“交换MTU”请求(Exchange MTU Request),从机回复响应。如果这一步失败,后续的服务发现包会因数据长度不匹配而被丢弃。接着,主机发送“读取主服务请求”(Read by Group Type Request,UUID设为0x2800),从机应回复服务列表。蓝牙抓包可以清晰看到从机是否回复以及回复的服务句柄范围。

典型问题一:从机未响应服务发现
某智能手环配对后,手机App无法获取运动数据。蓝牙抓包显示:主机连续发送了3次“读取主服务请求”,从机均未响应,直到超时断开。原因是从机蓝牙协议栈的GATT Server未正确初始化。通过抓包确认现象后,固件工程师增加了服务注册延迟,问题解决。
典型问题二:特征值需要加密但密钥未分发
一个蓝牙血压计配对成功,App读不到测量值。蓝牙抓包发现:主机成功发现服务,但在读取某个特征值时,从机返回“Insufficient Authentication”(加密不足)。进一步看,配对过程只进行了“Just Works”绑定,没有生成用于加密特征值的LTK。解决方案是修改从机安全等级或主机发起加密请求。
典型问题三:UUID类型不匹配
主机默认搜索128-bit UUID,但从机广播的是16-bit UUID,导致服务匹配失败。蓝牙抓包捕获的服务发现请求中使用的是“UUID-16”,而从机期望“UUID-128”。统一UUID格式后正常通信。
实操建议
进行蓝牙抓包时,建议同时记录时间戳和RSSI,便于分析时序问题。如果抓包文件很大,使用Wireshark过滤器“gatt”或“att”快速定位服务发现包。对于常规排查,重点查看是否有“Error Response”或“Not Found”等错误码。
“配对成功但无服务”的本质是上层协议交互失败。借助蓝牙抓包,工程师无需猜测,直接看到双方的命令与响应,几小时内就能锁定问题根源。无论你是嵌入式开发者还是产品测试人员,掌握这一技能都能大幅提升调试效率。





微信公众号