本文介紹L2CAP 部分
L2CAP 的全稱是 邏輯鏈路控制和適配協議, L2CAP 是低功耗藍牙的復用層,該層定義兩個基本概念
L2CAP 信道和L2CAP 信令,L2CAP 信道是一個雙向數據通道,通向對端設備上的某一特定的協議或規范,
經典藍牙使用 L2CAP 的大部分功能,包括動態信道標識符,協議服務多路復用器、增強
的重傳、流模式等、相比而言,低功耗藍牙只用到了 L2CAP 的較少功能。此處略過。
低功耗藍牙部分的 L2CAP 的功能總結為:
1,支持數據的分割和重組,使得較大的報文可以在底層無線電中進行傳輸。
2,復用信道,低功耗藍牙中復用三條不同的信道。
低功耗藍牙中值使用固定信道:一個用於信令信道,一個用於安全管理器,還有一個用於
屬性協議。本問只介紹信令信道。
由於信道傳輸的內容是報文,所以先去看看報文結構;
L2CAP 層數據報文
L2CAP 報文結構如下:
凈荷前端包含一個32位即4字節的報頭,包括長度和信道標識符。
長度標識后面的信息載荷部分的字節數,經典藍牙中信息載荷還可以包含額外的報頭和信息。但在低功耗藍牙
的L2CAP 層中並沒有其他有意義的信息結構。
由於低功耗藍牙的信息載荷最大是23字節,MTU=23,所以所有低功耗藍牙必須支持在空間傳輸27字節
數據包,(23字節信息載荷和4字節L2CAP 報頭),
由於本文介紹信令信道,所以在此先介紹 L2CAP 數據報文中的 L2CAP 命令數據包
L2CAP 命令數據包
L2CAP 命令數據包通過 L2CAP 數據包進行傳輸,見下面的結構,位於L2CAP 報文的信息載荷部分。
結構解析如下:
操作碼:
操作碼包括下面三種:
- 命令拒絕(command reject)
- 連接參數更新請求(connection parameter update request)
- 連接參數更新響應(connection parameter update response)
標識符1字節
用於匹配請求和響應,如,請求的標識符為0x35,則響應該請求的數據包也必須包含0x35作為標識符。
而下一個請求不允許重復,需要依次遞增,如果用完再從頭開始,但是不使用0x00,這樣的好處是
可以多個請求同時發送。
L2CAP 信道
信道的概念
信道是指一個數據包序列,連接兩個設備上的一對服務。
低功耗只支持固定信道。
固定信道指的是兩個設備一建立就已經存在的沒有任何配置參數的信道。
信道通過信道標識符進行標識,L2CAP 信道標識符如下:
低功耗藍牙一共使用3條信道:
0x0004用於屬性協議
0x0005用於低功耗信令信道
0x0006用於安全管理。
本文只介紹低功耗藍牙信令信道
低功耗信令信道
低功耗信令信道用於主機層級的信令。
信令信道傳輸的為 L2CAP 命令數據包。數據包結構在前面 L2CAP 數據報文部分已經描述。
下面通過不同命令數據包的用途分析來了解低功耗信令信道的用途。
不同的命令操作碼有不同的用途,下面來介紹不同的命令的操作碼的用途來分析;
命令拒絕
用於拒絕設備收到的不支持的信息包,該命令與經典藍牙中的命令拒絕完全一樣,它包含一個原因代碼以及相關的
信息,原因代碼就是表達拒絕的原因。
“命令不理解”: 標識設備收到了不支持的命令
“信令MTU溢出”: 表示設備接收到的命令大於23字節
連接參數更新請求和響應
用於從設備更新鏈路層的連接參數,這些參數包括連接事件間隔(從設備希望主設備允許從設備發送數據包的頻率)
、以及從設備延遲、還有監控超時。
連接參數更新過程如下:
什么情況下需要更新連接參數呢?
在連接過程中,有時候連接事件的間隔太短,導致電量消耗過快,在從設備延遲大還好說,否則的話,從設備
會頻繁的偵聽鏈路,此時,從設備就可能需要更新鏈路參數,來降低電量的消耗。
要注意的是,
1,連接參數更新請求命令僅用於從設備向主設備發送,因為主設備隨時都能啟動鏈路層連接參數更新。
如果是主設備發送。從設備會人為這是一個錯誤。返回命令不理解。
2,從設備可以在任何時候發送該命令,收到該信息的主設備可以修改連接參數,然后返回對應的響應。
主設備也可以不同意從設備的請求參數,然后發送結果代碼為拒絕的連接參數更新響應。此時從設備
要么接受主設備希望的正在使用的連接參數,要么終止連接。