BLE协议栈入门学习

蓝牙LE栈

在这里插入图片描述

在这里插入图片描述

物理层

频带

蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作,该频段分为40个信道,每个信道间隔为2MHz。

时分

蓝牙LE是半双工的,可以发送和接收,但不能同时发送和接收,然而,所有的设备都是在时分复用(TDD)方案中使用,因此像是全双工

链路层

链路层概述

它定义了空中传输的几种类型的数据包和一个相关的空中接口协议,它使用一个状态机来运行,根据状态的不同,链路层可能以许多完全不同的方式运作,由许多类型的事件驱动。定义了许多影响链路状态或者链路使用参数的控制程序。也定义了无线信道的选择和分类。
链路层既支持有连接和无连接通信,也支持确定性和(稍微)随机的事件时机,它支持点对点通信,也支持一对多通信

状态机

在这里插入图片描述

状态描述
standby设备既不发送也不接收数据包
Initiating响应来自特定设备的广播数据包以请求连接
Advertising发送广播数据包,并可能发送用于响应其他设备的广播数据包的数据包
Connection与另一个设备建立了连接
Scanning监听来自其他设备的广播数据包
Isochronous Broadcast广播同步数据包
Synchronization监听由特定设备发送的属于特定广播序列的周期性广播

在连接状态下,定义了两个重要的设备角色,Central和Peripheral,启动连接,并从Initiating状态转换到Connection状态的设备承担Central角色;接收连接请求,从Advertising状态转换到Connection状态的设备承担Peripheral角色

逻辑传输

LE ACL——LE异步面向连接的逻辑传输

基础知识

当两个蓝牙LE设备连接时,它们使用面向异步连接的逻辑传输(LE-ACL或简称ACL)LE-ACL是最常用的蓝牙LE逻辑传输类型之一,提供面向连接的数据通信。

主机控制器接口

基础知识

主机控制器接口是根据命令和事件定义的。这些本质上是可以在主机和控制器之间交换的消息。命令由主机发送给控制器,事件由控制器发送给主机。事件可以是对命令的响应,也可以是不请自来的消息。

逻辑链路控制与适配协议(L2CAP)

基础知识

L2CAP使用通道的概念来分离在栈层之间传递的数据包序列。固定通道不需要设置,是立即可用的,并与特定的更高层协议相关联。信道也可以通过指定的协议服务多路复用器(PSM)值动态创建并与协议相关联。
在这里插入图片描述

L2CAP和协议复用

在协议栈中位于L2CAP之上的层使用不用的协议,如属性协议(ATT)和安全管理协议(SMP)。
当L2CAP信道处理属性协议时,它要么使用为ATT保留的固定信道,在这种情况下被称为充当未增强的ATT承载者,要么使用一系列一个或者多个动态信道,每个信道都充当增强的ATT承载者。未增强的ATT承载者支持按顺序执行ATT事务,每次执行一个。增强型ATT承载支持并行ATT事务,这些事务在并行L2CAP通道中按顺序执行。

L2CAP和流量控制

基于信用的流程控制是众多可能的流程控制方法之一,它的大体工作原理如下:

  • 发送设备知道接收设备的容量,根据它可以处理的PDU数量而不会丢失数据。它通过配置或在数据传输开始前通过两个设备之间的交换来获取该容量信息
  • 发送设备设置一个计数器,初始值为接收器的容量限制。每次发送一个PDU,计数器就递减。当计数器值到达0时,发送方就暂停发送PDU
  • 接收端从其缓冲区读取并处理一个或多个PDU之后,将相应数量的值发送回发送设备,发送端使用其来增加其计数器,当计数器处于非0值时,发送器可以继续发送更多的PDU

L2CAP定义了几种操作模式,主要与流量控制有关

L2CAP分段和重组

L2CAP以上和以下的层都受到MTU大小的限制,它规定了该层创建的PDU类型允许的最大大小。例如,ATT_MTU参数定义了ATT PDU的最大大小
L2CAP本身和它上面或下面的层在堆栈中可能有不同的MTU大小。因此有必要将一些PDU/SDU分成一系列相邻层可以处理的较小部分,或者相反,将一系列相关的较小的部分重组成完整的PDU/SDU。L2CAP应用于上层的这些过程称为分割(segmentation)和重组(reassembly),而与L2CAP以及下层的等效过程称为分裂(fragmentation)和复合(recombination)

属性协议

基础知识

属性协议(ATT)由两个设备使用,一个是客户端,一个是服务器。服务器公开一系列称为属性的复合数据项。属性由服务器组织在一个称为属性表的索引列表中。
每个属性包含一个句柄,一个通用唯一标识符(UUID),一个值和一组权限

通用属性配置文件(GATT)定义了属性如何表示称为服务,特征和描述符的高级构造。通常,连续句柄值范围内的一组属性需要表示诸如此类的更复杂的类型,因此属性协议支持处理由句柄值范围表示的属性组。

ATT客户端使用ATT来发现ATT服务器中属性表的详细信息,包括感兴趣的属性或属性类型的句柄值。当句柄值已知时,他们可以与某些PDU类型一起使用,以识别表中的特定属性,然后对其进行操作。例如,ATT_READ_BY_GROUP_TYPE_REQ PDU可用于查找属性表定义的所有GATT主服务 。

ATT PDU

属性协议定义了31个不同的PDU,每个PDU都基于六种方法中的一种

命令

客户端到服务器:
命令
请求和响应

服务器到客户端:
通知
指示和确认

PDU格式

所有ATT PDU具有相同的结构,由标识PDU类型的操作码,一组参数和可选的认证签名组成。签名字段很少使用,并且当属性协议在加密链路上运行时是冗余的,因为链路层的所有加密数据包都包含认证数据。

事务

客户端到服务器,一组请求和响应,被视为一个事务;服务器到客户端,一组指示和确认,被视为一个事务;事务的超时时间是30秒。ATT是顺序事务模型,一个事务已经开始之后,在它完成之前,同一个承载实例不能再处理其他ATT PDU。

承载

L2CAP对于ATT有两种承载,未增强ATT承载和增强ATT承载

未增强ATT承载
  • 使用固定的L2CAP通道,因此可能只有一个承载实例
  • 事务是严格顺序的,不管应用层有多少客户端在使用ATT,这意味着一个应用程序发起的事务可能会延迟另一个应用程序希望发起的事务
  • 客户端收到任何犹豫缓冲区溢出等问题而无法处理的通知将被丢弃。
  • ATT MTU可以通过ATT_EXCHANGE_MTU_REQ与ATT_EXCHANGE_MTU_RSP配置
  • 当使用非增强ATT承载时,可选支持某些PDU类型,如ATT_MULTIPLE_HANDLE_VALUE_NTF, ATT_READ_MULTIPLE_VARIABLE_REQ 和 ATT_READ_MULTIPLE_VARIABLE_RSP。
  • 支持非增强ATT承载的L2CAP信道可以是未加密的,也可以是加密的。
增强ATT承载
  • 使用动态L2CAP通道,支持多通道,因此允许多个承载实例
  • 事务还是按顺序处理的,但是是基于每个承载实例的,因此从应用层来看,并行事务是可能的
  • ATT MTU设置为L2CAP层自动使用的MTU值,并且ATT_EXCHANGE_MTU_REQ与ATT_EXCHANGE_MTU_RSP是不允许通过增强ATT承载的
  • 增强ATT承载包含L2CAP的流量控制方法——增强型基于信用的流量控制模式,因此不会丢失任何PDU
  • 使用增强ATT承载时,必须支持某些PDU,如ATT_MULTIPLE_HANDLE_VALUE_NTF, ATT_READ_MULTIPLE_VARIABLE_REQ 和 ATT_READ_MULTIPLE_VARIABLE_RSP。
  • 支持非增强ATT承载的L2CAP信道必须是加密的。

发现EATT支持

GATT允许客户端确定连接的服务器是否支持EATT,也允许客户端通知服务器它是否支持EATT

通用属性概要(GATT)

基础知识

GATT基于属性表中的属性定义了更高级的数据类型,这些数据类型被称为服务,特征和描述符。它还定义了一系列通过ATT使用这些数据类型的过程,应用程序通常使用映射到这些过程的平台API

服务是一种分组机制,它提供了一个上下文,在这个上下文中可以使用它们包含的特征。服务通常对应于设备的主要特性或者能力

特征是状态数据的单个项目,具有类型,关联值和一组属性,这些属性表明数据如果在相关的GATT程序集中使用。例如,可以定义一个连接的对等设备可以读取某个特定特征的值,但不能写入它

特征属于一个服务,相同的特征类型可以是多个服务的成员,并且根据这些服务提供的不同上下文,使用特征的规则可能会有所不同

描述符属于某些特征,可以包含元数据,如特征的文本描述,或者可能提供控制特征行为的一些方法。特征有0或多个附加的描述符。

在这里插入图片描述
所有GATT服务器都必须提供两项特殊服务,通用访问服务和通用属性服务

蓝 牙 SIG vs自 定 义

一些服务,特征和描述符是SIG定义的,并具有表示其类型的16位UUID
自定义服务,特征和描述符可以由实现者分配128位UUID标志。16位UUID具有等价的128位值,格式为0000XXXX-0000-1000-8000-00805F9B34FB, 其中XXXX是 16位 UUID值 。 实 现 者 不 能 在 这 个 范 围 内 使 用 UUID, 除 非 从 蓝 牙 SIG购 买了UUID。

通用访问配置文件(GAP)

基础知识

蓝牙核心规范的通用访问配置文件(GAP)部分定义了与设备发现和在两个设备之间建立连接有关的过程。如何执行数据的无连接通信,如何使用周期性广播以及如何设置同步通信也是GAP包含的主题

广播包的传输和通过扫描的接收是GAP工作的核心,有许多不同的广告和扫描包类型,这些是由链路层定义的。载荷字段称为AdvData,并不是在所有PDU类型中都存在该字段。当它存在时,它所包含的数据被编码为一系列一个或多个长度/标签/值结构,称为AD类型。AD类型在核心规范补充(CSS)文档中定义

GAP与BLE和BR/EDR都有相关性。另外,虽然广告和扫描等活动与GAP具有核心相关性,但这些过程实际上是由链路层执行的,所涉及的PDU类型也是如此。

角色

GAP定义了4个设备角色:

角色描述
Broadcaster一种使用某种形式的广播以无连接的方式传输数据的设备,广播设备有一个发射机,但接收机是可选的,单纯的广播设备不接受来自中央设备的连接
Observer观察设备接收广播数据包,它不连接到其他设备,包含一个接收机,发射机是可选的,它能以无连接的方式接收广播数据包
Peripheral外设可以与中心设备连接,它包含发射机和接收机
Central中央设备能主动与外围设备建立连接,它包含一个发射机和接收机

注意,链路层也会使用角色名称Central和Peripheral,这两种不同语境中的术语含义有些差别

发现

Broadcaster或者Peripheral要么处于不可发现模式,要么处于GAP定义的两种可发现模式之一。当以不可发现模式广播时,广播的数据包在空中是可见的,但是执行一般可发现过程或者有限可发现过程的扫描设备将忽略这些数据包。

可发现模式包括一般可发现模式与有限可发现模式。在一般可发现模式下,设备的可发现时间是无限的,而在有限可发现模式下,最多只能发现3分钟

发现设备能通过检查广播包中的AdvData字段中称为Flags的AD类型,来识别广播设备所处的可发现模式。有限发现模式通常用于优先考虑用户最近接触过的设备。

当一个Observer或者Central试图发现其他设备时,它可能会使用被动扫描或者主动扫描。被动扫描是指接收广播PDU而不发送任何扫描PDU。主动扫描包括接收广播PDU,并通过发送扫描PDU请求更多信息。各种PDU类型由链路层定义

连接模式

广播设备可以通过所使用的PDU(遗留广播)或者AdvMode字段的值(扩展广播)来指示自己是否可以被连接

定向与非定向

定向的广播PDU只有特定设备应该处理此PDU,PDU中有TargetA字段,包含预期接收设备的蓝牙地址。
非定向的广播PDU适用于接收它们的任何Observer或者Central,不包含TargetA字段

可扫描与不可扫描

某些广播PDU类型被称为可扫描的,这意味着允许接收到这样的PDU的设备以适当类型的扫描请求PDU响应,以请求更多的广播数据。广播PDU由链路层定义

安全管理器协议(SMP)

基础知识

安全管理器协议(SMP)是协议栈安全管理器组件的一部分。它支持执行与安全相关的程序,如配对、绑定和密钥分发。
安全管理器组件为其他层可以使用的安全功能提供了一个加密工具箱,并定义了配对算法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android studio 迁移之后打开没反应

把Android studio由d盘迁移到c盘,点击没反应; 需要把C:\Users\xxxx\AppData\Roaming\Google\AndroidStudio2022.3 目录下的studio64.exe.vmoptions 修改为C:,删除该文件会导致无法安装app。 里面配置了一个

RK3568开发板在工控工业物联网网关方面的应用

在数字化转型的浪潮中,工控物联网关产品扮演着重要的角色。这些产品通过连接工业设备和网络,为数据传输和分析提供了便利。而迅为RK3568核心板作为一款高性能的芯片,为工控物联网关产品的性能提升和功能扩展提供了强大的支持。 迅为RK3568核心…

5-7求三种数的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1结果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2结果是&#xff1a;%15.6f\n"…

网站被攻击了怎么办,有什么办法防御攻击?

近年来&#xff0c;随着互联网发展&#xff0c;出现了各种各样的网站&#xff0c;web应用&#xff0c;网络极大方便了人们的生活&#xff0c;改变了人们生活方式。而随着网络的发展普及&#xff0c;网络安全问题也困扰着用户。 许多人都曾有过这样经历&#xff0c;网站上线后&…

在 Redis 中使用 JSON 文档:命令行界面(CLI)和 Navicat 集成

Redis&#xff0c;因其极高的性能而闻名&#xff0c;是一款多功能的 NoSQL 数据库&#xff0c;擅长处理键值对。虽然 Redis主要用于处理简单数据结构&#xff0c;但是同样支持更多复杂的数据类型&#xff0c;如列表、集合甚至是 JSON 文件。在本文&#xff0c;我们将深入到 Red…

机器学习入门(第三天)——K近邻(物以类聚)

K-nearest neighbor 知识树 怎么区分红豆绿豆&#xff1f; How to distinguish red beans and green beans? 之前我们构造了一个超平面来解决这个问题&#xff0c;既然超平面可以切分&#xff0c;是不是红豆之间和绿豆之间有着某种关联。即&#xff1a;物以类聚。 如果一个…

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS 1. 搭建仿真线上业务环境2. 安装KeyarchOS操作系统和X2Keyarch迁移工具3. 将CentOS系统业务迁移至KeyarchOS系统 浪潮信息云峦操作系统KeyarchOS基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服…

Seaborn画图颜色和给定的RGB hex code不一致

使用以下代码画图&#xff1a; import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi150) x [A,B,C,D] y [164, 86, 126, 53] sns.barplot(xx, yy, color#3a923a) 得到的颜色如下图所示&#xff1a; 这是因为seaborn默认降低了颜色的饱和度&#xff0c;即…

日本it就职培训机构,日本IT行业的三种类型

日本的IT产业一直保持增长趋势&#xff0c;市场规模逐年增加&#xff0c;在日本所有产业中占据很大比例。由于日本老龄化严重&#xff0c;日本国内的IT人才无法满足需求&#xff0c;为缓解这一问题&#xff0c;日本将引进外国优秀IT人才作为一项国策&#xff0c;日本IT行业不仅…

vector的简单模拟实现_C++

目录 一、vector的数据结构 二、vector的构造 三、vector的增删查改及空间管理 四、全部代码 一、vector的数据结构 vector以线性连续空间为基础来定义数据结构以及扩展功能。vector的两个迭代器&#xff0c;分别是start和finish&#xff0c;分别指向配置得来的已被使用的空…

『亚马逊云科技产品测评』活动征文|AWS 数据库产品类别及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、AWS 数据库产品类别 01、Amazon Aurora 02、Amazon Docum…

思维模型 重叠效应

本系列文章 主要是 分享 思维模型 &#xff0c;涉及各个领域&#xff0c;重在提升认知。相似内容易被混淆或遗忘。 1 重叠效应的应用 1.1 重叠效应在教育中的应用 1 通过避免重叠效应提升学习效率 为了避免重叠效应&#xff0c;通过对比、归纳等方法来帮助学生更好地理解和掌…

shell 脚本循环语句

目录 循环 echo 命令 for 循环次数 for 第二种格式 命令举例 while 脚本举例 双重循环及跳出循环 脚本举例 更改文件和目录的后缀名的脚本 画三角形的脚本 乘法口诀表的脚本 面试例题 补充命令 let 命令 循环 —— 一定要有跳出循环的条件 已知循环的次数 未知…

5-1 Java 网络编程

第1关&#xff1a;URL类与InetAddress类 任务描述 本关任务&#xff1a;了解网络编程基础知识。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.URL&#xff1b;2.InetAddress。 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩…

闪存组织结构概念

文章目录 一、几种不同类型闪存的参数&#xff1a;二、组织结构三、块&#xff08;Block&#xff09;的结构擦除动作原理&#xff1a;写操作读操作 一、几种不同类型闪存的参数&#xff1a; 参数项SLCMLCTLCQLC读取时间/us20~2555~11075~170120~200写入时间/us50~100400~15008…

服务器中了elbie勒索病毒解决办法,elbie勒索病毒解密数据恢复

科技技术的不断发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但网络安全威胁也不断增加&#xff0c;近期云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的服务器中了elbie勒索病毒&#xff0c;导致系统瘫痪&#xff0c;所有业务无法正常开展&#xff…

【深度学习】脸部修复,CodeFormer,论文,实战

代码&#xff1a; https://github.com/sczhou/CodeFormer 论文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工作**4 实验****4.1 数据集****4.2 实验设置和指标***…

Springboot-热部署-IDEA2023

方式一&#xff1a;jrebel 方式二&#xff1a; 1、导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <…

opencv-Canny 边缘检测

Canny边缘检测是一种经典的图像边缘检测算法&#xff0c;它在图像中找到强度梯度的变化&#xff0c;从而识别出图像中的边缘。Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中&#xff0c;cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下&#xff1a; edges…

Cent OS 8.2 安装 自定义硬盘 固定IP VMware

时间&#xff1a;20231122 环境&#xff1a;win11 、VMware 16 pro、Cent OS 8.2 说明&#xff1a;自定义安装方法、自定义硬盘分区、固定IP且能联网 1、使用自定义的方式安装虚拟机 此处选择典型&#xff0c;则会自动安装系统&#xff0c;无法自定义硬件以及配置信息 选择…