从HFP协议本身来说,似乎是不支持微信QQ之类的蓝牙通话的,因为没有定义类似电话之类的具体的URI,但现实生活中,你买个蓝牙耳机不可能然你接不了微信电话,那么似乎在微信通话建立时,只能模拟一个号码(Number “10000000”),其他的流程还是和正常通话是一样的,接下来看看一个微信电话的空口实例:
HFP Service Level connection establishment
- 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 String: AT+CHLD=?获取AG支持哪些三方通话特性(前提是BRSF协商下来双方都支持三方通话),AG则回复:AT String: “+CHLD: (0,1,2,3)”。
- HF发送AT String: AT+BIND = <HF supported HF indicators>告知AG端他所支持的HF端的通用状态指示器。
- HF发送AT String: 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 String: 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。 - AT+BIEV=2,85:HF Indicator状态更新,剩余电量水平为85。
- AT+VGS=9:HF端speaker的音量为9
- AT+NREC=0:噪声和回显的关闭
- AT+CLIP=1:AG端电话号码通知功能打开
- AT+CCWA=1:通话等待指示功能打开
- AT+COPS=3,0:设置运营商,选择是代表移动联通还是电信
- AT+CMEE=1:打印错误报告信息
- +XAPL=iPhone,2:这个是苹果拓展的AT指令
拨打微信电话
这里会做三个事情:
- +CIEV:2,2 说明用户已经在拨打对方微信
- +BCS:2,AG选择mSBC作为通话数据传输的codec
- 建立LMP eSCO Link,早早的建立连接,虽然没有带内铃声需要传输
接通微信电话
我们看到这里会做如下事情:
- 耳机端发送AT+CLCC获取手机端电话号码,然后手机端回复AT String: +CLCC:
1,0,3,0,0,“10000000”,129\r\n, CLCC:<Identification Number: 1, Direction: Mobile Originated Call,State: Alerting,Bearer Mode: Voice,Multi Party: No,Number: “10000000”,Type Of Address: Type: Unknown, Plan: ISDN / Telephony> - 手机端发送+CIEV:2,3表示对方已经响铃
- 手机端发送+CIEV:1,1表示微信通话已经接通
- Audio eSCO数据传输,这个时候就正式进行通话了
- 手机端发送+CIEV:2,0表示没有其他通话了