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 |
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,则连接无法继续。
4.3 阶段二:RFCOMM 通道建立
获取到 RFCOMM 通道号后,AG 发起 RFCOMM 连接。RFCOMM 模拟串口通信,为上层 AT 命令提供可靠的双向数据传输通道。
- 底层依赖: L2CAP 信道(PSM = 3)。
- 关键参数: MTU(最大传输单元)、信用流控(Credit-Based Flow Control)。
- 典型流程:
- AG 发送 L2CAP 连接请求(PSM = 3)。
- HF 接受后,RFCOMM 层进行复用参数协商。
- AG 发送 SABM(Set Asynchronous Balanced Mode)帧建立 DLC(Data Link Connection)。
- HF 回复 UA(Unnumbered Acknowledgment)确认。
RFCOMM 连接成功后,AG 和 HF 之间就建立了一条虚拟串口链路,可以开始传输 AT 命令。
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 协商。
+CIEV: <indicator>,<value> 事件,例如信号强度变化、电池电量变化。若长时间未收到事件,需检查 AT+CMER 参数是否正确。
4.6 完整连接流程 SVG 图
下图展示了 HFP 连接建立的完整时序,涵盖 SDP、RFCOMM、AT 握手及 SLC 四个阶段:
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 数据包类型。