【HFP】蓝牙HFP协议音频连接核心技术深度解析
目录
一、音频连接建立的总体要求
1.1 发起主体与时机
1.2 前提条件
1.3 同步连接的建立
1.4 通知机制
二、不同主体发起的音频连接建立流程
2.1 连接建立触发矩阵
2.2 AG 发起的音频连接建立
2.3 HF 发起的音频连接建立
三、编解码器连接建立流程
3.1 发起条件
3.2 建立主体
3.3 编解码器连接建立(Codec Connection Setup)
3.4 编解码器通知与响应
3.5 同步连接建立
3.6 失败处理
四、可用编解码器更新
4.1 更新机制
4.2 编解码器列表要求
五、编解码器重新协商
六、音频连接释放
6.1 释放主体与时机
6.2 前提条件
6.3 释放流程
七、总结
7.1 音频连接建立流程图
7.2 音频连接释放流程图
7.3 关键命令与响应
八、参考资料
在蓝牙免提协议(HFP)体系中,音频连接管理是用户体验的核心支撑。本文将详细解析蓝牙音频连接建立(Audio Connection Setup)与释放(Audio Connection Release)的过程。
一、音频连接建立的总体要求
音频连接建立是指蓝牙设备(如耳机HF与音频网关AG)之间,根据用户操作或内部事件,建立音频数据传输通道的过程。这一过程不仅涉及音频数据的传输,还包括音频参数(如采样率、帧格式等)的协商与设置。
1.1 发起主体与时机
无论是免提设备(HF)还是音频网关(AG),在用户操作或内部事件触发时,都可根据需要发起音频连接的建立。具体而言,HF 和 AG 在通话过程中都具备发起音频连接的能力,并且在无通话进行时,它们也可能有此能力。
1.2 前提条件
-
服务级连接存在:在音频连接建立之前,AG与HF之间必须已经存在一个服务级连接(Service Level Connection)。
-
功能支持:HF和AG均需支持音频连接建立的相关功能,包括可能的编解码器协商(Codec Negotiation)。
1.3 同步连接的建立
音频连接的建立总是意味着同步连接(Synchronous Connection)的建立,并且该同步连接总是与现有的服务级连接相关联。原则上,使用本节描述的流程建立音频连接不一定与任何通话过程相关。
1.4 通知机制
发起方和接受方都需要通知对方新音频连接的存在。
二、不同主体发起的音频连接建立流程
音频连接可以由HF或AG发起,具体取决于用户操作或内部事件。发起方负责触发连接建立过程,而接收方则负责响应并确认连接。
2.1 连接建立触发矩阵
触发源 | 触发条件 | 典型场景 |
AG端 | 来电接听/媒体播放启动 | 手机自动切换车载扬声器 |
HF端 | 用户按下通话键/语音唤醒 | 车载系统发起语音拨号 |
2.2 AG 发起的音频连接建立
当 AG 要建立音频连接时,如果服务级别协商表明双方都支持编解码器连接(Codec Connection)功能,AG 应发起编解码器连接的建立流程。
关键代码示例(AG端逻辑):
void ag_initiate_audio_connection() { if (codec_negotiated) { send("+BCS=%d", selected_codec_id); start_timer(BCS_RESPONSE_TIMEOUT); } else { initiate_codec_negotiation(); }
}
2.3 HF 发起的音频连接建立
若双方都支持编解码器协商(Codec Negotiation)功能,HF 发起音频连接建立时,需触发 AG 建立编解码器连接。这是因为只有 AG 了解网络的编解码器选择和设置。具体操作是,HF 向 AG 发送 AT 命令 “AT + BCC”。若 AG 将启动编解码器连接流程,会回复 “OK”;若无法启动,则回复 “ERROR”。AG 发送 “OK” 响应后,将启动编解码器连接设置流程。建立的同步连接类型和使用的设置取决于要通过该连接传输的媒体格式。
三、编解码器连接建立流程
3.1 发起条件
在用户操作或内部事件触发时,HF 或 AG 可根据需要发起编解码器连接设置流程。并且,HF 或 AG 可能需要进行一些内部操作,如内部路由、修改音频路径的采样率、帧和 / 或采样对齐等。
3.2 建立主体
尽管音频连接可由 AG 或 HF 触发,但编解码器连接和同步连接通常由 AG 建立(除非其中一个设备是旧版设备)。
3.3 编解码器连接建立(Codec Connection Setup)
当AG或HF决定建立音频连接时,如果双方支持编解码器协商功能,则需先进行编解码器连接建立。这一步骤确保双方就使用的编解码器类型达成一致。
①AG发起编解码器连接
-
AG在服务级协商中确认双方支持编解码器协商功能后,发起编解码器连接建立过程。
-
AG根据HF提供的可用编解码器列表(通过AT+BAC命令发送),选择合适的编解码器。
②HF发起编解码器连接
-
HF在需要建立音频连接时,向AG发送AT+BCC命令,触发AG发起编解码器连接。
-
AG响应OK或ERROR,表示是否接受请求。
③编解码支持矩阵
编码类型 | 带宽 | 强制要求 | 典型码率 |
CVSD | 窄带 | 是 | 64 kbps |
mSBC | 宽带 | 可选 | 128 kbps |
LC3-SWB | 超宽带 | 可选 | 256 kbps |
3.4 编解码器通知与响应
AG 在建立同步连接之前,需通知 HF 将使用的编解码器 ID。若在当前服务级连接上至少成功选择过一次编解码器,除非下一次同步连接需要更改编解码器,否则 AG 无需再次通知 HF。若 HF 在服务级连接流程完成后发送了额外的 “AT + BAC”,则可能需要重新选择编解码器。
AG 会向 HF 发送非请求响应 “+BCS = <Codec ID>”。若 HF 支持该 ID,需用 AT 命令 “AT + BCS = <Codec ID>” 进行响应;若收到的 ID 不可用,HF 需用 “AT + BAC” 发送其可用编解码器。
AG 收到 “AT + BCS” 中与发送的 ID 相同时,总是回复 “OK”,否则回复 “ERROR”。若发送 “+BCS” 后未收到 “AT + BCS”,而是收到 “AT + BAC”,流程将结束,但 AG 可根据新收到的 “AT + BAC” 中的信息重新选择编解码器 ID 后重新启动流程。
3.5 同步连接建立
在编解码器连接建立成功后,AG负责建立同步连接。同步连接的类型和设置取决于待传输媒体格式。
①连接参数协商
-
AG根据选定的编解码器类型,确定同步连接的参数(如采样率、帧格式等)。
-
AG通过+BCS命令向HF通知将使用的编解码器ID。
②连接确认
-
HF收到+BCS命令后,发送AT+BCS=命令进行确认。
-
AG响应OK或ERROR,确认连接参数是否一致。
③ SCO与eSCO对比
参数 | SCO | eSCO |
重传机制 | 不支持 | 支持 |
时隙间隔 | 固定 | 可协商 |
典型应用 | 传统语音 | 高质量音频 |
3.6 失败处理
若在同步连接建立之前编解码器连接建立流程失败,需在建立任何同步连接之前重新启动该流程。若根据所选编解码器的要求无法建立(e)SCO 链路(例如,选择了宽带或超宽带编解码器,但具有重传功能的链路基带协商失败),AG 需重新启动编解码器连接建立流程,目的是选择一个可用的编解码器。在放弃尝试建立编解码器连接之前,应使用强制窄带编解码器(CVSD)。
以下是编解码器连接建立流程的详细流程图:
四、可用编解码器更新
4.1 更新机制
在已建立的服务级连接上,若双方都支持编解码器协商功能,HF 可随时发送 “AT + BAC”,以通知 AG 可用编解码器集合的动态变化,且无需关闭任何现有的音频连接。若 AG 已启动编解码器连接设置流程,当所选编解码器不可用时,HF 应在收到 AG 的 “+BCS” 非请求响应后发送 “AT + BAC”。
4.2 编解码器列表要求
“AT + BAC” 命令中必须始终列出强制窄带编解码器,因此该命令的列表永远不会为空,这为建立音频连接提供了一个始终可用的备用选项。若支持强制宽带编解码器或强制超宽带编解码器,除非宽带语音或超宽带语音支持暂时不可用,否则也应始终列在 “AT + BAC” 命令中。若 HF 之前在 “AT + BAC” 命令中表明支持宽带语音或超宽带语音,在 HF 发送下一个 “AT + BAC” 命令之前,AG 应分别将其解释为宽带语音或超宽带语音支持的暂时暂停。若 “AT + BAC” 命令中不包含强制宽带语音编解码器,则不应包含其他宽带语音编解码器;若不包含强制超宽带语音编解码器,则不应包含其他超宽带语音编解码器。
五、编解码器重新协商
当 AG 建立音频连接时,会根据最近一次 “AT + BAC” 命令交换中传达的可用编解码器列表来决定使用的编解码器。所选的蓝牙编解码器将在正在进行的同步连接中一直使用,无论 AG 或 HF 端的连接发生任何变化。若要更改所选的蓝牙编解码器,AG 可发起编解码器连接设置流程,重新协商后选择的新编解码器将用于下一次音频连接。
六、音频连接释放
6.1 释放主体与时机
无论是 HF 还是 AG,在用户操作或内部事件触发时,都可释放现有的音频连接。具体来说,HF 和 AG 在通话过程中都应具备释放音频连接的能力;若它们在无通话进行时能建立音频连接,那么在无通话时也应能释放该连接。
-
用户主动挂断
-
网络信号丢失
-
设备低电保护
-
QoS不达标
6.2 前提条件
音频连接存在:在音频连接释放之前,AG与HF之间必须已经存在一个音频连接。
6.3 释放流程
-
发起方触发:HF或AG可以根据用户操作或内部事件触发音频连接释放。
-
同步连接断开:音频连接释放总是意味着其对应的同步连接被断开。
-
音频路径路由:当音频连接释放时,音频路径应被路由回AG。
下面是音频连接释放的简单流程图:
时序流程:
七、总结
蓝牙音频连接的建立与释放是一个复杂而严谨的过程,涉及到多个主体(HF 和 AG)、多种命令(如 “AT + BCC”、“AT + BAC”、“AT + BCS” 等)以及多种状态的协商和切换。作为蓝牙工程师,深入理解这些规范对于开发出高质量、稳定可靠的蓝牙音频设备至关重要。在实际应用中,需要严格遵循这些规范,同时根据具体的产品需求和场景进行适当的优化和调整,以提供更好的用户体验。希望本文能为蓝牙工程师们在音频连接相关的开发工作中提供有价值的参考。
7.1 音频连接建立流程图
用户操作/内部事件 -> [HF/AG发起] -> -> 编解码器协商(如果支持) -> -> AG选择编解码器 -> -> AG发送+BCS通知HF -> -> HF确认(AT+BCS) -> -> AG建立同步连接 -> -> 音频连接建立成功
7.2 音频连接释放流程图
用户操作/内部事件 -> [HF/AG发起] -> -> 断开同步连接 -> -> 音频路径路由回AG -> -> 音频连接释放成功
7.3 关键命令与响应
①AT+BAC(Available Codecs)
-
功能:HF向AG发送可用编解码器列表。
-
格式:AT+BAC=
-
响应:无直接响应,但AG在后续步骤中可能使用此信息。
②AT+BCC(Codec Connection Trigger)
-
功能:HF触发AG发起编解码器连接。
-
格式:AT+BCC
-
响应:AG响应OK或ERROR。
③ +BCS(Bluetooth Codec Selection)
-
功能:AG向HF通知选定的编解码器ID。
-
格式:+BCS=
-
响应:HF发送AT+BCS=进行确认,AG响应OK或ERROR。
八、参考资料
-
蓝牙协议相关文档
-
蓝牙技术联盟官方网站资源