蓝牙协议栈之L2CAP使用

news2024/11/15 19:54:34

目录

  • 前言
  • 一、逻辑链路层及自适应协议层(L2CAP)
  • 二、常用的L2CAP术语
  • 三、L2CAP的工作模式
  • 四、L2CAP通道
  • 五、L2CAP帧类型
  • 六、Fragmentation/Recombination
  • 七、Segmentation/Reassembly
  • 八、L2CAP MTU
  • 九、Controller to Host Flow Control
  • 十、总结


前言

    本文记录对蓝牙协议栈逻辑链路及自适应协议层的学习还有后面如何在TI的蓝牙芯片上去实现L2CAP CoC的数据透传,为什么用L2CAP CoC进行数据透传呢?因为它每次透传的数据量远远能比GATT大,如果堆够用的话可以传输64KB,而GATT数据透传限于ATT-MTU,最多每次能传输的也就247个字节。

一、逻辑链路层及自适应协议层(L2CAP)

    该层属于主机的内容,位于HCI层的上一层,我们可以看下下面这个结构图1-1加强一下印象:
在这里插入图片描述

图1-1 BLE协议栈框架

    它的作用是为主机的GAP, GATT, SM, Application和链路层之间搭建起通信的桥梁,因此它有不可或缺的协议复用能力。同时,在主机和协议栈数据交换中它还有数据分段和重组的能力。所有从主机或者APP发出的数据都在这一层被封装成L2CAP packet。L2CAP允许更高层的协议(比如GATT、SM)和APP去发送和接收上层data packets(L2CAP服务数据单元,SDU),最多能传输64KB。L2CAP也允许每个通道的流控制和重发机制。

二、常用的L2CAP术语

L2CAP Channel: L2CAP通道,对端设备两节点之间的逻辑连接,用它们的信道标识符(CIDs)做通道的区分。
SDU: 服务数据单元,L2CAP与上层交换的数据包,它不包含L2CAP的帧头。
PDU: 协议数据单元,包括了L2CAP协议信息域、控制信息、上层信息数据,这个数据包就包含了L2CAP的帧头。一个SDU可能被分割成多个PDU进行传输。
MTU: 最大数据传输单元,上层应用可以接收的payload最大字节数,注意这个跟ATT的MTU是不一样的。
MPS: L2CAP可以接收的payload最大字节数。
Credit: 本蓝牙设备可以接收的LE帧数量。Credits取值范围是1~65535,在两个设备之间使用流控制。
L2CAP Basic Header: 为每个PDU预先准备的L2CAP协议信息。它包括了CID和长度。
PSM: 协议服务复用器,占用两个字节,用于定义L2CAP信道数据的解析。有动态的PSM和固定的PSMs。固定的PSMs是由SIG定义的,而动态的PSMs可以由GATT发现。
Fragmentation/Reconbination: 分包重组,分包(分段)是将单个L2CAP PDU分解成更小的数据段以供发送器发送的过程。重组是控制器将片段重新组装成完整的L2CAP PDU的过程。分包重组是由控制器实现的,并且基于LE数据长度扩展特征(可以看下Local supported feature)。
Segmentation/Reassembly: 分段是将单个L2CAP SDU分解成多个成为SDU段的L2CAP数据包的过程。在接收侧按照与此操作相反的方式进行重新组装。每个段都封装在一个适当的L2CAP报头中。分段和重组都是由L2CAP处理,并且对上下层都是透明的。
:SDU的最大字节数等于协议栈里边定义的L2CAP_SDU_SIZE。
代码如下(示例):

三、L2CAP的工作模式

    蓝牙5协议栈L2CAP支持两种不同的工作模式:Basic L2CAP Mode和LE Credit Based Flow Control Mode。

四、L2CAP通道

    L2CAP由3种通道类型:Connection-Oriented、Connectionless data、L2CAP signaling。L2CAP的每个端点由信道标识符CID引用。Connectionless data channels不适用于蓝牙5协议栈。另外,通道可以划分为固定通道动态通道
    固定通道执行特殊的L2CAP功能,使用的CIDs范围在0x0001和0x003F之间。每个固定通道的特征(比如MTU)都是独立的。
    下面罗列了协议栈和应用程序可以使用的CIDs

CIDDescriptionUsage
0x0004Attribute Protocol(ATT)Sending ATT information
0x0005LE Signaling ChannelSending L2CAP commands
0x0006Security Manager Protocol(SMP)Sending Pairing/Security Information
0x0040~0x007FDynamically AllocatedLE Credit Based Flow control packets

    比如,GATT层的数据交互使用的通道是0x0004,SMP(配对、安全)使用0x0006通道。应用程序不能直接访问ATT、SMP、信号通道,因为它们已经被相关的Host Layers使用了。上面提到的LE signaling channel使用在L2CAP连接参数更新流程、使用在动态通道上建立LE Credit基本连接,以及使用在交换Credits上。
    动态分配的通道ID用于识别逻辑链路和本地端点。本地端点的取值范围是0x0040到0xFFFF。这个本地端点用于面向连接的L2CAP通道(COC,全称Connection-orientated channel)。这些动态分配的通道是可以被应用程序访问和管理的,以便在L2CAP-COC上定义自己的协议。L2CAP通道是双向的,类似于套接字。动态分配一个通道,有以下3个参数:PSM、MTU、CID。前面提到,固定的PSMs是由BLE SIG定义的,它们的范围是0x00010x007F。动态的PSMs的范围是0x00800x00FF。PSMs可在GATT服务端设备上保持固定,而GATT客户端可以从GATT服务端中获取PSM。

五、L2CAP帧类型

    在蓝牙协议栈里面有两个L2CAP帧类型。
    (1)Basic Frame:基本帧,在基本模式下由固定通道使用
    (2)LE information Frame:低功耗信息帧,用于LE credit基本流控制模式下的动态通道。
:L2CAP处理来自主机或者APP的SDU数据帧。
下面是不同帧类型的帧头区别:

L2CAP Frame TypeHeader SizeHeader Contents
Basic frame4Length:2 octets CID: 2 octets
LE information frame6Length:2 octets CID: 2 octets SDU length: 2 octets

六、Fragmentation/Recombination

    从L2CAP的角度来看,所有数据包都作为完整的数据包发送到控制器和从控制器接收。这也意味着分段/重组(如果使能了LE DATA Length Extension)是由控制器执行的,并且对L2CAP不可见。当使用分段时,较大的数据包将被拆分成多个LL数据包然后在对端设备的LL层进行重组(LL层属于控制器的一部分)。

七、Segmentation/Reassembly

    当工作在基本模式下,L2CAP不执行分段或者重组。但是,动态通道工作在LE Credit基本流控模式下,是有可能发生数据包的分段和重组的。

八、L2CAP MTU

    L2CAP MTU是L2CAP层能够处理的最大数据字节大小。然而,L2CAP使用的MTU是不同的,取决于模式和通道类型。
(1)信号通道会使用L2CAP_SIG_MTU_SIZE
(2)固定通道数据包的MTU限定最大是MAX_PDU_SIZE - L2CAP_HDR_SIZE
(3)COC数据包的最大字节数取决于PSM的MTU,同时被L2CAP_SDU_SIZE限制
    当对于固定通道,MTU由更高级别的协议(如ATT)定义。在COC上,MTU受L2CAP_SDU_SIZE和对端设备支持的MTU的最小值约束。

九、Controller to Host Flow Control

    MAX_NUM_PDU定义了一次可以入列到控制器的TX数据包的最大个数。尝试发送更多数据包将导致调用的API接口返回失败,并且数据包也没有真正入列到控制器中。
    应用程序可能不清楚在给定时间内有多少个数据包在等着发送,因此我们在写代码调用API的时候最好就是检查API的返回值。还有,一般L2CAP有流控制通知功能,我们可以使用它来提高L2CAP数据通讯的效率。这里那ti的蓝牙芯片来举例,可以使用L2CAP_RegisterFlowCtrlTask()这个API使能流控,这样协议栈会有事件L2CAP_NUM_CTRL_DATA_PKT_EVT通知APP可发送的数据包数量,这个事件会在每次有新的缓冲区可用时触发。

十、总结

使用L2CAP总结如下:
    主机和从机都可以请求建立L2CAP COC通道。一旦L2CAP连接建立成功之后,协议栈会发送L2CAP_SIGNAL_EVENT到应用层,具体的事件是L2CAP_CHANNEL_ESTABLISHED_EVT,这个是双方都会触发的事件。主机和从机双方需要交换L2CAP Credits。连接建立之后,设备(双方)可以分发Credit。最后,我们就可以利用L2CAP CoC通道发送数据了,可以调用接口L2CAP_SendSDU()这个API发送数据,当成功将数据发送到空中之后,协议栈会给应用层发送L2CAP_SIGNAL_EVENT,具体事件是L2CAP_SEND_SDU_DONE_EVT。而接收数据呢?当蓝牙接收到数据之后,协议栈会给应用层发送L2CAP_DATA_EVENT事件,并携带接收到的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/498315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七个值得推荐的物联网分析平台

物联网分析平台是一种软件工具,可以帮助企业收集和分析来自其广泛的物联网设备的数据。企业可以通过物联网收集大量数据,从消费者支出模式到流量使用,物联网数据分析平台在帮助企业获得竞争优势所需的洞察力方面至关重要。 物联网分析平台已…

「2023 最新」 Github、Gitlab Git 工作流「常用」 git 命令、规范以及操作总结

Git commit 规范 关于提交信息的格式,可以遵循以下的规则: feat: 新特性,添加功能fix: 修改 bugrefactor: 代码重构docs: 文档修改style: 代码格式修改test: 测试用例修改chore: 其他修改, 比如构建流程, 依赖管理 Git 基础知识 当我们通过…

Midjourney生成LOGO指南

目录 常见的Logo 宠物店Logo Graphic Logo​ Lettermark Logo​ Geometric Logo​ Mascot Logo​ 增加风格——艺术运动​ 每个产品都有自己的专属名称,也有自己专属的Logo,经过前几篇的学习,我相信你也有了一定的基础,今天…

TiDB实战篇-PD调度常见问题处理方法

常见的问题 调度产生和执行 常见的调度类型 参数调度的速度 调度典型场景 Leader分布不均匀监控 leader分布算法,每一个leader的size作为总和,还有TiKV的剩余空间等等。 可以手动设置权重。 分布不均衡处理 TiKV节点下线速度慢 TiKV下线速度慢解决方法 …

一文说透IO多路复用select/poll/epoll

概述 如果我们要开发一个高并发的TCP程序。常规的做法是:多进程或者多线程。即:使用其中一个线程或者进程去监听有没有客户端连接上来,一旦有新客户端连接,就新开一个线程(进程),将其扔到线程(或进程&…

C++——类和对象[下]

0.关注博主有更多知识 C知识合集 目录 1.再谈构造函数 1.1初始化列表 1.2初始化列表的初始化顺序 1.3构造函数的隐式类型转换 1.4explicit关键字 2.static成员 2.1static成员变量 2.2static成员函数 3.友元 3.1友元函数 3.2友元类 4.内部类 5.匿名对象 6.编译器…

美颜sdk对于移动端视频直播的优化效果研究报告

随着移动互联网的快速发展,移动端视频直播应用也越来越受到用户的青睐。然而,对于许多用户来说,直播的画质却成为了一个令人头疼的问题。为了解决这个问题,许多直播应用开始引入美颜sdk,以期提升直播画质和用户体验。本…

凌思微-蓝牙框架-流程理解

1.蓝牙SOC芯片主函数流程 int main() { sys_init_app(); ble_init(); dev_manager_init(dev_manager_callback); gap_manager_init(gap_manager_callback); gatt_manager_init(gatt_manager_callback); rtos_init(); ble_task_init(); app_task_init(); vTaskStartScheduler();…

第8章:聚合函数

目录 一、常见的聚合函数 二、GROUP BY 的使用 三、HAVING 的使用,过滤数据 四、SQL底层的执行原理 五、练习 一、常见的聚合函数 1.概念 聚合函数作用于一组数据,并对一组数据返回一个值。 2.聚合函数的类型 AVG(),SUM(),MAX(),MIN(),COUNT() 3. AV…

【Spring篇】AOP

🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、AOP简介 1.什么是AOP? 2.AOP作用 3.AOP核心概念 二、AOP入门案例 1.需求分析 2.思路分析 3.环境准备 4.AOP实现步骤 三、AOP工作流程 1.AOP工作流程 2.AOP核心概念 四、AOP配置管…

Python小姿势 - 1. Python的设计理念

Python的设计理念 Python的设计理念是“优雅”、“明确”、“简单”。 优雅:Python代码风格优美,语法简洁明了,代码可读性高,易于理解和维护。 明确:Python语言规范清晰,标准库丰富,可用于开发各…

第五章 作业(123)【编译原理】

第五章 作业【编译原理】 前言推荐第五章 作业123 随堂练习课前热身04-17随堂练习04-17课前热身04-24 最后 前言 2023-5-3 22:12:46 以下内容源自《【编译原理】》 仅供学习交流使用 推荐 第四章 作业(123)【编译原理】 第五章 作业 1 1.令文法G为…

医生的百科词条怎么创建?医生的百科词条创建技巧值得你收藏

医生是医学领域中的专业人员,主要负责诊断、治疗和预防疾病。在现代社会中,医生的角色越来越重要,是社会中不可或缺的职业之一。 而随着互联网的发展,百度百科已成为人们获取信息的重要途径,医生想要提高自己的知名度和…

SpringBoot项目简单入门

一、创建项目 1、选择Spring Initializr 2、为了提高项目构建效率,可以尝试修改阿里脚手架,地址如下: https://start.aliyun.com 3、点击下一步 4、选择Web与spring Web,然后点击完成开始项目构建 5、项目构建完成如图所示 二、…

Linux基础知识—Linux

文章目录 1.认识Linux2.常见命令2.1ls2.2pwd2.3cd2.4touch2.5mkdir2.6rm2.7cp2.8mv2.9man2.10date2.11grep2.12ps2.13netstat 3.文件内容的操作3.1cat3.2vim3.3less3.4head3.5tail3.6管道|3.7重定向 4.管理软件4.1yum(在线的方式管理)4.2rpm(…

OnlineJudge-负载均衡式在线OJ

关于个人项目是在找实习以及参加秋招非常重要的简历内容,今天博主来介绍一下自己的一个项目。 开发环境:CentOS7、Makefile、g、vscode、MySQL Workbench 所用技术:C STL 标准库、Boost 准标准库(字符串切割)、cpp-httplib 第三方开源网络库 …

数据结构(C语言):两个字符串比较大小

一、一个小插曲 在写这篇文章之前,作者想先和大家分享一个小故事。如果你不想看这个小故事的话,可以直接跳到第二点哦。 为了锻炼自己的编码能力,平时作业和实验题的代码我都是不看书、不看老师的PPT,按照自己的思路一行一行敲出…

【STM32CubeMX】F103RTC时钟

前言 本文记录了我学习STM32CubeMX的过程,方便以后回忆。我们使用的开发板是基于STM32F103C6T6的。本章记录了RTC时钟的基础配置。下文调试时用到的串口来查看,不过串口的配置省略了。 步骤 实验目标:基于RTC时钟,查看它的秒计时…

Mac电脑配置李沐深度学习环境[pytorch版本]使用vscode

文章目录 第一步 M1芯片安装Pytorch环境安装Miniforge创建虚拟环境安装Pytorch 第二步 下载李沐Jupyter文件第三步 配置vscode参考 第一步 M1芯片安装Pytorch环境 安装Miniforge Mac打开终端(Mac电脑如何启动终端?打开启动台,搜索终端即可&…

网络安全合规-数据分类分级标准汇编

今天主要学习讲解的是网络安全合规-数据分类分级标准汇编。 作为数据安全治理的前期首要工作-分类分级,而分类分级的开展工作又是根据相关标准开展的,建立数据安全防护体系的第一步就是梳理数据资产进行分类分级。只有做好分类分级工作,对不同…