1. 程式人生 > >TI_BLE軟體開發者指導6——L2CAP(筆記)

TI_BLE軟體開發者指導6——L2CAP(筆記)

Texas Instruments CC2540/41
Bluetooth® Low Energy
Software Developer’s Guide
v1.3.2
Document Number:SWRU271F

《低功耗藍芽開發權威指南》
Robin Heydon著,陳燦峰、劉嘉 譯
機械工業出版社
2014.6

TI_BLE軟體開發筆記6-L2CAP

標籤:讀書筆記 BLE

Logical Link Control and Adaptation Protocol,L2CAP是個複用層,可以讓BLE複用三條不同的通道。也支援資料的分割和重組功能,使得較大的報文可以在底層無線電中傳輸。

1 背景

和經典藍芽完全不同,低功耗藍芽的一個基本概念在於無連線模式。使用者只在需要傳送資料的時候才建立連線,其他時候裝置可以長期處於斷開連線狀態。為了實現該功能,無連線模式必須擴充套件到L2CAP層,並且只能使用固定通道。這是由於固定通道無需配置任何的引數,一旦底層鏈路建立連線,固定通道便可立即投入使用,免去了建立通道耗費的額外時間。
在經典藍芽中,通道分為兩種型別:固定通道和麵向連線通道。只要兩個裝置建立連線,固定通道就已經存在。固定通道主要作為信令通道。面向連線通道可以隨時建立,只需要給對端傳送一些L2CAP信令即可。

2 L2CAP通道

通道是指一個數據包序列,連線兩個裝置上的一對服務。在兩個裝置間允許同時啟用多條通道。
BLE只支援固定通道。固定通道指的是兩個裝置一建立連線就已經存在的、沒有任何配置引數的通道。得益於未來擴充套件的靈活性,還可以日後根據需要新增面向連線通道。
L2CAP通道識別符號如下所示:

通道識別符號 用法
0x0000 保留:不能使用
0x0001 經典藍芽信令通道
0x0002 “無連線”通道
0x0003 AMP管理協議
0x0004 屬性協議
0x0005 低功耗信令通道
0x0006 安全管理協議
0x0007 ~ 0x003E 保留:日後可能使用
0x003F AMP測試協議
0x0040 ~ 0xFFFF 面向連線通道

通道識別符號0x0003用於當需要高速率傳輸資料時所使用的Alternate MAC/PHY協議。通道識別符號0x003F用於測試Alternate MAC/PHY控制器。
BLE一共使用了3條通道:0x0004用於屬性協議;0x0005用於低功耗藍芽信令通道;0x0006用於安全管理。

3 L2CAP資料包結構

每個L2CAP資料包的淨荷前端都包含一個32位位元報頭。假設使用分割和重組,那麼資料包的長度資訊必須包含在包頭中,以便判斷資料包的結束。使用分割和重組機制需要為每個通過HCI介面的資料包打上標記,分為開始資料包還是延續資料包。
L2CAP資料包結構如下所示:
L2CAP資料包結構
長度欄位表示報頭後的資訊載荷位元組數。在所有BLE通道上,資訊載荷均始於23位元組的最大傳輸單元(Maximum Transmission Unit,MTU)。MTU表示在一個L2CAP通道中資訊載荷的最大位元組數。這意味著,所有BLE裝置必須支援在空間傳輸27位元組資料包——4位元組包頭+23位元組資訊載荷。

4 低功耗信令通道

低功耗信令通道用於主機層級的信令。L2CAP命令資料包如下所示:
L2CAP命令資料包
每個低功耗信令通道的資料包均含有一操作碼,隨後為各種引數。低功耗信令通道支援的命令操作碼如下:

  • 命令拒絕
  • 連線引數更新請求
  • 連線引數更新響應

無論什麼時候傳送信令命令,其資訊載荷總是包含一識別符號。該識別符號長度僅1位元組,用於匹配請求和響應。例如,如果請求的識別符號為0x35,則響應該請求的資料包也必須使用0x35作為識別符號。如此一來,只要每個請求有不同的識別符號,多個請求便能同時傳送。由於在用完所有識別符號之前不允許重複使用,實現時一般會採用增量操作以確保符合該規定,但有一個例外:不嗯能夠使用識別符號0x00.
在BLE中,由於只定義一種請求命令型別,並且該請求命令僅用於沒有其他請求傳送的情況,識別符號的邏輯相對簡單。

4.1 命令拒絕

“命令拒絕”用於拒絕裝置收到的不支援的資訊包。包含一個原因程式碼以及相關資訊。其中的原因程式碼可以是“命令不理解”或“信令MTU溢位”。當接收到的命令大於23位元組時可以使用“信令MTU溢位”原因程式碼。

4.2 連線引數更新請求和響應

“連線引數更新請求”命令可以讓從裝置更新鏈路層連線引數,這些引數包括連線事件間隔、從裝置延遲以及監控超時,過程如下:

    participant 主裝置
    participant 從裝置
    從裝置->主裝置:L2CAP連線引數更新請求
    主裝置->從裝置:L2CAP連線引數更新響應
    從裝置->主裝置:鏈路層連線更新請求(瞬時)
    Note left of 主裝置:瞬時
    Note over 主裝置,從裝置:啟用新連線引數

在連線中,如果從裝置希望修改當前的連線引數則可以使用該命令。連線引數更新請求命令僅用於從裝置向主裝置傳送,因為主裝置隨時都能啟動鏈路層連線引數更新控制規程。如果該命令有主裝置傳送,從裝置會將其視為一個錯誤,並返回帶有“命令不理解”原因程式碼的“命令拒絕”命令。
從裝置可以在任何時候傳送給命令。收到該資訊的主裝置如果可以修改連線引數,則將返回“連線引數更新響應”,其中的結果程式碼設為“接收”,隨後主裝置將會啟動鏈路層連線引數更新控制規程。如果主裝置不同意從裝置的請求引數,可以傳送結果程式碼為“拒絕”的連線引數更新響應命令以拒絕請求。此時從裝置有兩個選擇,要麼接受主裝置希望的正在使用的連線引數,要麼終止連線。