蓝牙电话之HFP协议中的AT命令集

蓝牙电话之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命令格式:
    OKERROR
  • <result>/<result>

AG给HF发送result code的AT命令如果是消息回复,后面都得再回复一条OK消息,除非回复的是+CME ERROR消息,后面的参数代表失败的原因。


结合下面HFP协议连接过程中AT交互的HCI截图再次理解上述规则:

蓝牙电话之HFP协议中的AT命令集


AT命令的构造及交互规则大概就是这样,接下来我们详细分析AT命令的下发和接收的处理流程。

AT命令下发的触发点有两个

1、上层应用主动下发操作指令,比如拨打、接听、挂断电话等

2、协议栈内部事件,比如HFP连接过程中建立Service Level Connection所需的AT交互


HF侧的应用层通过BluetoothHeadsetClient提供的相关接口将电话相关操作下发到协议栈,协议栈bluedroid再根据event构造成不同的AT指令数据,通过RFCOMM写入l2cap链路发送到AG端。详细时序图如下:

蓝牙电话之HFP协议中的AT命令集


AT命令的接收和下发的流程正好是反方向,具体时序图如下:

蓝牙电话之HFP协议中的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=

,HF侧将自己支持的features发送给AG侧后,AG端也得将它支持的features通过"+BRSF"发送给HF。

数据:int值,现在只有前10位有效,因此该features参数的范围是 0~1023。

蓝牙电话之HFP协议中的AT命令集


(2) +BRSF(Bluetooth Retrieve Supported Features)

构造格式:+BRSF:

数据:int值,现在只有前12位有效,该features参数的范围是 0~4095。

蓝牙电话之HFP协议中的AT命令集

HF和AG侧的features具体取何值,需要根据本端蓝牙的实际情况来定,各家支持的features可能有差异。BRSF相关指令的交互如下:

蓝牙电话之HFP协议中的AT命令集


(3) AT+BAC(Bluetooth Available Codecs)

构造格式: AT+BAC=[[,[,...[,]]]] (u1、u2是编码方式编号),HF侧告知AG侧支持哪些编码方式,CVSD和mSBC是强制要支持的。

该指令发送的前提条件是在BRSF交互中的双方都支持编码协商(Codec Negotiation)

蓝牙电话之HFP协议中的AT命令集

(4) AT+CIND(Standard indicator update AT command)

AT+CIND=?测试指令,HF获取AG侧支持的指示器索引值和范围。在发送其他关于指示器的相关指令(AT+CIND? 或 AT_CMER)前,该命令至少请求一次。

蓝牙电话之HFP协议中的AT命令集


AT+CIND?

读指令,HF读取AG侧当前的指示器各个值。这两条指令的交互关系如下图:

蓝牙电话之HFP协议中的AT命令集


(5) AT+CMER(Standard event reporting activation/deactivation AT command)

构造格式:AT+CMER=[<mode>[,<keyp>[,<disp>[, [,]]]]],但是在HFP协议中只有<mode>=3和=(0,1)这两个参数有效。/<mode>

/<disp>/<keyp>/<mode>

AT+CMER=3,0,0,1,activates"indicator events reporting",激活AG侧主动通知电话状态变化信息

AT+CMER=3,0,0,0,deactivates"indicator events reporting".关闭通知

蓝牙电话之HFP协议中的AT命令集


(6) AT+CHLD(Standard call hold and multiparty handling AT command)

构造格式:AT+CHLD=有这几个值可供选择:0,1,1

,2,2,3,4和?。下表分别介绍了各个值代表的意思是什么:

蓝牙电话之HFP协议中的AT命令集


一般情况下CHLD的交互为:

蓝牙电话之HFP协议中的AT命令集


(7) +CIEV(Standard "indicator events reporting" unsolicited result code)

构造格式:+CIEV: ,<value>,指示当前的电话状态,参数只有在"AT+CIND=?"中定义的指示器才有效,并且第一个指示器的索引值是1。这样CIEV指令中的指示器索引值就会和CIND中定义的指示器索引值相差1(因为CIND中定义的指示器索引值是按照顺序从0开始保存的),这个需要区分开。/<value>

蓝牙电话之HFP协议中的AT命令集


(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>][,]]],在HFP协议中只关心<number>和<type>这两个参数。/<type>/<number>/<alpha>/<satype>/<subaddr>/<number>

<number>来电号码;<type>来电类型,取值范围大概有三种区分国内和国际号码,具体请参考相关协议规定。/<type>/<number>

蓝牙电话之HFP协议中的AT命令集


(9) AT+CLCC+CLCC

AT+CLCC(Standard list current calls command),HF请求当前的电话信息列表

+CLCC(Standard list current calls result code)

构造格式:+CLCC: ,

,<status>,<mode>,<mpty>,<number>,<type>,AG侧回复当前的电话信息列表。如果当前没有电话,AG侧也需回复OK指令,不然将电话信息以列表形式发送给HF。各个参数代表的含义如下:/<type>/<number>/<mpty>/<mode>/<status>

:当前电话是第几路电话,从1开始计数

:电话方向,0代表往外拨打的电话outgoing;1代表来电incoming

<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命令集


我们就选择分析了上述在HFP协议中常用的一些AT指令。AT命令和蓝牙通话息息相关,蓝牙电话基本上都是通过AT交互才能实时地获取到AG侧的电话信息,从而更新电话应用界面的显示保证和手机上的通话状态保持一致。对其他AT指令感兴趣的同学可以参考协议《HFP_v1.7.1.pdf》,《3GPP 27.007》和《GSM 07.07》,也欢迎私信一起讨论。


分享到:


相關文章: