【BLE系列-第四篇】從零剖析L2CAP:信道、Credit流控、指令詳解

目錄

引言

一、L2CAP主要功能

二、L2CAP幀格式及信道概念

2.1 邏輯鏈路是什么?

2.2 邏輯信道的作用

2.3 L2CAP幀格式介紹

三、L2CAP信令信道

3.1 信令信道幀格式說明

3.2?信令信道指令介紹

3.2.1 信令信道指令一覽表

3.2.2 Credit流控規則


引言

在BLE協議棧中,邏輯鏈路控制和適配協議 (Logical Link Control and Adaptation Protocol, L2CAP)作為鏈路層(LL)與上層協議(ATT/GATT/SMP)之間的適配層,承擔著協議復用、數據分段和流控的核心職責。通過邏輯信道機制,L2CAP實現了多協議并行傳輸的能力,同時通過信令信道(CID 0x0005)動態管理連接參數與資源分配。本文將系統解析L2CAP幀格式、邏輯信道劃分規則,為BLE設備開發提供協議層實現參考。


一、L2CAP主要功能

BLE 的 L2CAP(Logical Link Control and Adaptation Protocol)在數據信道上主要承擔三個功能:

1)信道管理

  • 負責邏輯信道的創建與關閉。

2)連接參數設置

  • 用于更新連接參數。

3)多包傳輸控制

  • 配合LL層分包機制實現對發送方的流控機制

注意:

LL層負責物理數據包(PDU)的分片與重組(基礎分包),而L2CAP在Credit-Based模式下則負責管理邏輯信道上的L2CAP SDU傳輸流控。


    二、L2CAP幀格式及信道概念

      2.1 邏輯鏈路是什么?

      在介紹L2CAP幀格式之前我們先回顧下必要的背景知識。在前面的章節我們已知在藍牙協議中,BR / EDR / LE 表示不同的物理規范,BR/EDR用于經典藍牙,LE用于低功耗藍牙:

      • BR(Basic Rate):經典藍牙基礎速率
      • EDR(Enhanced Data Rate):經典藍牙高速率增強
      • LE(Low Energy):低功耗藍牙

      而 ACL-U、APB-U、LE-U 是對應物理層的邏輯鏈路(Logical Transport),用于承載上層協議的數據:

      • ACL-U:BR/EDR 下的異步數據通道
      • APB-U:EDR 下的增強異步數據通道
      • LE-U:BLE 下的數據通道,主要承載L2CAP協議數據。L2CAP通過其邏輯信道(CID)向上層協議(如ATT/GATT、SMP)提供服務,或支持用戶自定義協議。

      換句話說,ACL-U / APB-U / LE-U 是 物理鏈路到邏輯數據傳輸的橋梁。本系列文章只關注BLE,即我們只需要關注LE-U邏輯鏈路相關的內容,因為 BLE 的所有數據上行/下行都通過LE-U邏輯鏈路承載,它承載著多個邏輯信道(Logical Channels, 由CID標識)。


      2.2 邏輯信道的作用

      BLE的分包是由LL層實現的,但是LL層并沒有顯式說明當前傳輸的分包來源,即接收方無法確認此分包是來自于GATT還是SMP,在此基礎上為了實現虛擬邏輯信道以實現通道劃分,L2CAP定義了若干個邏輯信道,每個邏輯鏈路可包含若干個邏輯信道


      2.3 L2CAP幀格式介紹

      在介紹L2CAP幀格式之前,我們先來回顧下在第三篇學過了LL層數據信道報文格式點此回顧【BLE系列-第二篇】數據鏈路層(LL):基于1M PHY模式的報文詳解):

      L2CAP作為LL層與上層的承接者,其負責的字段由以下幾個部分組成:

      • L2CAP PDU len:標識Info段的長度,最大長度為65535(包長大于247則使用LL層進行多包傳輸)
      • L2CAP Channel ID(CID):邏輯信道 ID,用于標識邏輯信道
      • Info:L2CAP信息內容

      其中 CID 用于標識邏輯信道,LE-U 邏輯鏈路包含了若干個協議規定(固定CID)以及用戶自定義的邏輯信道,如下圖(此圖來自官方協議文檔):

      由圖可知,BLE可使用的邏輯信道包含以下部分:

      CID說明
      0x0004GATT專用信道,L2CAP不做處理,只進行轉發
      0x0005L2CAP信令信道
      0x0006SMP專用信道,L2CAP不做處理,只進行轉發
      0x0020~0x003E僅限藍牙SIG內部測試使用,不可用于公開產品或商用
      0x0040~0x007E用戶自定義信道,使用L2CAP相關指令可以進行創建

      其中CID 0x0004和CID 0x0005僅用于給上冊模塊提供透傳接口,因此不再贅述。下文我們重點講解下CID 0x0005 L2CAP信令信道。


      三、L2CAP信令信道

      3.1 信令信道幀格式說明

      首先我們再來看一眼LL的幀格式:

      對照上圖講解,信令信道其實就是在將 Info(至多247字節)?字段拆分成了以下兩個部分:

      • Code:1字節字段,用來標識不同的指令
      • Info:至多246字節字節,不同的Code對應的Info格式不一致,具體以協議規定為準。

      注意:

      L2CAP Channel ID在信令指令中固定為0x0005。


      3.2?信令信道指令介紹

      3.2.1 信令信道指令一覽表

      由圖可知BLE能使用的Code指令只有:0x01、0x06、0x07、0x12至0x1A。

      可以分為以下幾個類別:

      1)錯誤與通用控制類

      • ?0x01 Command Reject

      2)信道建立與管理類

      • 0x06 LE Credit Based Connection Request
      • 0x07 LE Credit Based Connection Response
      • 0x14 Disconnection Request
      • 0x15 Disconnection Response

      3)連接參數與更新類

      • 0x12 Connection Parameter Update Request
      • 0x13 Connection Parameter Update Response

      4)流控與數據管理類

      • 0x16 LE Flow Control Credit

      5)其他功能性控制類

      • 0x17 Credit Based Connection Request(BR/EDR 共用型,LE 可能保留)
      • 0x18 Credit Based Connection Response
      • 0x19 Local Busy Detected
      • 0x1A Local Busy Cleared

      由于Code的定義針對每個BLE協議版本都不完全一致,還請自行參考協議。以下根據Ver 6.0版本給出參考路徑及協議參考章節:

      • 下載鏈接:?藍牙 Core_v6.0
      • 參考章節:Vol 3: Host > Part A:?CreditsLOGICAL LINK CONTROL AND ADAPTATION PROTOCOL SPECIFICATION >?4 SIGNALING PACKET FORMATS

      3.2.2 Credit流控規則

      1)發送方每發1個L2CAP報文Credit值減1

      2)接收方可以通過0x16指令刷新Credit值

      3)Credit值為0時,發送方必須暫停傳輸,等待Credits重新刷新

      注意:

      LE Credit Based Flow Control 機制僅適用于通過LE Credit Based Connection建立的用戶自定義邏輯信道(CID 0x0040~0x007E)。固定信道(0x0004, 0x0005, 0x0006)不使用此流控機制。

      因為靜態信道(CID x0004、0x0005、0x0006)都是固定用途、小數據量通信。應用自定義或大數據傳輸,必須使用流控進行通信通關。


      想了解更多嵌入式技術知識,請點擊閱讀我的其他文章

      煙花的文章鏈接集合-CSDN博客

      如果你覺得內容對您有幫助,別忘了點贊、收藏和分享支持下哦!

      本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
      如若轉載,請注明出處:http://www.pswp.cn/diannao/95863.shtml
      繁體地址,請注明出處:http://hk.pswp.cn/diannao/95863.shtml
      英文地址,請注明出處:http://en.pswp.cn/diannao/95863.shtml

      如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

      相關文章

      CSS保持元素寬高比,固定元素寬高比

      方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">這里是正文內容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 寬高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …

      數據分析小白訓練營:基于python編程語言的Numpy庫介紹(第三方庫)(上篇)

      &#xff08;一&#xff09;Numpy庫的安裝安裝指定版本的Numpy庫&#xff0c;打開命令提示符&#xff0c;輸入下圖內容&#xff0c;只需要將1.25.5的版本修改成個人需要的版本&#xff0c;然后按下回車鍵&#xff0c;numpy庫就安裝在python中&#xff1a;指定版本numpy庫安裝可…

      從 Windows 到 Linux 服務器的全自動部署教程(免密登錄 + 壓縮 + 上傳 + 啟動)

      一、準備工作 1. 環境說明 本地開發環境&#xff1a;Windows 服務器&#xff08;需執行部署腳本&#xff09;目標服務器&#xff1a;Linux 服務器&#xff08;需安裝 node.js、pm2、unzip&#xff09;核心工具&#xff1a;7-Zip&#xff08;壓縮&#xff09;、OpenSSH&#x…

      智能汽車領域研發,復用云原始開發范式?

      汽車電子電氣架構演進趨勢&#xff1a;分散的功能ECU -> 域控制器 -> 中央計算服務器汽車電子方案與架構在發展與迭代時會使用虛擬化方法幾種可行的軟硬一體化方案&#xff1a;多ECU&#xff0c;硬件隔離&#xff0c;硬件分區&#xff0c;車規級多核硬件架構 Hypervisor…

      數據電臺詢價的詢價要求

      技術規格及主要參數 1.電臺基本要求&#xff1a; 1.1 電臺中的信號處理基于FPGA設計&#xff0c;采用FPGAARM高速AD/DA設計架構&#xff1b; 1.2 具備頻譜感知、自主選頻、跳頻、擴頻等功能&#xff1b; 1.3 具備鏈路質量信息、自組網路由信息、電池電壓監測信息、北斗定位信息…

      IoT/HCIP實驗-5/基于WIFI的智慧農業實驗(LwM2M/CoAP+PSK+ESP8266 連接到 IoTDA)

      文章目錄概述WIFI8266 通信模組WIFI模組也用AT指令&#xff1f;ESP8266 內置協議棧?支持的無線網絡模式MCU通過串口與模組交互Wifi模組做客戶端PC-AT接入路由器向本地TCP服務發數據用代碼接入你家路由器已接入AP&#xff08;你家Wifi&#xff09;平臺側開發工程配置和編譯工程…

      定時器輸出PWM波配置(呼吸燈)

      使用定時器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;實現呼吸燈效果。 頻率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499pwm.c:#include "pwm.h" // 本模塊頭文件&#xff1a;應聲明 pwm_init/pwm_compare_set 等原型、并包含 HAL 頭//&#xff08;示…

      [ai-agent]環境簡介之沙盒e2b vs daytona

      所謂的環境的就是agent運行在哪里&#xff0c;或者是agent和那里進行交互。 最常見的環境就是本地開發環境&#xff0c;也就是個人主機&#xff0c;但是存在問題就是沒有辦法出網和橫向擴展。 在沙盒之前也是有其他選擇的&#xff1a; 云服務器&#xff0c; 虛擬機&#xff0c;…

      【前端面試題】前端面試知識點(第三十一題到第六十一題)

      三十一. CSS實現垂直水平居中 實現元素的垂直水平居中是前端開發中的常見需求,主要有以下幾種思路: text-align + line-height實現單行文本水平垂直居中 適用于單行文本元素,通過text-align: center實現水平居中,line-height等于容器高度實現垂直居中 text-align + vertic…

      嵌入式練習項目——————抓包獲取天氣信息

      一、內容 嘗試通過實時天氣接口 - 數據接口 - NowAPI此網站獲取天氣信息&#xff0c;實現可以發送城市查詢當前天氣和未來天氣 二、獲取請求報文 可以根據測試示例看到獲取內容&#xff0c;此時數據是cJSON格式&#xff0c;我們首先要通過合適的網址抓包獲取到請求報文&#x…

      Python爬蟲實戰:研究NewsCrawl ,構建新浪和網易新聞數據采集系統

      1. 引言 1.1 研究背景與意義 在信息時代,新聞作為社會動態、公眾觀點的重要載體,其傳播速度與影響力持續擴大。傳統的人工篩選與采集方式已無法滿足對海量新聞數據的高效處理需求,亟需自動化工具實現大規模、結構化的新聞數據采集。網絡爬蟲技術作為一種按照預設規則自動抓…

      PyTorch神經網絡工具箱全解析:nn.Module vs nn.functional

      &#x1f50d; 為何需要神經網絡工具箱&#xff1f; 在僅用 Autograd 和 Tensor 實現模型時&#xff0c;開發者需手動設置參數梯度&#xff08;requires_gradTrue&#xff09;、反向傳播&#xff08;backward()&#xff09;及梯度提取&#xff0c;過程繁瑣且易出錯。nn 工具箱應…

      Java注解學習記錄

      目錄 一、為什么要學注解&#xff1f; 二、注解是什么&#xff1f; 三、為什么要使用注解&#xff1f; 四、注解的作用 五、注解的分類 5.1 元注解 Retention&#xff08;/ r??ten?(?)n /&#xff09; ★★★★★ Target ★★★★★ Inherited(/ ?n?her?t?d /…

      43.安卓逆向2-補環境-使用unidbg(使用Smali語法調用方法和使用方法地址調用方法)

      免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

      【Kubernetes知識點問答題】Pod 調度

      1. 如何將特定 Pod 調度到指定的節點&#xff1f;可以使用下列方法中的任何一種來選擇 K8s 對特定 Pod 的調度&#xff1a;① 與節點標簽匹配的 nodeSelector&#xff1a;在 Pod 的規范中使用 nodeSelector 字段來指定節點標簽&#xff0c;以便將 Pod 調度到具有特定標簽的節點…

      wordpress顯示時間日期的幾種常見的方式

      在WordPress中&#xff0c;顯示時間日期有多種常見方式&#xff0c;包括使用默認設置、模板標簽、插件等&#xff0c;以下是詳細介紹&#xff1a; 使用默認設置 WordPress的默認設置允許你在文章列表中顯示文章的發布時間。登錄到WordPress后臺&#xff0c;在“設置”中找到“…

      基于飛算JavaAI實現布隆過濾器防止緩存穿透:原理、實踐與全流程解析

      引言&#xff1a;當緩存失效時&#xff0c;系統如何避免“雪崩式崩潰”&#xff1f; 在互聯網高并發場景中&#xff08;如電商秒殺、社交平臺熱點新聞&#xff09;&#xff0c;緩存是提升系統性能的核心手段——將頻繁訪問的數據&#xff08;如商品詳情、用戶信息&#xff09;存…

      DeepResearch開源與閉源方案對比

      在這個AI不再只是聊天工具的時代&#xff0c;"深度研究"已經成為大語言模型&#xff08;LLM&#xff09;的一項新能力。先進的LLM不再只是給出快速的一次性回答&#xff0c;而是可以像研究助手一樣工作——搜索網上信息&#xff0c;調用各種工具&#xff08;比如搜索…

      UniApp 頁面傳參方式詳解

      在 UniApp 開發中&#xff0c;頁面間參數傳遞是核心功能之一。以下是 8 種常用的傳參方式&#xff0c;每種方式都有其適用場景和特點&#xff1a;一、URL 拼接傳參&#xff08;最常用&#xff09; 適用場景&#xff1a;簡單數據傳遞&#xff0c;如 ID、狀態值等基礎類型數據 實…

      音頻分類標注工具

      pyqt 分類標注工具&#xff1a;import glob import sys import json import os from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget, QTableWidgetItem,QSplitter, QVBoxLayout, QWidget, QPushButton, QRadioButton,QButtonGroup, QLabel, QHBoxLayout, Q…