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