蓝牙电话之HFP-AT命令集
蓝牙HFP协议中的AT命令都是复用《3GPP 27.007》和《GSM 07.07》这两个协议规定的AT命令集中的一部分指令,本篇只对HFP相关的AT命令学习下。
AT命令在AG和HF之间的交互是建立于RFCOMM连接成功的基础上,也就是《蓝牙电话之HFP-连接》所讲的内容,还没看过HFP连接的,建议先了解连接的相关知识,这样更有助于对AT命令的理解。
AT命令的规则:
- 一个命令行,只能代表一个AT命令
carriage return的简写,相当于回车键,ASCII码为 0x0D NL line feed, new line的简写,相当于换行键,ASCII码为0x0A - HF -> AG发送AT命令格式:
- AG -> HF发送AT命令格式:
OK 或 ERROR 或 <result> /<result>
AG给HF发送result code的AT命令如果是消息回复,后面都得再回复一条OK消息,除非回复的是+CME ERROR消息,后面的参数代表失败的原因。
结合下面HFP协议连接过程中AT交互的HCI截图再次理解上述规则:
AT命令的构造及交互规则大概就是这样,接下来我们详细分析AT命令的下发和接收的处理流程。
AT命令下发的触发点有两个:
1、上层应用主动下发操作指令,比如拨打、接听、挂断电话等
2、协议栈内部事件,比如HFP连接过程中建立Service Level Connection所需的AT交互
HF侧的应用层通过BluetoothHeadsetClient提供的相关接口将电话相关操作下发到协议栈,协议栈bluedroid再根据event构造成不同的AT指令数据,通过RFCOMM写入l2cap链路发送到AG端。详细时序图如下:
AT命令的接收和下发的流程正好是反方向,具体时序图如下:
上层蓝牙电话应用application通过AG_EVENT和AG_CALL_CHANGED这两个广播来接收相关AT指令发送过来的信息。
AG_EVENT广播:包含的信息有信号状态、质量、漫游,手机电池电量,来电响铃功功能。
<code> /**
* 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";/<code>
AG_CALL_CHANGED广播:在有电话状态发生变化时就会上报。
<code> /**
* 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";/<code>
接下来对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=[
该指令发送的前提条件是在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>[,
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=
一般情况下CHLD的交互为:
(7) +CIEV(Standard "indicator events reporting" unsolicited result code)
构造格式:+CIEV:
(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>][,
<number>来电号码;<type>来电类型,取值范围大概有三种区分国内和国际号码,具体请参考相关协议规定。/<type>/<number>
(9) AT+CLCC和+CLCC
AT+CLCC(Standard list current calls command),HF请求当前的电话信息列表
+CLCC(Standard list current calls result code)
构造格式:+CLCC:
<status>:电话状态/<status>
- 0 = Active
- 1 = Held
- 2 = Dialing (outgoing calls only)
- 3 = Alerting (outgoing calls only)
- 4 = Incoming (incoming calls only)
- 5 = Waiting (incoming calls only)
- 6 = Call held by Response and Hold
<mode>:电话模式,0 (Voice), 1 (Data), 2 (FAX)/<mode>
<mpty>:是否为多方通话的电话/<mpty>
- 0 - this call is NOT a member of a multi-party (conference) call
- 1 - this call IS a member of a multi-party (conference) call
<number>可选项,电话号码/<number>
<type>可选项,电话类型/<type>
我们就选择分析了上述在HFP协议中常用的一些AT指令。AT命令和蓝牙通话息息相关,蓝牙电话基本上都是通过AT交互才能实时地获取到AG侧的电话信息,从而更新电话应用界面的显示保证和手机上的通话状态保持一致。对其他AT指令感兴趣的同学可以参考协议《HFP_v1.7.1.pdf》,《3GPP 27.007》和《GSM 07.07》,也欢迎私信一起讨论。
閱讀更多 Connectivity 的文章