3. HFP协议详解(上):HFP角色定义(AG与HF)、服务级连接建立、AT命令集概述
HFP(Hands-Free Profile)是车载蓝牙电话免提集成的核心协议。本章将深入剖析HFP协议的基础架构,包括角色定义、服务级连接建立流程以及AT命令集概述。理解这些内容是后续实现通话控制、音频路由和状态同步的前提。
3.1 HFP角色定义:AG与HF
在HFP协议中,定义了两种明确的角色,它们构成了免提通信的双方:
- AG(Audio Gateway,音频网关):通常指手机。AG是音频信号的输入输出设备,负责处理电话网络通信、编解码以及音频数据的路由。AG拥有电话功能,是通话的发起方或接收方。
- HF(Hands-Free,免提设备):通常指车载主机或蓝牙耳机。HF是远程音频输入输出设备,提供麦克风和扬声器,用于用户与AG进行免提通话。HF控制通话的接听、挂断、音量调节等操作。
关键点: 在车载系统中,车机(IVI) 扮演 HF 角色,手机 扮演 AG 角色。HF通过AT命令控制AG,AG则通过特定的结果码和音频连接状态响应HF。
下表总结了AG与HF的核心职责差异:
| 特性 | AG(音频网关 / 手机) | HF(免提设备 / 车机) |
|---|---|---|
| 主要功能 | 电话网络接入、音频编解码、通话管理 | 用户交互、音频输入输出、远程控制 |
| 音频方向 | 发送上行音频(麦克风),接收下行音频(扬声器) | 发送下行音频(扬声器),接收上行音频(麦克风) |
| 控制角色 | 被控制端(响应AT命令) | 控制端(发送AT命令) |
| 典型设备 | 智能手机、蜂窝路由器 | 车载信息娱乐系统、蓝牙耳机 |
| 服务级连接 | 作为服务端等待连接 | 作为客户端发起连接 |
3.2 服务级连接建立流程
在HFP协议中,服务级连接(Service Level Connection, SLC)是进行AT命令交互和音频控制的前提。SLC的建立发生在RFCOMM通道建立之后,是HFP协议栈初始化的核心步骤。其流程如下:
- RFCOMM通道建立:HF与AG通过蓝牙SDP(Service Discovery Protocol)查询到HFP服务后,在RFCOMM协议层建立一条数据通道。
- AT+BRSF交换:HF发送
AT+BRSF=<HF支持的特性>命令,AG回复+BRSF: <AG支持的特性>。双方通过此命令交换各自支持的特性集(如支持3方通话、语音识别、NREC等)。 - AT+CIND读取:HF发送
AT+CIND=?查询AG支持的指示器列表,然后发送AT+CIND?读取当前所有指示器的状态(如信号强度、通话状态、漫游状态等)。 - AT+CMER设置:HF发送
AT+CMER=3,0,0,1命令,指示AG在指示器状态变化时主动发送+CIEV事件通知给HF。 - AT+CHLD查询:HF发送
AT+CHLD=?查询AG支持的通话保持与多方通话操作模式。 - SLC建立完成:完成上述步骤后,服务级连接正式建立,HF与AG可以开始进行正常的通话控制AT命令交互。
开发提示: 在车载集成开发中,务必确保HF在SLC建立过程中正确解析AG回复的
+BRSF 特性掩码。例如,如果AG不支持三方通话(bit 1为0),HF不应发送 AT+CHLD=2 命令。
下图展示了SLC建立的完整时序:
3.3 AT命令集概述
HFP协议中的AT命令集是HF控制AG的核心语言。这些命令基于标准Hayes AT命令集,并扩展了与电话功能相关的指令。AT命令通过SLC建立的RFCOMM通道进行传输。
AT命令主要分为以下几类:
- 通用命令:如
AT(测试连接)、AT+CMEE(错误报告模式)。 - 呼叫控制命令:如
ATD(拨号)、ATA(接听)、AT+CHUP(挂断)。 - 状态查询命令:如
AT+CIND(指示器状态)、AT+CLCC(当前通话列表)。 - 特性协商命令:如
AT+BRSF(特性协商)、AT+NREC(回声消除控制)。 - 电话簿与身份命令:如
AT+CPBS(选择电话簿存储)、AT+CPBR(读取电话簿条目)、AT+CNUM(读取本机号码)。
常见集成陷阱: 部分AG(尤其是iOS设备)对AT命令的时序和格式非常敏感。例如,在SLC未完全建立前发送
ATD 命令,可能导致AG无响应或返回 ERROR。建议在收到 OK 响应完成SLC建立后,再发送呼叫控制命令。
下表列出了HFP中最常用的AT命令及其用途:
| AT命令 | 方向 | 功能描述 | 典型响应 |
|---|---|---|---|
AT+BRSF=<feat> |
HF → AG | 发送HF支持的特性掩码 | +BRSF: <feat> |
AT+CIND=? |
HF → AG | 查询AG支持的指示器列表 | +CIND: (<desc>,(...)) |
AT+CMER=3,0,0,1 |
HF → AG | 启用AG主动事件通知 | OK |
ATD>nnnnn; |
HF → AG | 拨打电话号码(内存拨号) | OK 或 NO CARRIER |
ATA |
HF → AG | 接听来电 | OK 或 NO CARRIER |
AT+CHUP |
HF → AG | 挂断当前通话 | OK |
AT+VGS=<level> |
HF → AG | 设置AG的扬声器音量(0-15) | OK |
AT+VGM=<level> |
HF → AG | 设置AG的麦克风增益(0-15) | OK |
+CLCC: <idx>,... |
AG → HF | AG主动上报当前通话列表(需先发送AT+CLCC查询) | OK |
+CIEV: <ind>,<val> |
AG → HF | AG主动上报指示器状态变化(需启用CMER) | 无 |
3.4 关键AT命令交互示例
以下是一个典型的HF发起拨号并建立通话的AT命令交互序列:
// SLC 建立完成后
HF: ATD>10086; // 拨打电话 10086
AG: OK // 拨号成功,正在建立连接
// 通话建立后,AG 主动上报
AG: +CIEV: 3,1 // 通话状态指示器变为“active”
AG: +CIEV: 2,1 // 呼叫状态指示器变为“active”
// HF 调节音量
HF: AT+VGS=10 // 设置扬声器音量为 10
AG: OK
// 通话结束,AG 主动上报
AG: +CIEV: 3,0 // 通话状态指示器变为“none”
AG: +CIEV: 2,0 // 呼叫状态指示器变为“none”
AG: NO CARRIER // 通话断开连接
集成建议: 在车载系统中,建议使用状态机来管理AT命令的收发。例如,在发送
ATD 后,应等待 OK 或 NO CARRIER 响应,并同时监听 +CIEV 事件以更新UI上的通话状态。避免在未收到响应前连续发送多个AT命令。