4. HFP 连接建立流程:服务发现、RFCOMM 通道建立、AT 命令握手与服务级别连接

HFP(Hands-Free Profile)的连接建立并非简单的蓝牙链路连接,而是一个分阶段、协议栈逐层交互的复杂过程。整个流程可划分为四个核心阶段:服务发现(SDP)、RFCOMM 通道建立、AT 命令握手以及服务级别连接(SLC)。任何阶段的失败都会导致车载免提功能不可用。

4.1 连接建立总览

下表总结了四个阶段的核心任务、涉及协议及典型耗时,帮助开发者建立全局视角:

阶段 核心任务 涉及协议/机制 典型耗时
1. 服务发现 查询 HF 设备支持的 HFP 版本、RFCOMM 通道号 SDP(Service Discovery Protocol) 50 ~ 200 ms
2. RFCOMM 通道建立 在 SDP 获取的通道号上建立串口仿真连接 RFCOMM、L2CAP 100 ~ 300 ms
3. AT 命令握手 交换 AT+BRSF、AT+CIND、AT+CMER 等命令 AT 命令集(HFP 指定子集) 200 ~ 500 ms
4. 服务级别连接 确认双方能力、建立音频(SCO/eSCO)链路 SCO/eSCO、AT+CHLD、AT+CCWA 100 ~ 300 ms
工程提示: 在车载嵌入式系统中,整个 HFP 连接建立的总耗时通常控制在 1 ~ 2 秒内。若超过 3 秒,用户会明显感知“连接慢”,需重点排查 SDP 查询超时或 RFCOMM 参数配置不当。

4.2 阶段一:服务发现(SDP)

服务发现是 HFP 连接的第一步。车载单元(AG,Audio Gateway)通过 SDP 查询手机(HF)是否支持 HFP,并获取建立 RFCOMM 连接所需的通道号。

  • 查询对象: HF 设备的 SDP 服务器。
  • 查询内容: HFP 服务类 UUID(0x111E 或 0x111F)。
  • 关键参数: RFCOMM 服务器通道号(Server Channel Number)。
  • 协议序列: SDP_ServiceSearchAttributeRequest / Response。

车载 AG 端必须解析 SDP 响应中的 Protocol Descriptor List,提取出 RFCOMM 通道号。若解析失败或通道号为 0,则连接无法继续。

避坑指南: 部分手机在 SDP 响应中会返回多个 HFP 版本(如 1.6 和 1.7)。车载端应优先选择最高版本,但必须确保自身固件支持该版本的 AT 命令集。版本不匹配会导致后续 AT 握手失败。

4.3 阶段二:RFCOMM 通道建立

获取到 RFCOMM 通道号后,AG 发起 RFCOMM 连接。RFCOMM 模拟串口通信,为上层 AT 命令提供可靠的双向数据传输通道。

  • 底层依赖: L2CAP 信道(PSM = 3)。
  • 关键参数: MTU(最大传输单元)、信用流控(Credit-Based Flow Control)。
  • 典型流程:
    1. AG 发送 L2CAP 连接请求(PSM = 3)。
    2. HF 接受后,RFCOMM 层进行复用参数协商。
    3. AG 发送 SABM(Set Asynchronous Balanced Mode)帧建立 DLC(Data Link Connection)。
    4. HF 回复 UA(Unnumbered Acknowledgment)确认。

RFCOMM 连接成功后,AG 和 HF 之间就建立了一条虚拟串口链路,可以开始传输 AT 命令。

注意: 车载嵌入式系统中,RFCOMM 的 MTU 值建议设置为 256 或 512 字节。过小的 MTU 会导致 AT 命令分片过多,增加握手延迟;过大的 MTU 可能超出部分蓝牙芯片的缓冲区,导致丢包。

4.4 阶段三:AT 命令握手

RFCOMM 通道建立后,AG 与 HF 通过 AT 命令进行能力协商。这是 HFP 连接中最关键的交互阶段,决定了后续支持的功能集。

标准握手序列如下:

步骤 发送方 AT 命令 含义 典型响应
1 AG AT+BRSF=<bearer> 查询 HF 支持的特性(如 3 方通话、语音识别) +BRSF: <feature_bitmask>
2 HF AT+BRSF=<bearer> HF 回复自身支持的特性掩码 OK
3 AG AT+CIND=? 查询 HF 支持的指示器(信号强度、电池电量等) +CIND: (<range>,...)
4 AG AT+CIND? 读取当前指示器状态 +CIND: <status>,...
5 AG AT+CMER=3,0,0,1 启用指示器事件主动上报 OK
6 AG AT+CHLD=? 查询呼叫保持/多方通话能力 +CHLD: (<actions>)
工程经验: 在车载项目中,AT+BRSF 的响应超时时间建议设置为 5 秒。部分低端手机在 RFCOMM 建立后需要短暂时间初始化 AT 解析器,过早发送命令会导致无响应。

4.5 阶段四:服务级别连接(SLC)

服务级别连接(Service Level Connection)是 HFP 连接建立的最终阶段。当 AT 命令握手完成后,AG 和 HF 之间已经建立了完整的控制通道,此时可以建立音频通道(SCO/eSCO)用于通话。

SLC 建立的标志:

  • AG 收到 HF 对 AT+CMER 的 OK 响应。
  • 双方已交换 AT+BRSF 特性掩码,并确认共同支持的功能。
  • AG 可以发起 AT+CCWA(呼叫等待通知)等可选命令。

音频连接(SCO/eSCO)的建立由 AG 主动发起,通过 HCI 命令 Add SCO Connection 完成。SCO 链路参数(如传输速率、数据包类型)需与 HF 协商。

关键指标: SLC 建立完成后,车载系统应能立即收到 HF 上报的 +CIEV: <indicator>,<value> 事件,例如信号强度变化、电池电量变化。若长时间未收到事件,需检查 AT+CMER 参数是否正确。

4.6 完整连接流程 SVG 图

下图展示了 HFP 连接建立的完整时序,涵盖 SDP、RFCOMM、AT 握手及 SLC 四个阶段:

HFP 连接建立完整流程 车载 AG 手机 HF SDP 查询 SDP_ServiceSearchAttributeRequest SDP_ServiceSearchAttributeResponse (通道号) RFCOMM 连接 L2CAP 连接请求 (PSM=3) RFCOMM DLC 建立 (SABM/UA) AT 命令握手 AT+BRSF, AT+CIND, AT+CMER OK / +BRSF: <mask> SLC 建立 AT+CHLD=?, AT+CCWA OK / +CHLD: (<actions>) SCO/eSCO 音频 HCI_Add_SCO_Connection SCO 链路建立完成 说明 SLC 建立后,AG 可接收 HF 上报的 +CIEV 事件 音频链路建立后,方可进行通话

4.7 各阶段关键参数与配置建议

下表汇总了车载嵌入式开发中 HFP 连接各阶段的关键参数及推荐配置:

阶段 参数 推荐值 说明
SDP SDP 查询超时 5 ~ 10 秒 避免因手机响应慢导致连接中断
RFCOMM MTU 大小 256 或 512 字节 平衡延迟与吞吐量
RFCOMM 信用流控窗口 4 ~ 8 防止接收端缓冲区溢出
AT 握手 AT+BRSF 超时 5 秒 部分手机初始化较慢
AT 握手 AT+CMER 重试次数 3 次 防止偶发丢包导致注册失败
SLC SCO 数据包类型 HV3 或 EV3 HV3 用于经典蓝牙,EV3 用于 eSCO

4.8 常见问题与排查思路

  • SDP 查询无响应: 检查蓝牙链路是否已建立(ACL 连接)。若 ACL 未建立,SDP 无法工作。
  • RFCOMM 连接失败: 确认 SDP 返回的通道号是否正确。部分手机通道号会动态变化。
  • AT 命令无响应: 检查 RFCOMM 链路是否正常。可通过发送 AT 测试命令验证。
  • SLC 建立后无音频: 检查 SCO 链路参数是否与 HF 兼容。尝试降低 SCO 数据包类型。
重要: 在车载项目中,HFP 连接建立失败最常见的原因是 RFCOMM 通道号错误 或 AT 命令超时。建议在固件中增加详细的日志输出,记录每个阶段的耗时和返回码,便于快速定位问题。