藍牙電話之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》,也歡迎私信一起討論。


分享到:


相關文章: