注:本篇博客摘抄《BLE4.0 低功耗藍牙協議總結 作者:劉權》的部分內容,該文檔是學習ble很好的文檔,推薦!
L2CAP的全稱是邏輯鏈路控制和適配協議。L2CAP是一個複用層,可以讓低功耗藍牙複用三條不同的信道。它也支持數據的分隔和重組功能,使得較大的報文可以在底層無線電中傳輸。
L2CAP信道
L2CAP有個很簡單的概念,信道。信道是指數據包序列,連接兩個設備上的一對服務。在兩個設備允許同時啓用多條信道。低功耗藍牙只支持固定信道。固定信道指的是兩個設備一建立連接就已經存在的、沒有任何配置參數的信道。
這裏整個低功耗藍牙中第三次出現信道,但這裏的信道是針對主機而言。低功耗藍牙中主機抽象出屬性協議、安全管理等模塊,當控制器接受到來自對端設備的數據而發送給主機時,主機需要分辯這些數據給到誰,有可能給到屬性協議、安全管理或者L2CAP層自身的低功耗藍牙信令。這就是低功耗藍牙LACAP存在的含義。
低功耗藍牙一共使用了3條信道:
信道0x0004,用於屬性協議
信道0x0005,用於低功耗藍牙信令通道
信道0x0006,用於安全管理
L2CAP數據包結構
在所有低功耗藍牙信道上,信息載荷均始於23字節的最大傳輸單元(MTU)。在鏈路層規定數據報文加密/未加密報文不超過27字節的限制,L2CAP頭部佔了4字節,所以L2CAP Payload信息載荷只有23字節的最大長度。
低功耗藍牙信令通道
低功耗藍牙信令通道用於主機層級的信令,每個低功耗藍牙信令信道的數據包均含有一操作碼,隨後爲各種參數。
低功耗藍牙信令通道支持的命令操作碼如下:
命令拒絕
連接參數更新請求
連接參數更新響應
關於 payload信息載荷詳細說明如下:
Code:操作碼,對於 BLE 來說其實只有 3 個可用的命令
Identifier: 標識符, 這個的作用是確保應答包對應哪個請求包,發送一個請求包,接收到應答包中的 identity 值如果和請求包中的一致,說明是對這個請求包的應答。 identity 的值發送每個請求命令都是不同的值,而對方設備的應答信息中的 ID 和發送請求中的ID 是一樣的,確保對其應答。 0x00 是一個非法的值,不能用。
Length:長度,這個長度表示的是後面 data 中的字節數。
Data:數據,每個操作碼都有固定格式的數據。
命令拒絕
命令拒絕操作碼,用於對接收到的不支持的數據包的迴應。這個命令是沿用經典藍牙的,它的數據格式如下:
Reason 佔用兩個字節,對於 BLE 只有 2 個值是可用的,如下:
Data:數據長度爲 0 或者大於 0 字節的數,主要是對原因進行描述補充, 而“命令不理解”是沒有數據需要進行說明的。只有
“ Signaling MTU exceeded”有兩個字節的數據去應答能接收的最大的字節數是多少,對於 BLE 就是 MTU=23bytes。
連接參數更新請求和響應
主機通過 LL 層就可實現連接參數更新,那麼從機也有更新連接參數的權利, 通過這個命令即可。而且這個命令只能有從機發送給主機,如果從機接收到這個命令後,會回覆命令拒絕。
裏面的 4 個參數都是給的範圍,也就是說從機不能最終決定具體連接參數值,從機只能給主機提 出 自 己 的 想 法 , 如 果 主 機 同 意 更 新 , 那 麼 需 要 主 機 發 送“ LL_CONNECTION_UPDATE_REQ”這個命令詳細連接參數給從機,然後從機等到“瞬時”到後進行參數更新。
如果僅僅是從對等層來說, 當從機發送 Connection Parameter Update request 命令,主機需要發送Connection Parameter Update response 這個命令去迴應:
Result 爲 2 個字節的結果代碼。 當主機同意修改連接參數的時候, Result 爲 0x0000, 也就是接受 參數 更 新 的 建 議 。 當 主 機 不 同 意 修 改 連 接 參 數 的 時 候 ,Result=0x0001,拒絕參數更新 。
參數更新過程:
1. 從機向主機發送連接參數更新請求(想法)
2. 如 果 主 機 同 意 更 新 , 那 麼 需 要 主 機 發 送“LL_CONNECTION_UPDATE_REQ”這個命令詳細連接參數給從機然後從機等到“瞬時”到後進行參數更新。
3. 主機 L2CAP 層連接參數應答
採集從機L2CAP層連接參數更新請求:
採集主機LL層連接參數更新請求:
採集主機L2CAP層連接參數應答: