当前位置: 首页 > news >正文

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

相关文章:

BLE协议栈入门学习

蓝牙LE栈 物理层 频带 蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作,该频段分为40个信道,每个信道间隔为2MHz。 时分 蓝牙LE是半双工的,可以发送和接收,但不能同时发送和接收,然而,所有的设…...

【反射】简述反射的构造方法,成员变量成员方法

🎊专栏【JavaSE】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🥰欢迎并且感谢大家指出我的问题 文章目录 🎄什么是反射🎄获取class对象的三种方式⭐代码实现 &#x1f3…...

acwing算法基础之数学知识--求卡特兰数

目录 1 基础知识2 模板3 工程化 1 基础知识 题目:给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个? 输出的答案对 1 0 …...

《洛谷深入浅出基础篇》P4017最大食物链————拓扑排序

上链接:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4017 上题干: 题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是…...

设置定时自动请求测试_自动定时循环发送http_post请求---postman工作笔记001

其实就是创建接口文件夹的时候,有个monitor collection 用来监听接口执行情况,这里就可以设置 可以看到多久执行一次对吧,这里可以设置每几分钟执行一次,一共执行多少次等等 但是这里要说明一下,如果需要使用monitor功能,必须需要登录, 所以如果这里点击monitor collection…...

Vue3封装全局插件

定义一个全局加载组件 一、首先定义dom元素 定义一个index.vue文件 <template><div class"loading">loading...</div> </template> <script setup lang"ts"></script> <style scoped> .loading {display: fl…...

【Python 训练营】N_6 求素数

题目 判断101-200之间有多少个素数&#xff0c;并输出所有素数。 分析 判断素数的方法&#xff1a;用一个数分别去除2到sqrt(这个数)&#xff0c;如果能被整除&#xff0c;则表明此数不是素数&#xff0c;反之是素数。 答案 h 0 leap 1 from math import sqrt from sys …...

【图论】关键路径求法c++

代码结构如下图&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用来递归求解拓扑排序&#xff0c;topologicalSort(float**, int*&, int, int, int)传参图的邻接矩阵mat与结点个数n&#xff0c;与一个引用变量数组topo&#xff0c;返回一个布尔值…...

基于51单片机电子钟万年历LCD1602显示

51单片机的电子钟万年历LCD1602显示 &#x1f534; &#x1f535;51单片机的电子钟万年历LCD1602显示&#x1f534; &#x1f535;主要功能&#xff1a;&#x1f534; &#x1f535;讲解视频&#x1f534; &#x1f535;仿真图&#xff1a;&#x1f534; &#x1f535;程序&…...

时间复杂度和运算

时间复杂度 在算法和数据结构中&#xff0c;有许多时间复杂度比 O(1) 更差的情况。以下是一些常见的时间复杂度&#xff0c;按照从最优到最差的顺序排列&#xff1a; O(1)&#xff1a; 常数时间复杂度&#xff0c;操作的运行时间与输入规模无关&#xff0c;是最理想的情况。 O…...

深入Tailwind CSS中的文本样式

深入Tailwind CSS中的文本样式 样式文本是网页设计的一个基本组成部分&#xff0c;而 Tailwind CSS 提供了范围广泛的实用类&#xff0c;使文本样式设计既高效又有效。 在本本中&#xff0c;我们将探索文本样式的常见最佳实践,讨论潜在的陷阱&#xff0c;并推荐设计方法。我们…...

系统优化软件Bitsum Process Lasso Pro v12.4,供大家学习研究参考

1、自动或手动调整进程优先级;将不需要抑制的进程添加到排除列表; 2、设置动态提升前台运行的进程/线程的优先级 3、设置进程黑名单,禁止无用进程(机制为启动即结束,而非拦截其启动)。 4、优化I/O优先级以及电源模式自动化。 5、ProBalance功能。翻译成中文是“进程平衡…...

敏捷DevOps专家王立杰:端到端DevOps持续交付的5P法则 | IDCF

今天有一个流行的英文缩写词用来刻画这个风云变幻的时代&#xff1a;VUCA&#xff08;乌卡时代&#xff09;。四个英文字母分别表示动荡性&#xff08;Volatility&#xff09;、不确定性&#xff08;Uncertainty&#xff09;、复杂性&#xff08;Complexity&#xff09;和模糊性…...

分布式锁详解

文章目录 分布式锁1. [传统锁回顾](https://blog.csdn.net/qq_45525848/article/details/134608044?csdn_share_tail%7B%22type%22:%22blog%22,%22rType%22:%22article%22,%22rId%22:%22134608044%22,%22source%22:%22qq_45525848%22%7D)1.1. 从减库存聊起1.2. 环境准备1.3. 简…...

Python入门学习篇(二)——算术运算符

1 算术运算符 1.1 分类 类型含义示例注意事项加号12➡3“12”“3"➡"123”数值之间,是加法运算(True为1,False为0)字符串之间,是进行拼接数值和字符串之间是不可以使用加法运算的,会报错-减号1-2➡-1*乘号2*3➡6/除法2/1➡2.0除法的结果永远为小数%取余10%2➡0//取…...

微软发布最新.NET 8长期支持版本,云计算、AI应用支持再强化

11 月 15 日开始的为期三天的 .NET Conf 在线活动的开幕日上&#xff0c;.NET 8作为微软的开源跨平台开发平台正式发布。.NET 团队着重强调云、性能、全栈 Blazor、AI 和 .NET MAUI 是.NET 8的主要亮点。.NET团队在 .NET Conf 2023 [1]活动开幕式上表示&#xff1a;“通过这个版…...

达索系统3DEXPERIENCE WORKS 2024 Fabrication新功能

当发现产品的制造环节&#xff0c;以及因产品模型本身的设计而导致制造环节存在不合理性&#xff0c;从而导致加工制造成本增加。 快速判断&#xff0c;轻松协作 在达索系统3DEXPERIENCE WORKS 2024中我们可以快速的判断产品的可制造性&#xff0c;以及快速与前端设计沟通协作…...

Web3与Web3.0: Web3指的是去中心化和基于区块链的网络,Web3.0指的是链接或语义网络。

目录 Web3与Web3.0: Web3指的是去中心化和基于区块链的网络 Web3.0指的是链接或语义网络。...

98、Text2Room: Extracting Textured 3D Meshes from 2D Text-to-Image Models

简介 github 利用预训练的2D文本到图像模型来合成来自不同姿势的一系列图像。为了将这些输出提升为一致的3D场景表示&#xff0c;将单目深度估计与文本条件下的绘画模型结合起来&#xff0c;提出了一个连续的对齐策略&#xff0c;迭代地融合场景帧与现有的几何形状&#xff0…...

MySQL 优化器 Index Condition Pushdown下推(ICP)

ICP 测试 准备数据 CREATE TABLE icp (employee_id int(6) NOT NULL AUTO_INCREMENT,first_name varchar(20) DEFAULT NULL,last_name varchar(25) DEFAULT NULL,email varchar(25) DEFAULT NULL,phone_number varchar(20) DEFAULT NULL,PRIMARY KEY (employee_id) );insert i…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...