藍牙HFP協議

HFP協議淺述

在開始學習該協議之前,先說一下學習該協議的關鍵點:

  • 弄清該協議的應用場景,協議中定義的兩個角色AG和HF
  • 兩個設備建立hfp連接的流程
  • 基於AT指令集的控制-反饋機制,不知道AT指令集去看3GPP的電話協議

HFP簡介

HFP規範定義了一組功能,比如可以使用移動電話與免提裝置相結合(例如,車載藍牙和頭戴式耳機),通過藍牙連接,爲移動電話和免提裝置之間提供遠程無線控制和語音連接。

HFP目前的使用場景是在車載藍牙和可穿戴無線耳機,協議中定義了兩個支持HFP的設備基於點對點的交互,其Stack的結構圖如下:

角色

HFP定義了音頻網關(AG)和免提組件(HF)兩個角色:

音頻網關(AG) – 該設備爲音頻輸入/輸出的網關 。典型作爲網關的設備爲手機

免提組件(HF) – 該設備作爲音頻網關的遠程音頻輸入/輸出機制,並可提供若干遙控功能。典型作爲免提組件的設備爲車機、藍牙耳機

設備的角色一般是固定的(不排除某些廠商定製有多角色設備),比如手機固定爲網關設備,車機(藍牙耳機)固定作爲免提設備。

HFP支持的特性

我們在免提端如車機,可以控制手機的接/掛電話,甚至可以控制藍牙的斷/連,所以SIG在協議中也是規定了哪些功能特性是必須支持的。

下圖描述了HFP中必須支持的特性(M表示強制支持, O表示可選支持):

具體的請參考HFP_v1.7.1 第3章,在table3.2中還有關於每個特性支持的操作介紹!

AT指令介紹

這個在協議中是沒有的,因爲HFP的通訊都是按照AT指令格式的,覺得有必要簡單的說一下!

AT指令的編碼格式爲ASCII碼,下面我舉個例子說明一下

假如我定義三個指令,提示通話AT+CALLCOMING=<State,1爲有來電,0爲沒有來電>\r\n;控制接聽掛斷AT+CALLCTR=<Control,1爲接聽,0爲掛斷>\r\n;確認OK\r\n

當手機端來電時,向車機端發送:

AT+CALLCOMING=1\r\n

當車機端收到該指示之後,如果接聽電話,則發送:

AT+CALLCTR=1\r\n

當手機端接收控制指令,並回復:

OK\r\n

上面就是一個簡單的指令交互過程,當然指令都是爲虛構的,實際以3GPP和SIG定義的指令爲準!

 

HFP控制交互流程

Hfp交互是建立在RFCOMM(串口仿真協議)上的at指令協議,其at指令協議遵循3GPP和GSM定義的控制/指示協議,同時加入了一些藍牙定義的指令,SIG定義的指令集我也單獨整理了一份,在網盤鏈接資料中中名爲《HFP AT指令集》,大家可根據實際需求自行查閱。

hfp有跟多的交互過程,比如建立/斷開鏈接,接/掛電話,獲取遠端狀態等等,每個過程都有固定的交互流程,具體的請參考HFP_v1.7.1 第4章,下面我將對一個實際的交互場景做簡述。

   建立服務層連接

 首先要確保RFCOMM層連接已建立,然後雙方會交換彼此支持的特性,HF將發送AT+BRSF=<HF support features>通知AG,AG會發送+BRSF回覆。如果兩端都支持codec協商特性,HF將發送AT+BAC=<HF available codecs in the HF>通知AG端其所支持的codec,具體的流程圖如下圖所示:

其他的交互流程與此類似,《HFP_v1.7.1》第四章對每個過程都說的很詳細,這裏就不多說了。

HFP協議數據分析

分析的log使用手機進行抓取,log會放在我的藍牙學習筆記(序)的百度鏈接中,可用capture file viewer打開。

其中藍色的部分是HCI的數據,綠色爲具體的L2CAP的數據,黃色爲RFCOMM部分數據,紅色爲HFP協議數據,在此我們對HFP數據進行解析,有興趣可以看我其他協議的分析文檔。

1)、Slave(HF)

00000010 00000010 00100000 00010101 00000000 00010001 00000000 01000011 00000000 00001001 11111111 00011001 00000110 01000001 01010100 00101011 01000010 01010010 01010011 01000110 00111101 00110001 00111001 00110000 00001101 01011100

AT指令爲:AT+BRSF=190\n(注:hfp協議部分是以ascii表示的字符串)

將190轉換爲二進制爲10111110,根據下表可查得HF支持的特性:

2、Master(AG)

00000010 00000010 00100000 00010111 00000000 00010011 00000000 11000000 00000000 00001011 11111111 00011101 00000100 00001101 00001010 00101011 01000010 01010010 01010011 01000110 00111010 00100000 00111000 00110111 00110001 00001101 00001010 10000110

AT指令爲:\r\n+BRSF: 871\r\n

將871轉換爲二進制爲1101100111,根據下表可查得AG支持的特性:

3、Master(AG)

00000010 00000010 00100000 00001110 00000000 00001010 00000000 11000000 00000000 00001011 11101111 00001101 00001101 00001010 01001111 01001011 00001101 00001010 10011010

AT指令爲:\r\nOK\r\n

對收到AT+BRSF=190\n且正確執行的回覆

4、Slave(HF)

00000010 00000010 00100000 00010011 00000000 00001111 00000000 01000011 00000000 00001001 11101111 00010111 01000001 01010100 00101011 01000010 01000001 01000011 00111101 00110001 00101100 00110010 00001101 01000000

AT指令爲:AT+BAC=1,2\n

查指令集可知該指令爲通知AG,HF端支持的codec的命令,1和2分別代表CVSD和mSBC
 

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