蓝牙通话之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.
蓝牙通话之HFP协议相关推荐
- 蓝牙协议--HFP协议--转
HFP协议 目前HFP的使用场景有车载蓝牙,耳机和PDA,定义了AG和HFP两种角色. AG(Audio Gate)音频网关-音频设备输入输出网关 HF(Hands Free)免提-该设备作 ...
- 蓝牙A2DP和HFP编解码
一.A2DP A2DP全名是(Advanced Audio Distribution Profile) 蓝牙音频传输模型协定,提供通过蓝牙连接传输音频流的能力,比如手机播放音乐,蓝牙耳机通过蓝牙连接 ...
- VoIP通话-基于SIP协议的Asterisk(一)-实现流程
文章首发及后续更新:https://mwhls.top/4122.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...
- 蓝牙4.0 BLE协议结构图详解
随着智能硬件的发展,嵌入式和物联网这类专业越发受到大家的追捧,而不管是学习嵌入式还是学习物联网,蓝牙4.0 BLE协议结构都是必须重点掌握的知识点,今天和大家分享的就只这部分内容,一起来看看吧. 第一 ...
- VoIP通话-基于SIP协议的Asterisk(零)-Demo
文章首发及后续更新:https://mwhls.top/4116.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...
- 【BLE】蓝牙4.2核心协议
[BLE]蓝牙4.2核心协议 1. 顶层设计 1) Application层 顶层,通过API函数与协议栈交互: 2) Host层 主体结构,TI提供封装后的lib库,不提供源码: 逻辑链路控制及自适 ...
- BT-2の蓝牙技术原理のBT协议の蓝牙核心协议の无线射频和基带
蓝牙技术原理のBT协议の蓝牙核心协议の无线射频和基带 0. 脑图 1. 蓝牙射频 1.1 射频信道 1.2 射频规范 2. 链路控制器和基带 2.1 物理链路 2.2 分组 2.3 蓝牙编址 2.4 ...
- 蓝牙btsnoop log,HFP协议连接流程详解,以及RFCOMM连接和常用AT指令
HFP(Hands-Free):蓝牙免提协议,两个角色AG,HF端,AG端通常是手机设备,HF免提端一般为耳机车载等,hfp的连接首先要进行SDP,然后建立RFCOMM,然后SLC连接完成,HFP正式 ...
- Android 蓝牙hfp协议连接slc连接rfcomm连接源码分析(2)- HF侧发送和接受数据流程
android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程 Android 蓝牙hfp初始化.rfcomm连接.slc连接.sco连接源代码分析大全 - 点击下载 ...
最新文章
- 梦境交互:做个现代灵媒,考虑一下?
- python+appium+PyCharm==自动化测试APP环境
- HTTP请求分析工具Fiddler
- mysql性能监控指标及分析
- 如何利用python在一个文档里写入长须_Python语法入门—文件处理
- 【转载】COM 组件设计与应用(四)——简单调用组件
- base64原理核心规则
- Asp.Net Core WebAPI使用Swagger时API隐藏与分组
- MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))[MySQL插入内容超过4M]
- sqlite like通配符使用 -转
- 基于深度学习、强化学习、开源RASA对话引擎的多场景对话机器人
- 使用bs4+re正则来爬取网页上需要的数据
- ASP.NET 即时通信,WebSocket服务端实例
- 微型计算机的硬件系统主要核心软件,计算机硬件系统最核心的是什么
- linux 无法定位程序,三步搞定无法定位程序输入点 于动态链接库上
- input输入框只能输入字母
- 每日一问-ChapGPT-20221231-关于中医的各国看法
- h5 android 字体设置,解决因为手机设置字体大小导致h5页面在webview中变形的BUG
- 上海宝山锦隆考试基地科目三笔记
- 华为鸿蒙系统支持联发科,华为鸿蒙OS将采用高通和联发科处理器平台