藍牙電話之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命令下發的觸發點有兩個:
- 上層應用主動下發操作指令,比如撥打、接聽、掛斷電話等
- 協議棧內部事件,比如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》,也歡迎私信一起討論。
更多互聯互通技術,歡迎關注微信公衆號:Connectivity