蓝牙通话是蓝牙非常重要的功能之一,也是最为复杂的功能,涉及到的场景非常之多,尤其时三方通话的引入后,应用场景就会更加复杂了,这也是蓝牙开发中碰到问题最多的模块之一。之前的文章(https://blog.youkuaiyun.com/Jzj1234555/article/details/143019096)我介绍了蓝牙电话从A拨打远端电话的例子;今天这篇文章介绍从远端拨进来电话,并从HF端接听和拒绝电话的实例,还会涉及到带内铃声的介绍。
HFP Service Level connection establishment
这HFP服务建立的步骤如下:
- HF和AG协商各自支持哪些feature,HF发送AT+BRSF=<HF supported features>,AG则发送+BRSF=<AG supported features>。
- 如果步骤一的BRSF协商下来双方都支持Codec Negotiation ,则HF 发送AT+BAC=告知自己支持了哪些codec,最新HFP 1.9则支持了3种Codec:CVSD,mSBC,LC3,CVSD也就是窄带编码,采样率为8KHz;mSBC为宽带编码,采样率为16KHZ;LC3则为超宽带编码,采样率能到32KHZ。
- HF发送AT+CIND=?询问AG支持哪些指示器,AG则回复 +CIND: (“call”,(0,1)),(“callsetup”,(0-3)),(“service”,(0-1)),(“signal”,(0-5)),(“roam”,(0,1)),(“battchg”,(0-5)),(“callheld”,(0-2))。
- HF发送AT+CIND用以获取AG当前指示器的状态,AG则回复 +CIND: 0,0,1,5,0,5,0,代表的含义:(No call active,Not currently in call set up,Home/Roam network available,Signal Quality 5;Roaming is not active,Battery Charge Level 5,No calls held)。
- HF发送AT String: AT+CMER=3,0,0,1使能AG指示器的通知功能,也就是电话状态发送变化时,AG会主动发送CIEV通知HF。
- HF发送AT+CHLD=?获取AG支持哪些三方通话特性(前提时BRSF协商下来都支持三方通话),AG则回复:AT String: +CHLD: (0,1,2,3)。数值的具体含义见文章结尾。
- HF发送AT+BIND = <HF supported HF indicators>告知AG端他所支持的HF端的通用状态指示器。
- HF发送AT+BIND=?获取AG端支持哪些状态指示器,AG端则回复:+BIND: (1,2)。从https://www.bluetooth.com/specifications/assigned-numbers/获取到目前支持的HF Indicator就1,2两个值。1表示Enhanced Safety Enabled or Disabled;2表示: Remaining level of Battery;
- HF发送AT+BIND?用于获取AG端状态指示器是enable or disable,AG会回复两个AT命令:
AT String: +BIND: 1,1\r\n ;AT String: +BIND: 2,1\r\n 表示Enhanced Safety Enabled和Remaining level of Battery Enabled。
实例空中包如下:
In-Band Ring
在带内铃声响起之前,AG和HF还需要做一些功能上的AT指令的交互,如下图:
- AT+NREC=0:噪声和回显的关闭
- +BSIR表示 BandRing tone打开
- AT+CCWA=1:通话等待指示功能打开
- AT Exchange: AT+BIA=1,1,0,0,0,0,1,Active AG端1,2,7状态指示器,也就是(Call,CallSetup,Callheld)。
- AT+CLIP=1:AG端电话号码通知功能打开
- +XAPL=iPhone,2:这个是苹果拓展的AT指令
- AT+VGS=10:HF端speaker的音量为10
- AT+BIEV=2,100:HF Indicator状态更新,剩余电量水平为100,也就是满电
当有电话拨进来的时候:
- AG发送+BCS:2 让HF选择mSBC codec,HF回复AT+BCS=2表示同意
- AG发送+CIEV: 2,1表示An incoming call process ongoing
- 接着AG发送RING表示需要手机发送带内铃声给HF
- AG发送+CLIP:xxxx,xxxx表示电话号码
- 接着AG发送eSCO Audio 数据包给HF,这里么有看到eSCO的建立流程,估计没有抓到。
HF Reject incoming call
- HF发送AT+CHUP给AG,通知其挂断电话
- AG断开eSCO链路
- AG发送+CIEV:2,0 告知HF: Not currently in call set up
HF Answer incoming call
接通电话也需要经过带内铃声,通知号码,紧接着只要HF发送:ATA就接通电话了。
附录:AT+CHLD:
0 = Releases all held calls or sets User Determined User Busy (UDUB) for a waiting call.
- 1 = Releases all active calls (if any exist) and accepts the other (held or waiting) call.
- 1 = Releases call with specified index ().
- 2 = Places all active calls (if any exist) on hold and accepts the other (held or waiting) call.
- 2 = Request private consultation mode with specified call (). (Place all calls on hold EXCEPT the call indicated by .)
- 3 = Adds a held call to the conversation.
- 4 = Connects the two calls and disconnects the subscriber from both calls (Explicit Call Transfer). Support for this value and its associated functionality is optional for the HF.