藍牙電話之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 的文章