【经典蓝牙】 蓝牙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 例如安装路径为…...
 
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
 
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
 
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
 
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
 
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
 
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
