【经典蓝牙】 蓝牙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 例如安装路径为…...
python 数据结构习题
旋转图像给定一个nn的二维矩阵表示一个图像。将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。例如,给定matrix[[1,2,3],[4,5&#x…...
18、MySQL8其它新特性
文章目录1 MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性2 新特性1:窗口函数2.1 使用窗口函数前后对比2.2 窗口函数分类2.3 语法结构2.4 分类讲解1 序号函数2 分布函数3 前后函数4 首尾函数5 其他函数2.5 小 结3 新特性2:公用表表达式…...
【Android笔记79】Android之接口请求库Retrofit的介绍及使用
这篇文章,主要介绍Android之接口请求库Retrofit的介绍及使用。 目录 一、Retrofit接口请求库 1.1、什么是Retrofit 1.2、Retrofit的使用 (1)引入依赖...
蓝桥杯 考勤打卡
问题描述 小蓝负责一个公司的考勤系统, 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗。 当员工刷卡时, 会在后台留下一条记录, 包括刷卡的时间和员工编号, 只 要在一天中员工刷过一次卡, 就认为他到岗了。 现在小蓝导出了一天中所有员工的刷卡记录, 请将所有到岗…...
逻辑回归
逻辑回归 在分类问题中,要预测的变量y为离散值(y0~1),逻辑回归模型的输出变量范围始终在 0 和 1 之间。 训练集为 {(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\} {…...
CTFer成长之路之Python中的安全问题
Python中的安全问题CTF 1.Python里的SSRF 题目提示 尝试访问到容器内部的 8000 端口和 url path /api/internal/secret 即可获取 flag 访问url: http://f5704bb3-5869-4ecb-9bdc-58b022589224.node3.buuoj.cn/ 回显如下: 通过提示构造payload&…...
SpringBoot知识快速复习
Spring知识快速复习启动器自动装配ConfigurationImport导入组件Conditional条件装配ImportResource导入Spring配置文件ConfigurationProperties配置绑定Lombok简化开发dev-toolsyaml请求和响应处理静态资源规则与定制化请求处理-Rest映射请求处理-常用参数注解使用请求处理-Ser…...
SpringBoot+React博客论坛系统 附带详细运行指导视频
文章目录一、项目演示二、项目介绍三、项目运行截图四、主要代码一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootReact框架开发的博客论坛系统。首先,这是一个前后端分离的项目,文章编辑器…...
C++ primer 之 extern
C primer 之 extern什么是声明什么是定义两者有什么区别ertern的作用什么是声明 就是使得名字为程序所知,一个文件如果想使用别处定义的名字就必须包含对那个名字的声明。 什么是定义 负责创建与名字关联的实体。 两者有什么区别 变量声明和声明都规定了变量的…...
Linux 练习二 (VIM编辑器 + GCC编译器 + GDB调试)
文章目录VIM命令思维导图GCC编译器1、GCC编译文件练习2、静态库动态库制作练习将此函数编译成动态库将此函数编译成静态库GCC优化选项 -OnGDB调试命令练习练习一:编写一个程序,通过gdb调试,使用到gdb的b,n,s࿰…...
专业的上海网站建设公司哪家好/查询网站域名
Flutter中的第三方包 指纹识别、触摸ID、面部ID、密码、pin或图案 local_auth...
毕设做网站什么能过/北京债务优化公司
今天调试登录框的时候,发现登录框出现的时候,发现focus不在密码输入框中。就四处查焦点问题,以及tab键的焦点调转顺序。 首先要感谢这篇文章:【QT】新弹窗默认无焦点 给了我一个思路,我能不能在窗口show出来之后&#…...
奉贤做网站/免费发布产品信息的网站
Scratch青少儿编程课堂分享丰富的编程案例发布最新的编程资讯这个世界上,总有人爱你如生命,但母亲爱你,远胜生命。关于母亲节,想必大家并不陌生,每年5月的第二个周日就是母亲节。那么,这个节你要怎么过呢&a…...
网站建设怎么付款/seo优化排名易下拉用法
主要是在配置tx-lcn.manager.host时需要特别注意下,应该安装如下配置进行 tx-lcn: manager:host: 0.0.0.0port: 8070heart-time: 12000dtx-time: 15000concurrent-level: 128admin-key: 123456 其中host必须要配置成0.0.0.0,这样在客户端访问时才能访问到…...
保定附近的做网站价格/2021年年度关键词排名
回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。…...
网站的二级页面在哪里做/网站seo快速排名
提起openstack的安装,整个人感觉都不好了,搞了将近一周时间也没能搞定Redhat、CentOS 6.5系统的安装,最后换到CentOS7.0上一次安装成功。为了以后少走弯路,记下自己愚钝的脚步。 第一次安装openstack,拿到的服务器是Re…...