在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