【经典蓝牙】 蓝牙HFP层协议分析
HFP 概述
HFP概念介绍
HFP(Hands-Free Profile), 是蓝牙免提协议, 可以让蓝牙设备对对端蓝牙设备的通话进行控制,例如蓝牙耳机控制手机通话的接听、 挂断、 拒接、 语音拨号等。HFP中蓝牙两端的数据交互是通过定义好的AT指令来通讯的。
蓝牙架构图:

由上面架构图可以看出,HFP是定义在RFCOMM协议上的,分为AG(Audio Gateway)和HF(Hand-Free)两个角色。 例如我们平时用的手机中的 HFP 的角色就是 AG,蓝牙耳机中的 HFP 角色就是 HF 。
HFP通讯流程
HFP通讯首先要建立HFP连接,HFP连接可以由HF端发起,也可以由AG端发起。而且从上面的架构图可以看出,HFP是建立在RFCOMM协议层之上的,所以建立HFP连接的前提是RFCOMM层已经建立起连接。HF端和AG端的通讯流程如下图:

如上图所示:
●步骤一:双方建立HFP连接后,HF端发送AT+BRSF=<HF supported features> 指令,AG 会回复+BRSF=<AG supported features> ,此命令就是用于 HF 和 AG 互相告知对方支持的特性。
●步骤二:根据双方上面交换的特性,如果 HF 和 AG 都支持 BRSF 中的 Codec negotiation ,则HF发送AT+BAC=<HF available codecs> 命令告知AG, 自己支持的 codec是CVSD 编码还是 SBC编码,CVSD编码是窄带通话NBS,采样率是8KHz, SBC为宽带通话WBS,采样率为16KHz。
●步骤三: 双方交换完编码后,HF端发送 AT+CIND=? 问 询 支 持 的 indicators( 包括service/call/callsetup/callheld/signal/roam/ battchg)的 index ,AG返回支持的 indicators,以及对应的index, HF端解析收到的数据。解析后,HF发送 AT+CIND?问询各个 indicators 的 status , AG端返回所有的indicators的status。
●步骤四: HF可以发送AT+CMER 命令来使能(或关闭)各个indicators,发送该命令后,如果某一个indicator有变化,那么AG就会发送+CIEV指令来告知HF端。
●步骤五: 以上命令发送完成后,如果双方都支持三方通话特性,则HF端发送 AT+CHLD= ? 来查询手机三方通话的支持的具体特性都有哪些。
●如果 HF & AG 都支持 HF Indicators 的 feature,那么 :
○HF 发送 AT+BIND=<HF supported HF indicators>来告知 AG 支持那些 indicator
○发送 AT+BIND=?问询 AG 支持哪些 indicator
○发送 AT+BIND?问询 AG 哪些 indicator 是 enable 的
○发送 AT+BIEV 来使能某一个 indicator
HFP特性介绍
HFP支持的所有的特性,列表如下图:


1.Connection management: HFP的连接和断开,HF端和AG端都可以发起
2.Phone status information:手机状态信息特性。 AG端状态改变后会通知到HF端,例如:手机信号强度,手机电量、手机漫游信息,手机通话状态(响铃、接听、挂断)。 HF端也可以通过这个来查询手机的网络状态。
3.Audio connection: 这个是通话数据SCO通道的建立,用来传输电话音频数据的。 这个跟上面HFP通道的建立不是一回事。 HF & AG 都可以建立 Audio 通道,HF 和 AG 也都可以主动断开 SCO, 断开SCO通道是使用 HCI command 来断开的。
4.Accept an incoming voice call : 该指令是用来接听电话的,里面分别包含了,从HF端和AG端接听电话的操作。 需要强调的是,来电后里面有一个 in band ring 的概念,表示是否支持来电铃声从AG端传到HF端。
a.支持 in band ring 的 AG 在 incoming call 的时候,会先建立 audio connection(SCO),然后在 RING AT command 之后传过来声音, 也就是手机铃声, 直到被接听或者挂断, 或者其他原因中断 incoming call 为止。
b.no in band ring是在 call active 的时候才会建立 SCO, 所以此时候 HF 要在 incoming call的时候自己做一个铃声。
5. Reject an Incoming Call : 拒接电话。分为HF端和AG端拒接电话,AG端挂断电话会通过CIEV指令将状态发送到HF端。
6.Terminate a Call Process : 挂断电话。 与拒接电话流程类似。
7.Audio Connection Transfer towards the HF :表示在通话过程中,连接SCO
8.Audio Connection Transfer towards the AG : 表示在通话过程中,断开SCO
9.Place a call with the phone number supplied by the HF :HFP 主动拨号功能
10.Memory Dialing from the HF : 语音信箱功能, 就是我们在手机长按 1 或者 2 或者任意一个数字, 会有自动拨号功能, 通过蓝牙操纵这个 AT command 的前提是手机已经自动设计好了, 比如我们设置的 1 为 10086, 那么我们发送 ATD>1;就会自动拨打 10086 。
11. Last Number Re-Dial from the HF : 拨打最后一次号码的功能
12. Call waiting notification : 通话等待通知。使能后,在通过中在来电AG就会自动发送过来 +CCWA:xxx。
13. Three-Way Call Handling :当三方通话出现的情况下, HF 给 AG 的操纵 AT command,格式为 AT+CHLD=xxxx
14. 1Echo canceling (EC) and noise reduction (NR) : 取消ECHO和降噪。
15. Voice Recognition Activation / Enhanced Voice Recognition Activation : 语音识别的打开和关闭。
16. Attach a Phone Number to a Voice Tag : 将语音标签与呼叫的号码进行绑定。
17. Transmit DTMF Codes : 比如拨打 10086 的时候, 通话中语音会让你选择按键, 此命令就是通 过 HF 端发送按键信息的。
18. Remote Audio Volume Control : 音量和麦克风增益控制。 在手机上控制音量后,可以发送同步给HF端。HF端音量改变后,也可以同步给AG(手机)端。
19. Response and Hold:将来电暂时挂起,该功能限制较多,不常用。
20. Subscriber Number Information : 获取本地手机的号码。
21. Enhanced Call Control Mechanisms : 高级通话控制机制
22. Individual Indicator Activation :分别控制indicator 的开关。
23. Wide Band Speech : 采样率选择。CVSD: 8K采样率 SBC: 16K采样率
24. Codec Negotiation : 编码方式协商,上面介绍过
25.HF Indicators : HF的状态指示,前面介绍过
相关文章:
【经典蓝牙】 蓝牙HFP层协议分析
HFP 概述 HFP概念介绍 HFP(Hands-Free Profile), 是蓝牙免提协议, 可以让蓝牙设备对对端蓝牙设备的通话进行控制,例如蓝牙耳机控制手机通话的接听、 挂断、 拒接、 语音拨号等。HFP中蓝牙两端的数据交互是通过定义好的AT指令来通讯的。 &am…...
互联网摸鱼日报(2023-02-26)
互联网摸鱼日报(2023-02-26) InfoQ 热门话题 迁移工具 Air2phin 宣布开源,2 步迁移 Airflow 至 Dolphinscheduler 专访奇安信董国伟博士:目前开源安全的现状并不乐观,但其重要性已成各方共识 专访Brian Behlendorf&…...
关于程序员中年危机的一个真实案例
关于中年危机,网上已经有了各种各样的解读。但是,这两天一个学员跟我简单几句聊天,却触发了对于中年危机的另一种思考。如果你曾经也有点迷茫,或许你可以稍微花几分钟看下这个故事。 一、无奈的故事 39岁还出来面试&#x…...
【fly-iot飞凡物联】(2):如何从0打造自己的物联网平台,使用开源的技术栈搭建一个高性能的物联网平台,目前在设计阶段。
目录前言1,fly-iot 飞凡物联2,mqtt-broker 服务3, 管理后台产品/设备设计4,数据存储目前使用mysql,消息存储到influxdb中5,规则引擎使用 ekuiper6, 总结和其他的想法前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/detail…...
Hadoop MapReduce
目录1.1 MapReduce介绍1.2 MapReduce优缺点MapReduce实例进程阶段组成1.3 Hadoop MapReduce官方示例案例:评估圆周率π(PI)的值案例:wordcount单词词频统计1.4 Map阶段执行流程1.5 Reduce阶段执行流程1.6 Shuffle机制1.1 MapReduc…...
时间复杂度和空间复杂度详解
有一堆数据需要排序,A要使用快速排序,B要使用堆排序,A认为自己的代码更高效,B也认为自己的代码更高效,在这种情况下,怎么来判断谁的代码更好一点呢?这时候就有了时间复杂度和空间复杂度。 目录 …...
【C++】面向对象---封装
【C】面向对象—封装 1.封装的意义 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活的事物将属性和行为加以权限控制 封装意义一: 在设计类的时候,属性和行为写在一起,表现事物 语…...
Docker简介
一、介绍容器虚拟化技术(带环境安装的一种解决方案)打破程序即应用的观念,透过镜像image将作业系统核心除外,运用应用程序所需要的运行环境,由上而下打包,达到应用程序跨平台间的无缝接轨运作。Docker是基于…...
量化学习(一)数据获取
试验环境 windows10 AnacondaPyCharm(小白参考文章:https://coderx.com.cn/?p14) VM中安装MySQL5.7(设置utf8及相应配置优化) 关于复权 小白参考文章:https://zhuanlan.zhihu.com/p/469820288 数据来源 AK…...
java并发编程讨论:锁的选择
java并发编程 线程堆栈大小 单线程的堆栈大小默认为1M,1000个线程内存就占了1G。所以,受制于内存上限,单纯依靠多线程难以支持大量任务并发。 上下文切换开销 ReentrantLock 2个线程交替自增一个共享变量,使用ReentrantLock&…...
大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——ReduceTask工作机制
1、ReduceTask工作机制 ReduceTask工作机制,如下图所示。 (1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直…...
Nginx的介绍、安装与常用命令
前言:传统结构上(如下图所示)我们只会部署一台服务器用来跑服务,在并发量小,用户访问少的情况下基本够用但随着用户访问的越来越多,并发量慢慢增多了,这时候一台服务器已经不能满足我们了,需要我们增加服务…...
less基础
一、less介绍 1、介绍 是css预处理语言,让css更强大,可以实现在less里面定义变量函数运算等 2、less默认浏览器不识别 less转成csS (框架: less/sass 框架的内置了转码less-css) 3、使用语法 1.创建less文件xxx.less 后缀.less 2. less编译成css 再引入…...
电子统计台账:海量数据中导入特定行,极力减少键盘编辑工作量
1 前言从事企业统计工作的小伙伴,本来已经够忙的了,现在又要加上什么电子台账这种鬼任务,而且居然还要每月来一次,简直不能忍。如果非要捏着鼻子忍了,那么有什么办法,减轻工作量?2 问题的提出有…...
ChatGPT是如何训练得到的?通俗讲解
首先声明喔,我是没有任何人工智能基础的小白,不会涉及算法和底层原理。 我依照我自己的简易理解,总结出了ChatGPT是怎么训练得到的,非计算机专业的同学也应该能看懂。看完后训练自己的min-ChatGPT应该没问题 希望大牛如果看到这…...
刷题28-有效的变位词
32-有效的变位词 解题思路: 注意变位词的条件,当两个字符串完全相等或者长度不等时,就不是变位词。 把字符串中的字符映射成整型数组,统计每个字符出现的次数 注意数组怎么初始化: int [] s1new int[26]代码如下&a…...
JavaWeb中异步交互的关键——Ajax
文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2,axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名3,JSON3.1 概述3.2 JSON 基础语法3.2.1 定义格式3.2.2 代码演示3.2.3 发送异步…...
python爬虫常见错误
python爬虫常见错误前言python常见错误1. AttributeError: WebDriver object has no attribute find_element_by_id1. 问题描述2. 解决办法2. selenium:DeprecationWarning: executable_path has been deprecated, please pass in1. 问题描述2. 解决办法3. 下载了包…...
AI_Papers周刊:第三期
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 2023.02.20—2023.02.26 文摘词云 Top Papers Subjects: cs.CL 1.LLaMA: Open and Efficient Foundation Language Models 标题:LLaMA:开放高效的基础语言模型 作者&#…...
在win7上用VS2008编译skysip工程
在win7上用VS2008编译skysip工程 1. 安装vs2008及相应的补丁包,主要包含以下安装包: 1.1 VS2008TeamSuite90DayTrialCHSX1429243.iso 1.2 VS2008SP1CHSX1512981.iso 1.3 VS90sp1-KB945140-CHS.exe 2. 安装Windows SDK: 6.0.6001.18000.367-KRMSDK_EN.zip 例如安装路径为…...
突破Windows苹果设备连接限制:Apple-Mobile-Drivers-Installer的自动化驱动解决方案
突破Windows苹果设备连接限制:Apple-Mobile-Drivers-Installer的自动化驱动解决方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址…...
【限时公开】20年农业AI工程师压箱底的17条精度校验铁律:从田间采集到模型上线零容错实践手册
第一章:农业图像识别精度校验的底层逻辑与行业特殊性农业图像识别并非通用计算机视觉任务的简单迁移,其精度校验需直面田间场景固有的复杂性:光照剧烈波动、作物生长阶段连续变化、病斑形态高度异质、背景杂草与土壤纹理干扰显著。这些因素共…...
s2-pro音色复用效果实测:不同参考音频时长(3s/10s/30s)对合成质量影响
s2-pro音色复用效果实测:不同参考音频时长(3s/10s/30s)对合成质量影响 1. 引言 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,其音色复用功能在实际应用中表现如何?本文将针对一个关键问题展开实测:…...
EmbeddingGemma-300m在Mathtype公式的语义理解中的应用
EmbeddingGemma-300m在Mathtype公式的语义理解中的应用 1. 引言 数学公式的语义理解一直是自然语言处理领域的挑战性任务。传统的文本嵌入模型在处理复杂的数学表达式时往往力不从心,无法准确捕捉公式背后的数学含义和逻辑关系。EmbeddingGemma-300m作为Google最新…...
【八股必备】多线程面试题2
第一部分:线程基础与概念篇1. 线程模型面试官:先来个基础题,Java程序里的线程和操作系统线程是什么关系?是一回事吗?候选人:好的。在绝大多数情况下,比如我们常用的Windows、Linux系统ÿ…...
深入TC397与TLF35584的SPI通信:从寄存器操作到汽车ECU低功耗状态管理实战
深入TC397与TLF35584的SPI通信:从寄存器操作到汽车ECU低功耗状态管理实战 在汽车电子领域,电源管理芯片的选择与配置直接关系到整车电子控制单元(ECU)的可靠性与能耗表现。英飞凌的TLF35584作为一款高集成度电源管理IC,…...
FireRed-OCR保姆级教程:一键部署,精准提取表格公式转Markdown
FireRed-OCR保姆级教程:一键部署,精准提取表格公式转Markdown 1. 引言:为什么选择FireRed-OCR? 在日常工作和学习中,我们经常遇到需要从PDF、图片等文档中提取表格、公式等内容的情况。传统OCR工具往往难以准确识别复…...
scanf_s使用避坑指南:如何正确应对C6064警告(含C6054连带问题处理)
scanf_s安全使用全指南:彻底解决C6064与C6054警告 在Windows平台进行C/C开发时,使用scanf_s函数处理用户输入是常见场景。但许多开发者都会遇到两个令人困惑的警告——C6064和C6054。这些警告看似简单,实则暗藏玄机。本文将带你深入理解这两个…...
模拟IC工程师必备:用Cadence Virtuoso仿真电流镜的7个关键步骤
模拟IC工程师必备:用Cadence Virtuoso仿真电流镜的7个关键步骤 在模拟集成电路设计中,电流镜堪称"细胞级"的基础模块,其性能直接影响整个系统的精度与稳定性。对于刚接触Cadence Virtuoso的工程师而言,如何高效完成从电…...
【实战篇】OneWire时序精解:从复位脉冲到DS18B20温度读取
1. OneWire协议基础:单线通信的魔法 第一次接触OneWire(单总线)协议时,我盯着那根孤零零的信号线愣了半天——这根线既要供电又要传数据,还要协调多个设备,简直像用一根吸管同时喝奶茶、吃珍珠和传情书。但…...
