藍牙電話之PBAP協議的連接

藍牙電話之PBAP—連接

前一篇文章《藍牙電話之PBAP協議分析》大致講解了PBAP協議的相關內容,本篇我們就開啓PBAP連接流程的分析。由於PBAP的連接過程涉及到的知識點較多,有些地方沒有分析寫出來還忘理解。
在這裏插入圖片描述

PBAP的連接分爲連接請求和連接響應,在PBAP協議中一般是PCE主動發起連接請求,PSE響應該連接請求,這也符合Client-Server設計原則。因爲電話簿源數據都是存儲在PSE中的,只有PCE需要通過PBAP協議來將這些數據同步過來,所以PSE等待PCE的請求並做出響應。

連接請求格式
在這裏插入圖片描述

連接響應格式
在這裏插入圖片描述

PBAP的連接及響應的數據構造如上所述,相應的數據包封裝完成後經RFCOMM協議中轉到藍牙的l2cap鏈路上,通過HCI下發到藍牙芯片將數據發送給對端設備。重點需要關注連接請求中的Target也就是標記PBAP連接的那串UUID號,Server端收到OBEX的連接請求只能通過該UUID來區分是哪種協議的連接。

所以完整的PBAP連接流程分爲以下三部分:
在這裏插入圖片描述

所有的藍牙數據操作都是已ACL鏈路連接成功爲前提條件,如果PBAP連接時,藍牙還沒建立ACL鏈路,需要將ACL鏈路建立成功才能繼續PBAP的連接流程。下面分別對這三部分加以分析。

步驟 1:SDP服務發現

要發起某個協議的連接,必須先進行SDP服務搜索,發現對端設備支持該協議才能繼續連接流程。

主要是建立PSM = SDP的l2cap鏈路,然後在該鏈路上搜索Phonebook Access–PSE的服務,PSE如果支持該服務會將會將該服務的綁定的channel返回給PCE端。最後將該l2cap鏈路斷開。HCI層的消息交互如下圖:
在這裏插入圖片描述

步驟 2:RFCOMM連接

在SDP服務中根據獲取到的搜索結果選擇L2CAP還是RFCOMM建立鏈路連接,具體如何選取在後面有截圖說明(其實不管是哪種連接方式,歸根結底還是l2cap的連接,哈哈,藍牙的所有數據交互都是基於l2cap鏈路,除了電話語音數據走的是sco鏈路)。這裏我們以RFCOMM連接舉例,通過對端設備提供的channel通道號去連接該協議的RFCOMM通道,爲PBAP(OBEX)的連接做準備。
在這裏插入圖片描述

步驟 3:PBAP連接

以OBEX連接的數據格式構造數據,通過層層的包頭封裝成不同的協議數據格式最後通過步驟2建立起來的鏈路發送給PSE請求建立連接。如下圖:
在這裏插入圖片描述

經過以上三個步驟,PBAP協議就認爲連接成功了。那這些步驟在安卓系統中是如何一一實現的呢?其實在安卓藍牙系統中只要分爲SDP服務發現和PBAP連接兩部分,那我們就分別來看下這兩部分在PBAP整個連接流程中的時序圖。

  • SDP服務發現
    在這裏插入圖片描述
    從上圖可以明顯看出,PBAP連接首先需要主動開啓SDP服務發現流程,SDP完成後通過PSE回覆的數據來確認是否支持PBAP協議,支持的話將搜索結果上報給應用層,藍牙服務在PbapClientConnectionHandler處理線程中下發連接指令。
    其中l2cap鏈路連接及SDP服務發現的具體流程,我們在這裏暫時先不講,這些知識點是藍牙核心協議的部分,以後會專門另開文章做深入的分析。

  • PBAP連接
    在這裏插入圖片描述
    根據SDP服務搜索到的結果中是否包含SdpPseRecord.getL2capPsm(),決定PBAP連接是基於L2CAP還是RFCOMM建立連接,下圖是兩份SDP搜索結果的對比:
    在這裏插入圖片描述

連接的過程也是分爲兩部分:

  1. 在藍牙服務層和協議棧創建socket進行通信
  2. 基於OBEX發起PBAP的連接請求

其中需要注意的關鍵點是協議棧中socket線程通過監聽文件描述符的狀態變化採取對應的處理,從而使整個流程跑起來。

最終藍牙服務將PBAP的連接狀態變化的廣播發送到安卓系統裏,藍牙電話相關應用監聽了如下截圖的廣播即可捕獲。從而基於PBAP連接成功的條件下進行數據交互,如同步通訊錄、通話記錄等,同步內容我放到下篇文章再做分析。
在這裏插入圖片描述

藍牙電話中關於PBAP協議連接的流程就總結到這,大部分精髓都在那兩份時序圖中,期望能給同學們一點幫助。感興趣的小夥伴歡迎私信留言一起討論。

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

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