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协议相关推荐

  1. 蓝牙协议--HFP协议--转

    HFP协议 目前HFP的使用场景有车载蓝牙,耳机和PDA,定义了AG和HFP两种角色. AG(Audio Gate)音频网关-音频设备输入输出网关      HF(Hands Free)免提-该设备作 ...

  2. 蓝牙A2DP和HFP编解码

     一.A2DP A2DP全名是(Advanced Audio Distribution Profile) 蓝牙音频传输模型协定,提供通过蓝牙连接传输音频流的能力,比如手机播放音乐,蓝牙耳机通过蓝牙连接 ...

  3. VoIP通话-基于SIP协议的Asterisk(一)-实现流程

    文章首发及后续更新:https://mwhls.top/4122.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...

  4. 蓝牙4.0 BLE协议结构图详解

    随着智能硬件的发展,嵌入式和物联网这类专业越发受到大家的追捧,而不管是学习嵌入式还是学习物联网,蓝牙4.0 BLE协议结构都是必须重点掌握的知识点,今天和大家分享的就只这部分内容,一起来看看吧. 第一 ...

  5. VoIP通话-基于SIP协议的Asterisk(零)-Demo

    文章首发及后续更新:https://mwhls.top/4116.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...

  6. 【BLE】蓝牙4.2核心协议

    [BLE]蓝牙4.2核心协议 1. 顶层设计 1) Application层 顶层,通过API函数与协议栈交互: 2) Host层 主体结构,TI提供封装后的lib库,不提供源码: 逻辑链路控制及自适 ...

  7. BT-2の蓝牙技术原理のBT协议の蓝牙核心协议の无线射频和基带

    蓝牙技术原理のBT协议の蓝牙核心协议の无线射频和基带 0. 脑图 1. 蓝牙射频 1.1 射频信道 1.2 射频规范 2. 链路控制器和基带 2.1 物理链路 2.2 分组 2.3 蓝牙编址 2.4 ...

  8. 蓝牙btsnoop log,HFP协议连接流程详解,以及RFCOMM连接和常用AT指令

    HFP(Hands-Free):蓝牙免提协议,两个角色AG,HF端,AG端通常是手机设备,HF免提端一般为耳机车载等,hfp的连接首先要进行SDP,然后建立RFCOMM,然后SLC连接完成,HFP正式 ...

  9. Android 蓝牙hfp协议连接slc连接rfcomm连接源码分析(2)- HF侧发送和接受数据流程

    android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程 Android 蓝牙hfp初始化.rfcomm连接.slc连接.sco连接源代码分析大全 - 点击下载 ...

最新文章

  1. 梦境交互:做个现代灵媒,考虑一下?
  2. python+appium+PyCharm==自动化测试APP环境
  3. HTTP请求分析工具Fiddler
  4. mysql性能监控指标及分析
  5. 如何利用python在一个文档里写入长须_Python语法入门—文件处理
  6. 【转载】COM 组件设计与应用(四)——简单调用组件
  7. base64原理核心规则
  8. Asp.Net Core WebAPI使用Swagger时API隐藏与分组
  9. MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))[MySQL插入内容超过4M]
  10. sqlite like通配符使用 -转
  11. 基于深度学习、强化学习、开源RASA对话引擎的多场景对话机器人
  12. 使用bs4+re正则来爬取网页上需要的数据
  13. ASP.NET 即时通信,WebSocket服务端实例
  14. 微型计算机的硬件系统主要核心软件,计算机硬件系统最核心的是什么
  15. linux 无法定位程序,三步搞定无法定位程序输入点 于动态链接库上
  16. input输入框只能输入字母
  17. 每日一问-ChapGPT-20221231-关于中医的各国看法
  18. h5 android 字体设置,解决因为手机设置字体大小导致h5页面在webview中变形的BUG
  19. 上海宝山锦隆考试基地科目三笔记
  20. 华为鸿蒙系统支持联发科,华为鸿蒙OS将采用高通和联发科处理器平台

热门文章

  1. Kanzi常用操作3
  2. 反转链表的golang实现
  3. Git 2.18版本发布:支持Git协议v2,提升性能
  4. 使用dwz框架搭建网站后台
  5. PHP语言 -- 基础
  6. android sqlite 怎么写入存储时间
  7. 【原创翻译】The Case for the Reduced Instruction Set Computer
  8. dhcp snooping+IPSG的一些理解
  9. 遍历Repeater与ItemDataBound事件发现的几个问题。
  10. Google在中国打败百度的方法其实很简单.只要需改变5点.