HFP协议浅述

在开始学习该协议之前,先说一下学习该协议的关键点:

  • 弄清该协议的应用场景,协议中定义的两个角色AG和HF
  • 两个设备建立hfp连接的流程
  • 基于AT指令集的控制-反馈机制,不知道AT指令集去看3GPP的电话协议

HFP简介

HFP规范定义了一组功能,比如可以使用移动电话与免提装置相结合(例如,车载蓝牙和头戴式耳机),通过蓝牙连接,为移动电话和免提装置之间提供远程无线控制和语音连接。

HFP目前的使用场景是在车载蓝牙和可穿戴无线耳机,协议中定义了两个支持HFP的设备基于点对点的交互,其Stack的结构图如下:

android 蓝牙电话状态变化_指令集

角色

HFP定义了音频网关(AG)和免提组件(HF)两个角色:

音频网关(AG) – 该设备为音频输入/输出的网关 。典型作为网关的设备为手机
免提组件(HF) – 该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。典型作为免提组件的设备为车机、蓝牙耳机

设备的角色一般是固定的(不排除某些厂商定制有多角色设备),比如手机固定为网关设备,车机(蓝牙耳机)固定作为免提设备。

HFP支持的特性

我们在免提端如车机,可以控制手机的接/挂电话,甚至可以控制蓝牙的断/连,所以SIG在协议中也是规定了哪些功能特性是必须支持的。

下图描述了HFP中必须支持的特性(M表示强制支持, O表示可选支持):

android 蓝牙电话状态变化_android_02

android 蓝牙电话状态变化_数据_03

android 蓝牙电话状态变化_蓝牙_04

具体的请参考HFP_v1.7.1 第3章,在table3.2中还有关于每个特性支持的操作介绍!

AT指令介绍

这个在协议中是没有的,因为HFP的通讯都是按照AT指令格式的,觉得有必要简单的说一下!

AT指令的编码格式为ASCII码,下面我举个例子说明一下

假如我定义三个指令,提示通话AT+CALLCOMING=<State,1为有来电,0为没有来电>\r\n;控制接听挂断AT+CALLCTR=<Control,1为接听,0为挂断>\r\n;确认OK\r\n

当手机端来电时,向车机端发送:

AT+CALLCOMING=1\r\n

当车机端收到该指示之后,如果接听电话,则发送:

AT+CALLCTR=1\r\n

当手机端接收控制指令,并回复:

OK\r\n

上面就是一个简单的指令交互过程,当然指令都是为虚构的,实际以3GPP和SIG定义的指令为准!

HFP控制交互流程

Hfp交互是建立在RFCOMM(串口仿真协议)上的at指令协议,其at指令协议遵循3GPP和GSM定义的控制/指示协议,同时加入了一些蓝牙定义的指令,SIG定义的指令集我也单独整理了一份,在网盘链接资料中中名为《HFP AT指令集》,大家可根据实际需求自行查阅。

hfp有跟多的交互过程,比如建立/断开链接,接/挂电话,获取远端状态等等,每个过程都有固定的交互流程,具体的请参考HFP_v1.7.1 第4章,下面我将对一个实际的交互场景做简述。

建立服务层连接

首先要确保RFCOMM层连接已建立,然后双方会交换彼此支持的特性,HF将发送AT+BRSF=<HF support features>通知AG,AG会发送+BRSF回复。如果两端都支持codec协商特性,HF将发送AT+BAC=<HF available codecs in the HF>通知AG端其所支持的codec,具体的流程图如下图所示:

android 蓝牙电话状态变化_指令集_05

android 蓝牙电话状态变化_android 蓝牙电话状态变化_06

其他的交互流程与此类似,《HFP_v1.7.1》第四章对每个过程都说的很详细,这里就不多说了。

HFP协议数据分析

分析的log使用手机进行抓取,log会放在我的蓝牙学习笔记(序)的百度链接中,可用capture file viewer打开。

其中蓝色的部分是HCI的数据,绿色为具体的L2CAP的数据,黄色为RFCOMM部分数据,红色为HFP协议数据,在此我们对HFP数据进行解析,有兴趣可以看我其他协议的分析文档。

1)、Slave(HF)

00000010 00000010 00100000 00010101 00000000 00010001 00000000 01000011 00000000  00001001 11111111 00011001 00000110 01000001 01010100 00101011 01000010 01010010 01010011 01000110 00111101 00110001 00111001 00110000 00001101 01011100

AT指令为:AT+BRSF=190\n(注:hfp协议部分是以ascii表示的字符串)

将190转换为二进制为10111110,根据下表可查得HF支持的特性:

android 蓝牙电话状态变化_android 蓝牙电话状态变化_07

2、Master(AG)

00000010 00000010 00100000 00010111 00000000 00010011 00000000 11000000 00000000 00001011 11111111 00011101 00000100 00001101 00001010 00101011 01000010 01010010 01010011 01000110 00111010 00100000 00111000 00110111 00110001 00001101 00001010 10000110

AT指令为:\r\n+BRSF: 871\r\n

将871转换为二进制为1101100111,根据下表可查得AG支持的特性:

android 蓝牙电话状态变化_android 蓝牙电话状态变化_08

3、Master(AG)

00000010 00000010 00100000 00001110 00000000 00001010 00000000 11000000 00000000 00001011 11101111 00001101 00001101 00001010 01001111 01001011 00001101 00001010 10011010

AT指令为:\r\nOK\r\n

对收到AT+BRSF=190\n且正确执行的回复

4、Slave(HF)

00000010 00000010 00100000 00010011 00000000 00001111 00000000 01000011 00000000 00001001 11101111 00010111 01000001 01010100 00101011 01000010 01000001 01000011 00111101 00110001 00101100 00110010 00001101 01000000

AT指令为:AT+BAC=1,2\n

查指令集可知该指令为通知AG,HF端支持的codec的命令,1和2分别代表CVSD和mSBC.