HFP协议浅述
在开始学习该协议之前,先说一下学习该协议的关键点:
- 弄清该协议的应用场景,协议中定义的两个角色AG和HF
- 两个设备建立hfp连接的流程
- 基于AT指令集的控制-反馈机制,不知道AT指令集去看3GPP的电话协议
HFP简介
HFP规范定义了一组功能,比如可以使用移动电话与免提装置相结合(例如,车载蓝牙和头戴式耳机),通过蓝牙连接,为移动电话和免提装置之间提供远程无线控制和语音连接。
HFP目前的使用场景是在车载蓝牙和可穿戴无线耳机,协议中定义了两个支持HFP的设备基于点对点的交互,其Stack的结构图如下:
角色
HFP定义了音频网关(AG)和免提组件(HF)两个角色:
音频网关(AG) – 该设备为音频输入/输出的网关 。典型作为网关的设备为手机
免提组件(HF) – 该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。典型作为免提组件的设备为车机、蓝牙耳机
设备的角色一般是固定的(不排除某些厂商定制有多角色设备),比如手机固定为网关设备,车机(蓝牙耳机)固定作为免提设备。
HFP支持的特性
我们在免提端如车机,可以控制手机的接/挂电话,甚至可以控制蓝牙的断/连,所以SIG在协议中也是规定了哪些功能特性是必须支持的。
下图描述了HFP中必须支持的特性(M表示强制支持, O表示可选支持):
具体的请参考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,具体的流程图如下图所示:
其他的交互流程与此类似,《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支持的特性:
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支持的特性:
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.