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

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

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

相关文章

产品经理必须知道的电商API接口对接流程注意事项

接口对接流程梳理 产品经理 知晓自己负责系统做什么,外接三方系统做什么。 系统对接产品经理实操步骤: ①与公司业务人员沟通,与系统对接方产品/技术描述业务场景,沟通发放接口文档材料 ②拿到材料之后电商API接口过多请对方…

【测试功能篇 01】Jmeter 压测接口最大并发量、吞吐量、TPS

压力测试,我们针对比较关键的接口,可以进行相应的压力测试,主要还是测试看看接口能抗住多少的请求数,TPS稳定在多少,也就是吞吐量多少 安装 Jmeter的安装很简单,官网下载地址 http://jmeter.apache.org/ &…

day30_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 画图, 请求处理的完整流程(javaweb开发流程) 零、注解改造 WebServlet注解,相当于是在web.xml中配置的servlet映射 Servlet类 package com.qf.servlet;import javax.servlet.ServletException; im…

HTML5学习系列之项目实战1

HTML5学习系列之项目实战1 前言代码记录问题总结 前言 学习记录 代码 <div id"player"><audio id"musicbox"></audio><div id"controls" class"clearfix controls"><div id"play" class"…

关于代码混淆,看这篇就够了

​ 代码混淆一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢&#xff1f;混淆&#xff08;obfuscate&#xff09;技术。注意&#xff1a;用obfuscate防盗版是根本不可能&#xff0c…

代码随想录算法训练营第五十八天丨 单调栈01

739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边…

MySQL 的执行原理(二)

5.3. MySQL 的查询成本 5.3. MySQL 的查询成本 MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者 说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模 糊的&#xff0c;其实在 MySQL 中一条查询语句的执行成本…

Cmake学习

cmake大致 cmake_minimum_required(VERSION 3.0)project(test) #通过set自定义变量&#xff0c;通过${}取出 #set(SRC add.cpp main.cpp muti.cpp sub.cpp) #cmake搜索文件 宏定义PROJECT_SOURCE_DIR aux_source_directory(${PROJECT_SOURCE_DIR} SRC) #file(GLOB/GLOB_RECURSE…

静态文件鉴权

​ 静态文件鉴权的解决方案 背景介绍 XX业务系统作为BXX业务系统的孪生姐妹系统&#xff0c;是对BXX受理业务的强力补充系统&#xff0c;他允许操作员拿着IPAD&#xff0c;和客户约定地点上门受理业务。 因一些业务的受理&#xff0c;按照最新的业务规章制度&#xff0c;需…

常用 API 异常

常用 API & 异常 对之前那篇 API 文章的补充学习 1.API 1.1 API概述【理解】 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&am…

OpenCV快速入门:窗口交互

文章目录 前言一、鼠标操作1.1 鼠标操作简介1.2 鼠标事件类型&#xff08;event类型&#xff09;1.3 鼠标事件标志&#xff08;flags&#xff09;1.4 代码示例1.4.1 获取鼠标坐标位置1.4.2 监听鼠标滚轮事件1.4.3 在图像中显示鼠标坐标 二、键盘操作2.1 代码示例2.2 waitKey的等…

ssm家长乐山美食网站系统

1.需求分析\n将进行家乡乐山美食网站的需求分析。需求分析是系统开发过程中的一项重要工作&#xff0c;它是对用户需求进行深入研究和分析&#xff0c;明确系统的功能、性能、界面等方面的需求&#xff0c;为后续的设计和开发提供依据。\n首先&#xff0c;需要明确该网站的主要…

制作Go程序的Docker容器(以及容器和主机的网络问题)

今天突然遇到需要将 Go 程序制作成 Docker 的需求&#xff0c;所以进行了一些研究。方法很简单&#xff0c;但是官方文档和教程有些需要注意的地方&#xff0c;所以写本文进行记录。 源程序 首先介绍一下示例程序&#xff0c;示例程序是一个 HTTP 服务器&#xff0c;会显示si…

【GUI】-- 11 贪吃蛇小游戏之绘制静态的小蛇

GUI编程 04 贪吃蛇小游戏 4.2 第二步&#xff1a;绘制静态的小蛇 现在绘制静态的小蛇(即小蛇初始位置)&#xff0c;并且完善游戏默认初始状态。这一步还在GamePanel类中实现。 首先&#xff0c;定义了小蛇的数据结构&#xff0c; //定义蛇的数据结构int length; //小蛇总长…

yolo系列模型训练数据集全流程制作方法(附数据增强代码)

yolo系列的模型在目标检测领域里面受众非常广&#xff0c;也十分流行&#xff0c;但是在使用yolo进行目标检测训练的时候&#xff0c;往往要将VOC格式的数据集转化为yolo专属的数据集&#xff0c;而yolo的训练数据集制作方法呢&#xff0c;最常见的也是有两种&#xff0c;下面我…

开源与闭源:大模型发展的双重走向

目录 前言开源和闭源的优劣势比较开源的优势闭源的优势 开源和闭源对大模型技术发展的影响对技术发展的影响对数据共享的影响对业务拓展的影响 开源与闭源的商业模式比较开源的商业模式闭源的商业模式 处在大模型洪流中&#xff0c;向何处去&#xff1f;结语 前言 随着人工智能…

中国智能音箱市场销量下降,百度稳居第一 /中国即评出10个大模型创新案例 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; 中国智能音箱市场销量下降&#xff0c;百度稳居第一 中国即将评选出10个最具代表性的大模型创新案例…

【Typroa使用】Typroa+PicGo-Core(command line)+gitee免费图片上传配置

TyproaPicGo-Core(command line)gitee免费图片上传配置 本文是在win10系统下配置typroapicGo-Core(command line)gitee图片上传的教程。需要的环境和工具有&#xff1a; gitee账号&#xff0c;新建仓库及token令牌&#xff1b;已经安装了的typroa&#xff0c;需要0.9.98版本以上…

2023最全的性能测试种类介绍,这6个种类特别重要!

系统的性能是一个很大的概念&#xff0c;覆盖面非常广泛&#xff0c;包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等&#xff0c;性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称&#xff0c;它其实包…