蓝牙HFP协议中的AT命令都是复用《3GPP 27.007》和《GSM 07.07》这两个协议规定的AT命令集中的一部分指令,本篇只对HFP相关的AT命令学习下。
AT命令在AG和HF之间的交互是建立于RFCOMM连接成功的基础上,也就是《蓝牙电话之HFP-连接》所讲的内容,还没看过HFP连接的,建议先了解连接的相关知识,这样更有助于对AT命令的理解。
AT命令的规则:
AG给HF发送result code的AT命令如果是消息回复,后面都得再回复一条OK消息,除非回复的是+CME ERROR消息,后面的参数代表失败的原因。
结合下面HFP协议连接过程中AT交互的HCI截图再次理解上述规则:
AT命令的构造及交互规则大概就是这样,接下来我们详细分析AT命令的下发和接收的处理流程。
AT命令下发的触发点有两个:
HF侧的应用层通过BluetoothHeadsetClient提供的相关接口将电话相关操作下发到协议栈,协议栈bluedroid再根据event构造成不同的AT指令数据,通过RFCOMM写入l2cap链路发送到AG端。详细时序图如下:
上层蓝牙电话应用application通过 AG_EVENT 和 AG_CALL_CHANGED 这两个广播来接收相关AT指令发送过来的信息。
AG_EVENT广播:包含的信息有信号状态、质量、漫游,手机电池电量,来电响铃功功能。
/**
* Intent sending updates of the Audio Gateway state.
* Each extra is being sent only when value it
* represents has been changed recently on AG.
* It can contain one or more of the following extras:
* {@link #EXTRA_NETWORK_STATUS},
* {@link #EXTRA_NETWORK_SIGNAL_STRENGTH},
* {@link #EXTRA_NETWORK_ROAMING},
* {@link #EXTRA_BATTERY_LEVEL},
* {@link #EXTRA_OPERATOR_NAME},
* {@link #EXTRA_VOICE_RECOGNITION},
* {@link #EXTRA_IN_BAND_RING}
*/
public static final String ACTION_AG_EVENT =
"android.bluetooth.headsetclient.profile.action.AG_EVENT";
AG_CALL_CHANGED广播:在有电话状态发生变化时就会上报。
/**
* Intent sent whenever state of a call changes.
*
* It includes:
* {@link #EXTRA_CALL},
* with value of {@link BluetoothHeadsetClientCall} instance,
* representing actual call state.
*/
public static final String ACTION_CALL_CHANGED =
"android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED";
接下来对HFP中使用比较多的AT命令依次做个简单的分析
(1) AT+BRSF (Bluetooth Retrieve Supported Features)
构造格式:AT+BRSF=
(2) +BRSF(Bluetooth Retrieve Supported Features)
构造格式:+BRSF:
HF和AG侧的features具体取何值,需要根据本端蓝牙的实际情况来定,各家支持的features可能有差异。BRSF相关指令的交互如下:
(3) AT+BAC(Bluetooth Available Codecs)
构造格式: AT+BAC=[< u1 >[,< u2 >[,…[,< un >]]]] (u1、u2是编码方式编号),HF侧告知AG侧支持哪些编码方式,CVSD和mSBC是强制要支持的。
该指令发送的前提条件是在BRSF交互中的双方都支持编码协商(Codec Negotiation)
(4) AT+CIND(Standard indicator update AT command)
AT+CIND=?测试指令,HF获取AG侧支持的指示器索引值和范围。在发送其他关于指示器的相关指令(AT+CIND? 或 AT_CMER)前,该命令至少请求一次。
AT+CIND? 读指令,HF读取AG侧当前的指示器各个值。这两条指令的交互关系如下图:
(5) AT+CMER(Standard event reporting activation/deactivation AT command)
构造格式:AT+CMER=[< mode >[,< keyp >[,< disp >[,< ind > [,< bfr >]]]]],但是在HFP协议中只有< mode >=3和< ind >=(0,1)这两个参数有效。
AT+CMER=3,0,0,1,activates“indicator events reporting”,激活AG侧主动通知电话状态变化信息
AT+CMER=3,0,0,0,deactivates“indicator events reporting”,关闭通知
(6) AT+CHLD(Standard call hold and multiparty handling AT
command)
构造格式:AT+CHLD=< n >,< n >有这几个值可供选择:0,1,1< idx >,2,2< idx >,3,4和?。下表分别介绍了各个值代表的意思是什么:
(7) +CIEV(Standard “indicator events reporting” unsolicited result code)
构造格式:+CIEV: < ind >,< value >,指示当前的电话状态,< ind >参数只有在“AT+CIND=?”中定义的指示器才有效,并且第一个指示器的索引值是1。这样CIEV指令中的指示器索引值就会和CIND中定义的指示器索引值相差1(因为CIND中定义的指示器索引值是按照顺序从0开始保存的),这个需要区分开。
(8) AT+CLIP和+CLIP
AT+CLIP(Standard “Calling Line Identification notification” activation AT command)
构造格式:AT+CLIP=(0,1),使能或关闭主叫号码显示通知,使能后AG侧在来电时通过“+CLIP”指令将当前来电的号码和类型发送到HF。
+CLIP(Standard “Calling Line Identification notification” unsolicited result code)
构造格式:+CLIP: < number >,type >[,< subaddr >,< satype >[,[< alpha >][,< CLI validity >]]] ,在HFP协议中只关心< number >和< type >这两个参数。
< number >来电号码;< type >来电类型,取值范围大概有三种区分国内和国际号码,具体请参考相关协议规定。
(9) AT+CLCC和+CLCC
AT+CLCC(Standard list current calls command),HF请求当前的电话信息列表
+CLCC(Standard list current calls result code)
构造格式:+CLCC: < idx >,< dir >,< status >,< mode >,< mpty >,< number >,< type >,AG侧回复当前的电话信息列表。如果当前没有电话,AG侧也需回复OK指令,不然将电话信息以列表形式发送给HF。各个参数代表的含义如下:
我们就选择分析了上述在HFP协议中常用的一些AT指令。AT命令和蓝牙通话息息相关,蓝牙电话基本上都是通过AT交互才能实时地获取到AG侧的电话信息,从而更新电话应用界面的显示保证和手机上的通话状态保持一致。对其他AT指令感兴趣的同学可以参考协议《HFP_v1.7.1.pdf》,《3GPP 27.007》和《GSM 07.07》,也欢迎私信一起讨论。