蓝牙系列十三:协议栈L2CAP层

L2CAP 全称为逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol),位于基带层之上,将基带层的数据分组交换为便于高层应用的数据分组格式,并提供协议复用和服务质量交换等功能。

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

 

再来看一下L2CAP层,类比于医院的结构,它是收发室。收发室里面的人是医院的内部员工,它可以在医院内部来传动包裹。
客户端手机想去读取某个属性,它需要利用ATT这一层来发起请求,请求的数据需要经过L2CAP层以及下面的几层到达服务端的L2CAP层。
服务端L2CAP这一层,需要把请求的数据发给ATT层。

建议先复习《BLE协议各层的形象化理解》,下面是我们之前用来类比的医院结构图:

下面这个图是BLE协议各层跟医院的各个科室的类比图:

Controller就是快递公司,它知道把数据发给对方哪一个设备,但是它不能进入对方内部。

L2CAP是“收发室”,它熟知Host的内部结构。

回顾上一节内容,Host和Controller之间的数据有命令(Command)、事件(Event)、ACL数据等等。这里的ACL数据就是想通过controller发给对方设备的数据,ACL数据就是要传送的包裹。那么ACL数据的格式是怎样的呢?

1. 发送数据时,它知道把数据的给对端Host的哪一层:填入CID

2. 接收数据时,它知道把Controller发来的数据转发给Host的哪一层:根据CID转发

既然说要传送的数据是由L2CAP层来构建的,那么就看一下L2CAP的数据格式。

一、L2CAP层数据格式:

在BLE中,可用的channel ID如下图:

上表中的channel,我们一般只需要关注4、5、6。

Channel 4用于传输ATT层的数据,Information payload的格式以后再说;

Channel 5被称为“信令信道”,用于传输一些控制信息,比如“更新连接参数”;

Channel 6用于传输SM层的数据,Information payload的格式以后再说。

注意:对于不同的channel ID,它的information payload是不一样的。本节着重看channel 5的information payload.

1.1 信令信道

Channel 5被称为“信令信道”,有3类数据:

a. 命令:Command

b. 命令拒绝:Command Reject

c. 响应:Response

设备A给设备B发送Command,设备B可以回复Command Reject表示拒绝,或是Response。

这3类数据的格式都是一样的:

Code表示是哪一个命令/响应;Identifier用来匹配一发一收的数据:设备A发送command时会设置Identifier,设备B响应时也要设置Identifier为同一个值。

二、L2CAP层数据传输过程(Fragmentation,分片):

应用程序通过L2CAP传送数据给对方,不应该限制数据包的大小,但是蓝牙控制器是使用单片机来实现的,它里面的内存是有限的,较大的数据包传进来,它的内存就不够用了。因此L2CAP传输数据时,如果数据包很大,应该把数据拆分成一个个小包,然后依次发给蓝牙控制器,再由蓝牙控制器发给对方,对方蓝牙控制器收到一个个小包后直接给host,再由host将小包组合起来。

注意:数据包的拆分和组装都是在host这一层做的,它不会放到controller中去做,毕竟controller里的资源有限。对于不同的蓝牙协议栈,有的是在L2CAP拆分和组装,有的是在HCI层进行的拆分和组装。反正都是在host这一端去做的。

1. 包很小,不同拆分,可以一次性传送出去。

1)channel ID表示要传送给对端设备的哪个channel(4,5,6中的哪一个?)

问题:它在哪里表示对端设备呢?在L2CAP这一层没有发现
2)在HCI这一层,会在包(黄色区域)的前面加上一个头部,头部中有个handle,就代表了对端的设备。头部中的PB表示起始包,length表示L2CAP整个数据包(即黄色区域部分,这里面有length、channel ID、以及数据本身)的大小。
3)HCI将数据构造好了之后,会通过串口或usb口把构造的新包传给控制器。
4)LL层在收到数据后,会将里面真正的数据抽取出来。这个数就是来自L2CAP层的数据。然后它也会构造一个头部,根据HCI层传入的handle得到access address(代表一个连接,也就是对端的设备), 它还会根据HCI中的PB构造一个header,header中的LLID设为10b,也就是代表了起始包,还会根据HCI中length构造header中的length。

5)整个LL层构造的数据包就会通过无线信号发送给对端设备。

以上就是对L2CAP层中一个小包的处理过程。

2. 包不可以一次性传送出去。

L2CAP的包很大,那么这个打包就会拆分成很多小包。在该例中将其拆分成两个小包,前面的那个小包和上面的过程是一样的,作为一个起始包发送出去的。后面的蓝色小包呢?它的发送过程也和前面类似,只不过它是作为延续包发送出去的

参考代码:

l2cap_send_le_signaling_packet        (src\l2cap.c)hci_send_acl_packet_buffer        (src\hci.c)hci_send_acl_packet_fragments (src\hci.c)att_write_request                         (src\ble\gatt_client.c)l2cap_send_prepared_connectionless    (src\l2cap.c)hci_send_acl_packet_buffer        (src\hci.c)hci_send_acl_packet_fragments (src\hci.c)

三、L2CAP层数据接收过程(Recombination,重组):

与上述Fragmentation过程相反,L2CAP通过HCI层得到起始包、延续包的,重组成一个L2CAP包。

Host通过HCI从Controller得到ACL数据后,从这里开始处理(btstack-master\src\hci.c):

Acl_handler函数负责重组L2CAP包。

1. 起始包的数据里含有length,总长度=length+4(length是infomation payload的长度,4表示头部(length 和channel ID))。注意这个length在起始包中会原原本本的传送给对方设备。

2. 对端设备接收到起始包后,可以计算出总长度

3. 对端设备累加起始包、延续包的长度,等于总长度时就表示收到了完整的包

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

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

相关文章

手写Mybatis自动填充插件

目录 一、Mybatis插件简介🥙二、工程创建及前期准备工作🥫实现代码配置文件 三、插件核心代码实现🍗四、测试🥓 一、Mybatis插件简介🥙 Mybatis插件运行原理及自定义插件_简述mybatis的插件运行原理,以及如何编写一个…

HTML 语义化:构建优质网页的关键

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

深度学习与强化学习的绝妙融合:引领未来智能科技新潮流!

深度学习在强化学习中的应用已经取得了显著的成果,特别是在处理复杂环境和大规模数据方面。 一、概述 强化学习是一种独特的机器学习范式,其核心在于通过代理与环境的交互来学习最优行为策略。这种学习方式是试错性的,代理在不断地尝试、接…

【JavaScript】面试手撕深拷贝

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深拷贝的作用深浅拷贝的区别浅拷贝深拷贝 深拷贝实现方式JSON.parse(JSON.stringi…

微信小程序云开发教程——墨刀原型工具入门(素材面板)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

在云端构建和部署工作负载的最佳方式是怎样的?

如果要问当今企业希望从云计算中获得什么,那么 “低延迟” 以及 “更接近客户” 可能会是很多企业的首要目标。低延迟可以带来诸多好处,如提升用户满意度、增加竞争优势、降低运营成本等;更接近客户则有助于降低网络拥塞、减少数据丢失、符合…

Java设计模式:外观模式

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…

ArcGIS学习(十四)OD分析

ArcGIS学习(十四)OD分析 1.上海市KFC与麦当劳的空间聚集度分析 本任务给大家带来的内容是网络节点关系分析。网络节点关系分析一般也叫OD分析。“O”指的是起点(ORIGIN),"D”指的是终点(DESTINATION),0D分析即为基于起点到终点的分析。 网络节点关系分析我们经常…

基于springboot的厨艺交流平台

采用技术 基于springboot的厨艺交流平台的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示 食材分类管理 用户信息管理 菜谱分类管理 菜谱信息管理 食材信息…

Swarm集群负载均衡的实现方式

目录 1. 背景2. 参考3. 环境4. 概念5. Swarm 网络5.1 Swarm 网络连接情况5.2 外部访问数据包转发流程 6 Swarm集群服务信息7 Swarm集群数据包转发流程7.1 Client发送请求至集群节点9090端口7.1.1 集群节点宿主机Netfilter规则7.1.2 Tcpdump抓包验证结果 7.2 Ingress_sbox下IPVS…

【漏洞复现】网康NS-ASG应用安全网关 index.php SQL注入漏洞(CVE-2024-2330)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和 IPSecQ,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短…

Hadoop学习3:问题解决

文章目录 问题解决1. ERROR: but there is no HDFS_NAMENODE_USER defined2. JAVA_HOME is not set and could not be found.3. Hadoop-DFS页面访问不了4. namenode格式化失败,或者dfs页面打开失败5. ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Ab…

《ElementPlus 与 ElementUI 差异集合》el-input 和 el-button 属性 size 有变化

差异 element-ui el-input 和 el-button 中,属性size 值是 medium / small / minielement-plus el-input 和 el-button 中,属性size 值是 ‘large’ | ‘default’ | ‘small’; 如果你是自动升级,Vue3 系统会有如下警告“ el-b…

机器学习模型—支持向量机 (SVM)

机器学习模型—支持向量机 (SVM) 支持向量机 (SVM) 是一种强大的机器学习算法,用于线性或非线性分类、回归,甚至异常值检测任务。SVM 可用于各种任务,例如文本分类、图像分类、垃圾邮件检测、笔迹识别、基因表达分析、人脸检测和异常检测。SVM 在各种应用中具有适应性和高效…

使用C#创建服务端Web API

前言 C# Web API 是一种基于 .NET 平台(包括但不限于.NET Framework 和 .NET Core)构建 HTTP 服务的框架,用于创建 RESTful Web 服务。REST(Representational State Transfer)是一种软件架构风格,它利用HT…

前端食堂技术周刊第 115 期:Rolldown 正式开源、马斯克宣布 xAI 本周将开源 Grok、如何使用 Copilot 完成 50% 的日常工作?

美味值:🌟🌟🌟🌟🌟 口味:手打柠檬茶 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看…

“antd“: Unknown word.cSpell

你遇到的问题是 VS Code 的 Code Spell Checker 插件在检查拼写时,将 "antd" 标记为未知单词。"antd" 是 Ant Design 的缩写,是一个流行的 React UI 库,不是一个英语单词,所以 Spell Checker 会将其标记为错误…

SpringBoot 多环境的配置(附带有截图)

文章目录 概要整体配置流程配置详细说明技术细节小结 概要 多环境开发 在实际项目开发中,一般需要针对不同的运行环境,如开发环境、测试环境、生产环境等,每个运行环境的数据库等配置都不相同,每次发布测试、更新生产都需要手动…

2024蓝桥杯每日一题(时间日期)

一、第一题:日期差值 解题思路:模拟 写一个计算时间的板子两者相减 【Python程序代码】 mon [0,31,28,31,30,31,30,31,31,30,31,30,31] def pd(x):if x%4000 or (x%40 and x%100!0):return Truereturn False def get_day(y,m,d):res 0for i …

代码学习记录16

随想录日记part16 t i m e : time: time: 2024.03.11 主要内容:今天的主要内容是二叉树的第五部分,主要涉及最大二叉树;合并二叉树;二叉搜索树的搜索;验证二叉搜索树。 654.最大二叉…