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协议栈初始化的核心步骤。其流程如下:

  1. RFCOMM通道建立:HF与AG通过蓝牙SDP(Service Discovery Protocol)查询到HFP服务后,在RFCOMM协议层建立一条数据通道。
  2. AT+BRSF交换:HF发送 AT+BRSF=<HF支持的特性> 命令,AG回复 +BRSF: <AG支持的特性>。双方通过此命令交换各自支持的特性集(如支持3方通话、语音识别、NREC等)。
  3. AT+CIND读取:HF发送 AT+CIND=? 查询AG支持的指示器列表,然后发送 AT+CIND? 读取当前所有指示器的状态(如信号强度、通话状态、漫游状态等)。
  4. AT+CMER设置:HF发送 AT+CMER=3,0,0,1 命令,指示AG在指示器状态变化时主动发送 +CIEV 事件通知给HF。
  5. AT+CHLD查询:HF发送 AT+CHLD=? 查询AG支持的通话保持与多方通话操作模式。
  6. SLC建立完成:完成上述步骤后,服务级连接正式建立,HF与AG可以开始进行正常的通话控制AT命令交互。
开发提示: 在车载集成开发中,务必确保HF在SLC建立过程中正确解析AG回复的 +BRSF 特性掩码。例如,如果AG不支持三方通话(bit 1为0),HF不应发送 AT+CHLD=2 命令。

下图展示了SLC建立的完整时序:

HFP 服务级连接(SLC)建立时序图 HF(车机) AG(手机) 1. RFCOMM 通道建立 2. AT+BRSF=<HF特性> 3. +BRSF: <AG特性> 4. AT+CIND=? / AT+CIND? 5. +CIND: 指示器列表/状态 6. AT+CMER=3,0,0,1 7. OK 8. AT+CHLD=? 9. +CHLD: (0,1,1x,2,2x,3) 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命令。