藍牙電話之HFP-AT命令集

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

更多互聯互通技術,歡迎關注微信公衆號:Connectivity
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章