BLE 連接過程具體分析

在BLE 的連接過程需要明確三個module:GAP、HCI、ATT、BLE core(請參考我寫的這篇文章https://blog.csdn.net/weixin_37747603/article/details/80323968

HCI pack:

在HCI的層面共有四種類型的數據包:

(1)Command: 0x01 (HOST->Core)

(2)HCI ACL Data:0x02 (HOST->Core)

(3)HCI Synchronous Data Packets:(在BLE不會使用) 0x03 (HOST->Core)

(4)HCI Event Packet:0x04 (HOST<-Core)

 

關於BLE core的pack請參考https://blog.csdn.net/weixin_37747603/article/details/103203959

在BLE的連接過程,從GAP->HCI->BLE Core

(1) 藍牙掃描:

數據包拆解:首先0x04表示的是HCI的Event,20表示的是參數長度,3e表示的LE Meta Event,02表示的是 LE Advertising Report Event,其實以上不用具體說明,在圖中有表示。

(2)建立連接:

Command和Event的交互模式如下所示

(1)HOST發送指令Command

(2)Command Status表明底層是否執行發送的指令

(3)Event Complete Status表明Command發送請求之後的發揮結果

 

這個過程對應的操作是,從手機點擊連接,一下是具體的數據包:

數據解析:

01對應HCI Command

20對應的LE Command

0d對應的LE Create Connection Command

而之後的數據都是對應的Command parameters,

在發送完成之後會收到HCI的Command Status狀態:

然後在接收指令 LE Connection Complete Event表明連接已經建立:

指令解析:

04表明的是HCI Event 3e表示BLE Event 0x1F表示的是參數長度

連接建立之後,會使用Connection_Handle來進行通信

接下來發送LE Read Remote Used Features Command 獲取LE device的feature

下圖是LE的feature,feature的總長度是8bytes:

前兩個指令的圖不在在這裏贅述,直接給最終獲取的pack圖:

在這個階段完成之後,下一條指令發送 Remote Version Information,這條指令不屬於屬於LE Core和 BR/EDR Core,

這條指令的作用是獲取連接設備的Connection_Handle和設備名字

然後就是Connection update,LE Connection Update Command

接下來的步驟是獲取ATT的service的以及character handle

通信的流程:ATT->HCI->BLE Core

ATT的pack格式如下圖所示:

接下來的過程說明從手機藍牙APP發送數據的流程:

bit0-5表明具體的方法,發送到設備的數據,對應的具體方法是Write Request.

-------------------------------------------------------------------------------

描述起來比較費勁,所以我把獲取的HCI的log文件上傳到這個位置,可以下載WireShark進行分析

基本時序圖總結如下:

 

協議封裝的形式如下圖所示:

User Data: 用戶階層發送接收的數據最大是20bytes

ATT Header: 發送數據,則ATT Header是

L2CAP:

L2CAP Header的結構如下所示:

Length:

Channel ID(0x0004 因爲是ATT)

HCI:

HCI的Head類型是HCI ACL Data Packets

Handle:

PB:

PC:

Data Total Length:L2CAP header ATT Header和UserData的數據長度

 

 

 

HCI_Log 下載地址:https://download.csdn.net/download/weixin_37747603/12400083

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