蓝牙core_v5.2协议-4 L2CAP上

2023-10-29

本章节主要讲述蓝牙host层的协议,针对BLE,主要关注L2CAP、GATT/ATT、SMP、GAP这几层。根据spec的章节顺序,我们一次讲解:

PART A:A: LOGICAL LINK CONTROL AND ADAPTATION PROTOCOL SPECIFICATION


1. L2CAP概述(逻辑链路控制和适配协议)

 

L2CAP层,中文翻译是逻辑链路控制和适配协议层,在BLE中提供的主要功能是:抽象出来logic channel供上层使用,同时能够对数据进行分包和重组。同时L2CAP能够提供必要的数据通信可靠性保证,如Flow control等。如上图所示,upper layer的data能够由L2CAP layer fragment,最终传输到Lower layer,即实现SDUs变为PDUs的过程。

Protocol/channel multiplexing:信道复用技术。这里需要提出一个概念:信道标识符,信道标识符是logic channel的唯一标识,针对BLE的面向无连接特性,BLE的信道标识符是固定的。BLE存在三条信道标识符,即用于ATT的0x0004,用于安全管理的0x0006,用于BLE信令的0x0005. 

Segmentation and reassembly:分段和重组技术。这里需要指出的是这里的Segmentation和reassembly说的是针对upper layer传输来的数据,即上层数据一般不需要自己做分段和重组操作,但是按照多大长度进行分段需要上层告知,这样才可适应upper layer。需要和Fragmentation and Recombination区别。

Flow control per L2CAP channel:流控技术。每个channel需要提供流控。

Error control and retransmissions:错误控制技术。传输出错能够重传或者汇报错误。

Support for Streaming:指出流媒体数据。

Fragmentation and Recombination:L2CAP的PDUs可能不能够适应HCI层的传输要求(HCI层一次能够接受的数据长度有限),为了能够将数据传给HCI层,需要进行分包操作。分包的数据必须加上标识,这样才能够被传输出去,便于对端设备重组包。

Quality of Service:支持Qos。

根据上图我们可以看到,L2CAP和其上层或者下层的交互都是很可靠的传输。同时设备和对端设备之间的交互,都需要采用request和response的机制,确保数据交互的可靠性。

针对一个logic channel,L2CAP可以将其工作在以下的模式:

• Basic L2CAP Mode(标准模式):一般无任何特殊要求的情况下,L2CAP一个logic channel工作的模式。
• Flow Control Mode(流控模式):该logic channel能够支持flow control。
• Retransmission Mode(重传模式):利用一个timer和一套go-back-n repeat机制,保证数据能够传送到对端。
• Enhanced Retransmission Mode(增强重传模式):和Retransmission Mode类似,但是添加了新的机能保证数据的传输。
• Streaming Mode(流模式):为了传输real-time isochronous数据,数据被标记,无需ack机制,传输不使用TxWindow size。
• LE Credit Based Flow Control Mode(基于信任的流控模式):一种利用Credit做的流控机制
• Enhanced Credit Based Flow Control Mode(增强型基于信任的流控模式):一种利用Credit做的增强流控机制

需要注意的是,Flow Control Mode and Retransmission mode和其增强的Enhanced Retransmission mode, Enhanced Credit Based Flow Control mode, or Streaming mode不可共存。


2. L2CAP数据包格式

L2CAP的包根据使用的场景,分为面向连接的和无连接的(connection-oriented or connectionless)。

connectionless无连接的包很少使用,我们这里简单说明下格式:G-frame

我们重点说下connection-oriented的包格式:

B-frame最大自己数目可以达到65535个字节,前两个字节是length,中间的是channel id(CID),最后是包包括的数据payload。

为了支持RETRANSMISSION/FLOW CONTROL/STREAMING MODES,我们可以将B-frame继续划分为:S-frame和I-frame

Information frames (I-frames)主要用于control information传输,例如后续的信令操作码操作(the Standard Control Field, the Enhanced Control Field, and the Extended Control Field)。I-frames根据应用的不同,其control Field大致可以分为3种如下:其中TxSeq和ReqSeq用来标识流控,R bit用来实现重传机制。(Retransmission mode and Flow Control mode)。F bit用来实现Poll/Final bit 机制。

Supervisory frames (S-frames) 用于回复I-frame(acknowledge I-frames and request retransmission of I-frames)。这里基本意思和I-frame类似,其中的Supervisory function - S bits,主要有以下四个意思:RR(Receiver Ready), REJ (Reject), RNR (Receiver Not Ready) and SREJ (Selective Reject).

为了支持LE CREDIT BASED FLOW CONTROL MODE AND ENHANCED CREDIT BASED FLOW CONTROL MODE,我们可以将B-frame继续划分为:K-frame。


3. L2CAP信令包格式(可以理解为传输上述数据时候必要的控制包)

对BLE来说,信令包传输的CID是0x0005,它提供了L2CAP的一些基本交互信令和参数配置信令。

采用的包为C-frame,这个包的最大长度是由MTUsig定义的,协议中规定了MTUsig的最小值如下:BLE我们一般设置为23.

看起来和G-frame都差不多吧,重点是information部分存在区别。即下面的command format。

目前L2CAP的信令已经扩展到0x1A个信令,我们比较关注的是BLE部分的,即CID是0x0005部分的有以下几个:

命令拒绝:L2CAP_COMMAND_REJECT_RSP

解除连接:L2CAP_DISCONNECTION_RSP 、L2CAP_DISCONNECTION_REQ

连接参数请求:L2CAP_CONNECTION_PARAMETER_UPDATE_REQ、L2CAP_CONNECTION_PARAMETER_UPDATE_RSP

流控配置:L2CAP_LE_CREDIT_BASED_CONNECTION_REQ、L2CAP_LE_CREDIT_BASED_CONNECTION_RSP
L2CAP_FLOW_CONTROL_CREDIT_IND、
L2CAP_CREDIT_BASED_CONNECTION_REQ
L2CAP_CREDIT_BASED_CONNECTION_RSP
L2CAP_CREDIT_BASED_RECONFIGURE_REQ
L2CAP_CREDIT_BASED_RECONFIGURE_RSP

这里需要说明,Identifier这个直接是设备维护的自增的一个值,作为master设备应该维护这个值自增。例如发送者发送REQ包后,作为接受者回馈RSP时候,必须保持包中Identifier一致。Signaling identifier 0x00 is an illegal identifier and shall never be used in any command.

由于信令太多,在此处我们不做介绍,有兴趣的同学可以自己查看spec理解。


4. L2CAP中的几个参数

MAXIMUM TRANSMISSION UNIT (MTU):MTU是指设备自己具备的传输数据的最大字节能力,这是一个不可商量的值,每个设备自己固定。对于BLE设备,这个值不可以小于23字节。

FLUSH TIMEOUT OPTION:FLUSH TIMEOUT值代表着数据丢失后重传的时机,是双方设备可以协商的值,ms作为单位。如果这个值为0xffff,那么这个通道将会是一个可靠通道(区别尽最大努力传输)。

QUALITY OF SERVICE (QOS) OPTION:Qos定义了qos通信需要的必要参数,Service Type等。

RETRANSMISSION AND FLOW CONTROL OPTION:定义了重传和流控需要的一些参数,

FRAME CHECK SEQUENCE (FCS) OPTION:FCS是否开启选项

EXTENDED FLOW SPECIFICATION OPTION、EXTENDED WINDOW SIZE OPTION:是否开启extended传输功能


本章节剩下内容会在下一篇博客中讲。。。。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝牙core_v5.2协议-4 L2CAP上 的相关文章

  • 基于LSTM+Attention和RNN实现抖音虚假信息识别详解--从数据获取到模型搭建训练

    从LSTM到LSTM attention LSTM来源 RNN问题 长期依赖问题和梯度消失问题 所以提出了 LSTM RNN结构图如图所示 LSTM结构 LSTM是RNN的变体 LSTM引入了一组记忆单元 Memory Units 允许网络
  • node.js是干什么的

    一 Node js简介 Node js是一个开源和跨平台的JavaScript运行时环境 它几乎是任何类型项目的流行工具 Node js在浏览器之外运行V8 JavaScript引擎 Google Chrome的内核 这使得Node js的
  • Spark on Hive 和 Hive on Spark的区别

    Spark on Hive Hive只作为存储角色 Spark负责sql解析优化 执行 这里可以理解为Spark 通过Spark SQL 使用Hive 语句操作Hive表 底层运行的还是 Spark RDD 具体步骤如下 通过SparkSQ
  • QT项目中ui_.h文件详解

    在QT工程中的mainwindow h常见的几行 namespace Ui class MainWindow private Ui MainWindow ui 在QT工程中的mainwindow cpp常见的几行 include ui ma
  • javaweb基础

    静态网站 在tomcat的webapps目录下创建一个目录 命名必须不包含中文和空格 这个目录称之为项目目录 在项目目录下创建一个html文件 动态网站 在tomcat的webapps目录下创建一个项目目录 在项目目录下创建如下内容 WEB
  • sudo执行命令 报Permission denied

    使用sudo su切换到root用户 再运行有关命令即可
  • qt中在不同类间传递参数的几种方式

    最近开发一个程序 需要多个源文件 包括若干个头文件和若干个定义文件 因此如何在多个源程序间开发传递变量就成了一个关键问题 刚开始我通过构造函数传递参数 能成功传递但数据却不会自动更新 随后想到通过全局变量传递参数 一般来说在多个源程序间传递
  • 运维Shell脚本牛刀小试(九): 重定向操作符“>“及双重定向“>>“

    运维Shell脚本小试牛刀 一 运维Shell脚本小试牛刀 二 运维Shell脚本小试牛刀 三 cd dirname 0 pwd 命令详解 运维Shell脚本小试牛刀 四 多层嵌套if elif elif else fi 蜗牛杨哥的博客 C
  • 二叉树的中序遍历、两数之和、整数反转

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 目录 1 LeetCode 94 二叉树的中序遍
  • 项目中使用JsonSerializer将JavaBean中Date毫秒级转秒级的简便方法

    此项目是基于SpringBoot实现的 我的JavaBean中有两个Date属性 如下 private Date createTime private Date updateTime 我通过crud 增删改查 操作返回的是毫秒级别的 但我前
  • Qt中多进程写法

    进程 运行中的程序 比如下面这些 没运行的就不算 线程 简单记为程序中的函数 qt中多进程写法 这个比较简单 就没有什么文字说明了 1 widget h ifndef WIDGET H define WIDGET H include
  • Source insight 4工程设置相对地址

    我是阿荣 关注我 在技术路上一起精进 Source insight 使用说明 Source insight 软件版本 V4 00 0084 建议都使用 V4 0 版本的 Source insight 新建相对地址的 Source insig
  • java.lang.IllegalArgumentException: taglib definition not consistent with specification version

    tomcat8 0中使用taglib 错误表现 java lang IllegalArgumentException taglib definition not consistent with specification version 原
  • 4399游戏校招笔试题

    设一组初始记录关键字序列为 49 38 65 97 76 13 27 49 则以第一个关键字49为基准而得到的一趟快速排序结果是 A 38 13 27 49 49 65 97 76 B 13 27 38 49 65 76 97 49 C 2
  • 常用技术指标之一文读懂KDJ指标

    什么是KDJ指标 KDJ中文名又叫随机指标 英文名叫Stochastic oscillator 由乔治 莱恩 George Lane 于20世纪50年代首创 最早用于期货市场 KDJ指标能比较迅速 直观地研判行情 主要用于分析中短期趋势 是
  • 主键约束(PRIMARY KEY) [MySQL][数据库]

    主键约束 PRIMARY KEY 主键约束的特点 主键约束相当于唯一性约束 非空约束 主键约束不允许重复 也不允许出现空值 一个表最多只能有一个主键约束 建立主键约束可以在列级别创建 也可以再表级别创建 主键约束对应着表中的一列或者多列 对
  • JDK8:使用Optional进行变量判空、集合遍历

    防止 NPE 是程序员的基本修养 NPE Null Pointer Exception 一直是我们最头疼的问题 也是最容易忽视的地方 NPE常是导致Java应用程序失败的最常见的原因 在日常研发工作中 经常会处理各种变量 集合 但在使用的过

随机推荐

  • 【vue、uni-app】文本信息的完全显示(回车换行、连续空格、数字&英文换行)

    vue uni app 文本信息的完全显示 回车换行 连续空格 数字 英文换行 数据说明 完整显示 一 vue端 1 不做处理的效果 2 处理后 二 uni app端 1 不做处理的效果 2 处理后 总结 记录学习的轨迹 2021 12 0
  • 线程知识点补充

    全局解释器锁GIL 是什么 GIL本质也是一把互斥锁 将并发变成串行 降低效率以保证数据的安全性 每有一个进程 进程内就必然有一个用来执行代码的线程 也会有一个用来执行垃圾回收的线程 为了避免执行代码的线程和执行垃圾回收的线程对同一份数据进
  • golang 单元测试、性能测试、性能监控技术

    golang 单元测试 性能测试 性能监控技术 go语言提供了强大的测试工具 下面举例简单介绍一下 go test 单元测试 go test bench 性能测试 go tool pprof 性能监控 go test 单元测试 例如对包he
  • 至强服务器性能排行,英特尔至强处理器排名天梯 至强cpu天梯2020排名

    排名 名称 评分 1 Intel Xeon Platinum 8173M 2 00GHz 28 860 2 Intel Xeon Gold 6154 3 00GHz 27 722 3 Intel Xeon Gold 6138 2 00GHz
  • 【研究生】毕业答辩PPT制作和讲述要点(整理)

    引用网址 http blog sciencenet cn blog 53846 232974 html 引言 在QQ群上和研三的点评答辩ppt制作结果 不知不觉 唠叨 了很多 其中 让大家共享一下彼此的ppt文档 取人所长 不想 学生杨涛有
  • React SSR - 写个 Demo 一学就会

    今天写个小 Demo 来从头实现一下 react 的 SSR 帮助理解 SSR 是如何实现的 有什么细节 什么是 SSR SSR 即 Server Side Rendering 服务端渲染 是指将网页内容在服务器端中生成并发送到浏览器的技术
  • BTC-分叉

    分叉 fork 原来由一条链变为了两条链 造成原因 有可能是两个节点差不多同时挖到了一个区块 然后同时发布出去 这时候就会造成临时性的分叉 state fork forking attack deliberate fork 比特币的协议发生
  • 扫码普通二维码跳转微信小程序指定页面(体验服和开发服跳转链接不能动态传参)

    好久不见 时隔多年我又来记录问题来了 记录这次问题的主要原因是减少你我去搜索资源的时间 下面开始讲讲我越到的问题 下面说的是针对小程序体验版或者开发版哈 正式环境不存在这个问题 需求 pc端扫码登录 pc创建一个二维码 用户用微信自带扫码功
  • Python 中 Iterator和Iterable的区别

    Python中 list truple str dict这些都可以被迭代 但他们并不是迭代器 为什么 因为和迭代器相比有一个很大的不同 list truple map dict这些数据的大小是确定的 也就是说有多少事可知的 但迭代器不是 迭
  • STM32CubMX_MQ135检测空气质量

    一 MQ135简介 MQ135是测量空气污染情况常用的一个传感器 具有代表性 价格低 寿命长 敏感度也OK 主要用于测量空气中二氧化碳 氮氧化物 氨气 酒精 苯类等 这几样气体可以说都属于家用空气污染测定中的重要成份 因此用这个传感器刚刚好
  • BOT_SORT复现(Ubuntu20.04)

    论文地址 https arxiv org abs 2206 14651 代码地址 NirAharon BoT SORT BoT SORT Robust Associations Multi Pedestrian Tracking githu
  • tensorflow:使用卷积网络(CNN)实现mnist

    tensorflow1 8 0 python3 6 4 coding utf 8 import tensorflow as tf from tensorflow examples tutorials mnist import input d
  • 【adb 查看手机当前应用的包名,所有应用的包名以及安装位置】

    1 查看是否连接手机 adb devices 2 进入指定的device的shell adb shell 3 查看当前正在运行的APK的包名 adb shell dumpsys window findstr mCurrentFocus 例如
  • BigInteger 与 BigDecimal的区别

    目录 一 BigInteger 二 BigDecimal 一般来说 BigInteger用的不是很多 BigDecimal用的稍微多一点 就比如说JDBC中 如果一个字段的数据库类型是Number 那么 getObject getClass
  • ES6中声明变量的方法(let,const)

    ECMAScript 6 0 以下简称ES6 是JavaScript语言的下一代标准 已经在2015年6月正式发布了 它的目标 是使得JavaScript语言可以用来编写复杂的大型应用程序 成为企业级开发语言 ECMAScript和Java
  • Android版本大于M时动态申请权限的方法

    问题描述 Android应用开发时 若版本大于M 则有些权限需要在运行时用Java代码进行动态获取 解决方案 添加supportv7包 在build gradle app 文件dependencies节点中 添加v7包的依赖 impleme
  • linux java进程_Java+Linux,深入内核源码讲解多线程之进程

    之前写了两篇文章 都是针对Linux这个系统的 为什么 我为什么这么喜欢写这个系统的知识 可能就是为了今天的内容多线程系列 现在多线程不是一个面试重点 啊 那如果你能深入系统内核回答这个知识点 面试官会怎么想 你会不会占据面试的主动权 我不
  • c# mysql 二进制图片_ASP.NET(C#) 实现将图片以二进制保存到数据库中 转

    注意 上传大文件时 会出现错误 原因我现在还不知道 数据库名 mydata 表名 table img 字段 id 自动编号 filename 文本 img OLE 对象 default aspx 无标题页 default aspx cs u
  • 【电路】电容(三)——耦合、退耦电容

    一 耦合电容 什么是耦合 两个或两个以上的电路构成一个网络时 若其中某一电路中电流或电压发生变化 能影响到其他电路也发生类似的变化 这种网络叫做耦合电路 耦合的作用就是把某一电路的能量输送 或转换 到其他的电路中去 1 电源 导线 电阻 电
  • 蓝牙core_v5.2协议-4 L2CAP上

    本章节主要讲述蓝牙host层的协议 针对BLE 主要关注L2CAP GATT ATT SMP GAP这几层 根据spec的章节顺序 我们一次讲解 PART A A LOGICAL LINK CONTROL AND ADAPTATION PR