右图是hfp协议所处的位置,hfp(heads-free-profile)可以让蓝牙设备控制电话,如接听,挂断,拒接,语音拨号等,我们看到如果要使用hfp协议,需要两个设备之间进行hfp连接,而hfp底层又是依赖RFCOMM,SDP,所以进行hfp连接前,需要进行RFCOMM的连接,以及sdp服务搜索,后面还有进行service level connection,最后才进行sco链路的连接
在hfp协议中,定义了音频网关和免提组件两个角色
AG–该设备为音频(特别是手机)的输入/输出网关。
HF–该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能
右图就是hfp的连接流程,可以看到和我上面介绍的流程一样,先进行sdp服务发现协议,发送hfp协议,然后进行RFCOMM协议连接,这样双方蓝牙设备就可以发送AT指令进行交互了,第三部分就是通过AT指令进行交互来进行Service Level Connection这个procedure了,最后创建SCO连接,就完成了hfp协议的连接,在这其中,AT指令交互建立SLC连接是重点
右图就是Service Level Connection建立连接的AT指令交互过程,当这整个交互过程完成后,就完成了SLC的建立,其中的AT指令代表的含义,接下来会介绍
右图是SLC连接发送AT指令所代表的含义:
AG和HF均可以通过内部或者用户事件发起Service Level连接建立。Service Level Connection建立的前提是RFCOMM已经建立。同样RFCOMM的建立发起者可以是AG或者HF
下面来具体解析下,AT指令功能的含义:
支持能力交换
首先HF发送AT+BRSF=< HF supported features >给AG,目的是首先通知AG其具有的功能,其次接收AG返回的其自身的BRSF功能。
Codec协商
如果HF支持Codec Negotiation特征,其会查看AG返回的BRSF中是否也支持该特性,如果都支持该特性,则HF将发送AT+BAC=< HF available codecs >命令给AG以告知其可用的codec。
AG Indicator
HF从AG接收到的BRSF,可以知道AG支持的Indicator,并按顺序排好,这是因为根据3GPP 27.007规范,AG可以支持Hands-Free不支持的profile。HF使用AT+CIND=?测试命令接收AG支持的indicator以及它们的次序。
当HF获得必须的Indicator和它们的次序,它将通过AT+CIND?命令取得AG端正在使用indicator的状态。
当HF取得AG的indicator后,HF会使用AT+CMER使能AG的indicator状态跟新功能,AG会返回OK作为应答。当service,call或者call建立状态发生时,AG将发送和indicator相关的+CIEV结果码给HF。HF根据收到的+CIEV码来跟新其自身内部的indicator。
AG侧会一直保持indicator状态跟新功能使能直到收到AT+CMER指示其关闭或者HF和AG端的Service Level Connection连接断开。
当HF使能AG的indicator状态跟新,如果AG和HF都支持呼叫等待(Call waiting)和3方通信(3-way calling)。HF将发送AT+CHLD=?测试命令取得AG是如何支持这种功能的。如果HF或者AG其中之一不支持三方通信,AT+CHLD=?命令不会被发送。
HF Indicator
如果HF支持HF indicator,其会查看AG是否支持HF indicator。
如果HF和AG支持HF indicator特性,HF将发送AT+BIND=< HF supported HF indicators >通知HF侧支持的indicator,AG以OK应答。
当AG接收到HF告知的HF indicator特性,HF将发送AT+BIND=?请求AG侧支持的HF indicator。AG将会以+BIND和以OK结尾的应答。
当HF接收到AG支持的HF indicator,HF将会发送AT+BIND?命令确定HF目前使能的HF indicator。AG将会一次或多次以+BIND应答和以OK结尾的应答。
至此HF可能发送AT+BIEV命令告知AG其使能的HF indicator发生变化。
AG可以使用+BIND使能或者禁止任何HF indicator。
这里我们对hfp协议的连接就有了一个初步的认识,根据hfp协议的spec,一步一步的介绍了hfp协议连接的流程,为我们后面进行hfp协议连接源代码的分析奠定了一个很好的基础,后面我们接着说