HFP(Hand Free Profile)协议介绍和Connection Management流程
HFP协议
HFP在协议栈里面的层级关系
HFP存在角色的概念
AG(Audio Getway);音频流输入和输出的网关设备。典型的就是手机
HF (Hand Free):音频网关远程音频输入和输出的设备。它还提供了一些远程控制手段。(简单说就是免提设备)
示例:比如说耳机去连接手机,那么手机就是AG,耳机就是HF。
下面介绍一下HFP几个版本都更新了什么:
v1.0-v1.5:
- 回应和保持
- 用户号码信息
- 增强呼叫状态
- 增强呼叫控制
v1.5-v1.6
- 增加WBS(宽带语音编解码器)
- 编码器协商(选择WBS或者NBS(narrow band speech 窄带通话))
- 个人指示器开关(不太理解这个,后续查阅资料补充修改)
v1.6-v1.7
- 增加HF Indicators (例如电量通知,手机通知蓝牙设备当前手机还剩多少电量)
v1.7-v1.8
- 增强语言识别激活(类似通过耳机唤醒siri识别语音并回复的功能)

这边大致介绍一下hfp 的 feature
- Connection management 连接管理
- Phone status information 电话状态信息
- Audio Connection handling 音频连接处理
- Accept an incoming voice call 接听来电
- Reject an incoming voice call 拒接来电
- Terminate a call 终止通话
- Audio Connection transfer during an ongoing call 设置音频通道
- Place a call with a phone number supplied by the HF HF拨打电话
- Place a call using memory dialing 用 HF 提供的电话号码打电话(类似长按1拨打A联系人这种)
- Place a call to the last number dialed 末号拨打
- Call waiting notification 来电等待通知
- Three-way calling 三方通话
- Calling Line Identification 主叫线路识别(CLI)
- . Echo canceling (EC) and noise reduction(NR) 回声降噪(ENCR)
- Voice recognition activation 语音识别激活
- Attach a Phone number to a voice tag 将电话号码附加到语音标签上
- Ability to transmit DTMF codes 传输 DTMF 码的能力(按键功能)
- Remote audio volume control 远程音频音量控制
- Respond and Hold 回应并保持
- Subscriber Number Information 用户号码信息
- Enhanced Call Status 增强呼叫状态
- Enhanced Call Controls 增强呼叫控制
- Individual Indicator Activation 个人指示器激活
- Wide Band Speech 宽带通话
- Codec Negotiation 编解码器协商
- HF Indicators HF指示器


1.Connection Management(HFP_v1.8.pdf 4.2)
Service Level Connection Establishment(SLC)
HF或者AG都可以发起,SLC的连接要建立在一个存在的RFCOMM Connection上面。(也就是HF和AG之前的RFCOMM Connection)
SLC Init 流程
-
Supported features exchange : 必须是HF向AG发送:
AT+BRSF=< HF support feture >,然后AG会回复HF:+BRSR:< AG support feature> -
Codec Negotiation: 如果说HF支持codec NC的话,那么就要检查AG回复的support feature里面是否也支持codec NC.如果双方都支持的话,HF发送AT+BAC=< HF vailable codecs> HF支持的codec 有下面两种.CVSD和mSBC的区别

-
AG Indicators:再确认了AG support feature之后我们要确认AG支持那些Indicators,HF获取AG Indicators 通过:
AT+CIND=?, 然后AG会回复+CIND:(AG Indicators)然后HF再次发送**AT+CIND?** 获取AG Indicators的值,AG回复:+CIND:(AG Indicators 具体值)。如果说AG Indicators 发生了改变那么AG会使用:+CIEV:id,value上报给HF -
HF Indicators: 如果HF 支持HF Indicators 那么就要去人AG端是否也支持HF Indicators,如果都支持,那么HF 会发送:
AT+BIND=?查询AG所支持的HF Indicators。然后AG 依次使用:+BINC:HF Indicators,value回复 HF,AG所支持的HF Indicators。下图是HF Indicators 的类型
这是SLC的一个具体的连接链路图
下面我们用一份btsnoop来具体分析一下上面的流程
1.HF 发送AT+BRSF=1023(在btsnoop中是ASCII码形式的),该命令是通知AG,HF support feature 有哪些。
1023表示的是0011 1111 1111,下图是每一位具体的含义:

然后AG会回复+BRSF:3943通知HF,AG所支持feature。
3943表示的是1111 0110 0111,下图是每一位具体的含义:
2.从第一步的BRSF中我们可以看到,AG跟HF都是支持 Codec negotiation, 那么HF就要发送 AT+BAC=1 命令选择对应的codec。
codec的值见下图。
3.设置玩codec之后我们需要获取到AG 支持哪些 Indicators。HF发送命令: AT+CIND=? 询问AG所支持的Indicators。
然后AG会回复 +CIND: ("call",(0,1)),("callsetup",(0-3)),("service",(0-1)),("signal",(0-5)),("roam",(0,1)),("battchg",(0-5)),("callheld",(0-2)) 冒号后面表示 支持的Indicators 以及Indicators值的范围。我们可以看到所有的Indicators 都是带有编号的 AG在Indicators发送变化时通知HF,依赖就是这个编号,这个编号是从1开始的这个解析是有误的,不要被误导了,在介绍 +CIEV: 命令的时候可以看到
4.当获取到AG 所支持的Indicators时,HF需要在发送一次 AT+CIND? 获取AG Indicators 的具体值是多少
然后AG会回复 +CIND: 0,0,0,0,0,1,0 来通知HF各个Indicators 的值
下面介绍一下具体的每个Indicators 的值是表示什么意思
-
Call Status(是否存在通话)
0: 当前不存在通话
1:当前存在通话
-
Callsetup Status (AG呼叫设置状态发生变化值)
0: 没有正在进行的call setup
1: 来电的call setup
2: 拨号状态下的去电call setup
3: 发出呼叫设置处于响铃状态
-
Service availability (服务可用性)
0 表示没有服务。没有 Home/Roam 网络。
1 表示服务存在。提供家庭/漫游网络。
-
single(信号强度)
-
Roaming(漫游)
0:没有漫游
1:有漫游
-
Battery Charge Level(电池电量等级,5级)
-
call held
0:没有通话
1:通话被搁置或激活/保留通话交换
2:通话被挂起,没有活跃通话。
5.当我们获取到AG 所支持的Indicators 之后我们需要通过 AT+CMER=3,0,0,1 来使能所有的Indicators 。
参数值3,0,0,1 表示使能所有的Indicators
3,0,0,0 表示失能。
6.如果HF&AG都支持三方通话,那么发送**AT+CHLD=?** 询问三方通话执行的特性有哪些。
AG 会回复 +CHLC: 通知HF 支持的特性
这些是CHLD支持的特性
0 = 相当于此时正在通话中,又有一通电话来,拒接来电
1 = 挂断所有在通话中的电话,接听来电
1< idx> =挂断idx的通话中的电话
2 =把所有通话中的电话设置为hold状态,然后接听电话
2< idx> =请求接受标识电话,让其它电话保持。
3 = 增加一个保持电话到对话中
4 = 连接两个电话并且断开两个电话的订阅。HF侧可选。02

7.如果HF & AG都支持HF Indicators的feature,那么HF发送**AT+BIND=< HF supported HF indicators >** 来告知AG支持那些indicator HF支持的Indicators在上面有介绍。
然后发送**AT+BIND=?** 问询AG支持哪些indicator 。AG回复的**+BIND:(x,x)** x表示AG 支持的HF indicators。
然后再次发送 AT+BIND? 问询AG哪些indicator是enable的,AG会回复 +BIND:x,s x表indicator s表示是否使能。
HF 可以通过 AT+BIEV= < assigned number >,< value > 来使能某一个indicator。
8.最后介绍一下 AG indicator 变化通知HF 的命令 +CIEV: id,value

Service Level Connection Release
断开RFCOMM link即可
更多推荐
所有评论(0)