1. 问题现象与背景分析
最近在测试杰理蓝牙耳机时发现一个奇怪现象:当用户正在通话过程中,如果将主耳(通常指首次配对连接的那只耳机)放回充电仓,声音并不会自动切换到副耳(另一只耳机),而是直接切回到手机端扬声器播放。这种情况显然不符合用户预期——大多数用户会期望声音能无缝切换到副耳继续通话。
这个问题看似简单,但背后涉及到蓝牙协议栈处理、主从设备切换逻辑、音频路由策略等多个技术环节。作为一名蓝牙音频产品开发者,我花了三天时间深入排查这个问题,最终找到了根本原因和解决方案。下面将完整分享我的排查过程和修复方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 蓝牙耳机主从切换原理
2.1 传统蓝牙音频架构
在经典蓝牙音频方案中(如HSP/HFP协议),耳机与手机连接时通常会建立一个ACL链路(异步无连接链路)和一条SCO链路(同步面向连接链路)。ACL用于传输控制信号,SCO用于传输音频数据。在这种架构下:
- 主耳负责维护与手机的连接
- 副耳通过主耳中转音频数据
- 当主耳断开时,整个音频会话会终止
2.2 TWS真无线架构
现代TWS耳机采用更先进的架构:
- 连接方式:主耳与手机建立传统蓝牙连接,副耳与主耳通过私有协议连接(如杰理的私有协议)
- 角色切换:支持主副耳角色动态切换
- 音频路由:手机端通常只感知到一个音频终端(主耳),副耳对手机透明
2.3 预期行为逻辑
在正常设计中,当主耳放回充电仓时应该触发以下流程:
- 主耳检测到入仓事件
- 主耳通知手机准备切换
- 主耳将角色切换信息传递给副耳
- 副耳接管主耳角色
- 手机音频路由切换到新的主耳(原副耳)
3. 问题排查过程
3.1 现象复现与日志收集
首先建立标准测试环境:
- 使用杰理AC692X系列开发板
- 烧录最新SDK(v3.8.2)
- 配对iPhone 12和Android小米11测试
- 开启UART日志输出
测试步骤:
- 双耳出仓,正常连接手机
- 拨打电话
- 通话中放入主耳
- 观察现象并收集日志
3.2 关键日志分析
从日志中发现几个关键点:
code复制[HFP] Main ear in box event received
[RF] Role switch re
