蓝牙通话之HFP协议

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.

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值