蓝牙电话之HFP-AT命令集(转载)

https://blog.csdn.net/weixin_44260005/article/details/104880536

蓝牙电话之HFP-AT命令集

蓝牙HFP协议中的AT命令都是复用《3GPP 27.007》和《GSM 07.07》这两个协议规定的AT命令集中的一部分指令,本篇只对HFP相关的AT命令学习下。

AT命令在AG和HF之间的交互是建立于RFCOMM连接成功的基础上,也就是《蓝牙电话之HFP-连接》所讲的内容,还没看过HFP连接的,建议先了解连接的相关知识,这样更有助于对AT命令的理解。

AT命令的规则:

  • 一个命令行,只能代表一个AT命令
  • < cr > carriage return的简写,相当于回车键,ASCII码为 0x0D
  • < lf > NL line feed, new line的简写,相当于换行键,ASCII码为0x0A
  • HF -> AG发送AT命令格式:< AT command >< cr >
  • AG -> HF发送AT命令格式:< cr >< lf >OK< cr >< lf > 或 < cr >< lf >ERROR< cr >< lf > 或 < cr >< lf >< result code >< cr >< lf >

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广播:包含的信息有信号状态、质量、漫游,手机电池电量,来电响铃功功能。

    /**
     * Intent sending updates of the Audio Gateway state.
     * Each extra is being sent only when value it
     * represents has been changed recently on AG.
     * <p>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}</p>
     */
    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.
     *
     * <p>It includes:
     * {@link #EXTRA_CALL},
     * with value of {@link BluetoothHeadsetClientCall} instance,
     * representing actual call state.</p>
     */
    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=<HF侧支持的features>,HF侧将自己支持的features发送给AG侧后,AG端也得将它支持的features通过“+BRSF”发送给HF。

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

(2) +BRSF(Bluetooth Retrieve Supported Features)

构造格式:+BRSF: <AG侧支持的features>

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

 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和?。下表分别介绍了各个值代表的意思是什么:

 一般情况下CHLD的交互为:

(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。各个参数代表的含义如下:

  • < idx >:当前电话是第几路电话,从1开始计数
  • < dir >:电话方向,0代表往外拨打的电话outgoing;1代表来电incoming
  • < 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)
  • < 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 >可选项,电话号码
  • < type >可选项,电话类型

     

我们就选择分析了上述在HFP协议中常用的一些AT指令。AT命令和蓝牙通话息息相关,蓝牙电话基本上都是通过AT交互才能实时地获取到AG侧的电话信息,从而更新电话应用界面的显示保证和手机上的通话状态保持一致。

对其他AT指令感兴趣的同学可以参考协议《HFP_v1.7.1.pdf》,《3GPP 27.007》和《GSM 07.07》

posted @ 2023-12-01 17:20  petercao  阅读(93)  评论(0编辑  收藏  举报