一文了解低功耗蓝牙BLE

低功耗蓝牙技术可以构建两种类型的设备:双模设备和单模设备。双模设备既支持经典蓝牙又支持低功耗蓝牙。单模设备只支持低功耗蓝牙。还有仅支持经典蓝牙的设备。

在链路层,设备被分为广播者、扫描者、从设备和主设备。广播者是传输数据包的设备,扫描者是接收广播者的数据包的设备。

在属性协议层存在两类设备,称为客户端和服务器。服务器保存数据,客户端向其发送数据请求以获得该数据。

低功耗蓝牙背后有个基本的概念:任何事物都有状态。状态可以是任何东西:当前的温度、设备里电池的状态、设备名称或是对测量温度的地点的描述。它通过属性服务器上的属性协议对外公开。

低功耗蓝牙的体系结构

低功耗蓝牙体系分为三个基本部分:控制器、主机和应用程序。

控制器通常是一个物理设备,它能够发送和接收无线电信号,并懂得如何将这些信号翻译成携带信息的数据包。蓝牙控制器由同时包含了数字和模拟部分射频器件和负责收发数据包的硬件组成。控制器和外界通过天线相连,与主机通过主机控制接口(HCI)相连。

主机通常是一个软件栈,管理两台或多台设备间如何通信以及如何利用无线电同时提供多种不同的服务。

应用程序则使用软件栈,进而是控制器来实现用户实例。

image-20221226132701394

物理层是采用2.4GHz无线电、完成艰巨的传输和接收工作的部分。低功耗蓝牙采用高斯频移键控(GFSK)的调制方式改变无线电波的频率,传输0或1的信息。

链路层是低功耗蓝牙体系里最复杂的部分。它负责广播、扫描、建立和维护连接,以及确保数据包按照正确的方式组织、正确的计算校验值以及加密序列等。

链路层信道被分为两种:广播信道和数据信道。未连接的设备使用广播信道发送数据。广播信道共有3个。设备利用该信道进行广播,通告自身为可连接或可发现的,并且执行扫描或发起连接。在连接建立后,设备利用数据信道来传输数据。数据信道共有37个,由一个自适应跳频引擎控制以实现鲁棒性。在数据信道中,允许一端向另一端发送数据、确认,并在需要时重传,此外还能为每个数据包进行加密和认证。

在任意信道上发送的数据(包括广播信道和数据信道)均为小数据包。数据包封装了发送者给接收者的少量数据,以及用来保障数据正确定的校验和。无论在广播信道还是数据信道,基本的数据包格式均相同,每个数据包含有最少80比特的地址、报头和校验信息。如下

image-20221226135804992

8比特前导优化数据包的鲁棒性,这一长度足够接收者同步比特计时和设置自动增益控制;32比特接入码在广播信道数据包中是固定值,而在数据信道数据包中是完全随机的私有值;8比特报头字段描述数据包的内容;另一个8比特长度的字段描述载荷的长度,由于不允许发送有效载荷超过37字节的数据包,不是所有的比特都用来记录长度;紧接是变长的有效载荷字段,携带来自应用或主机设备的有用信息;

逻辑链路控制和适配协议(L2CAP)是低功耗蓝牙的复用层。该层定义了两个基本概念;L2CAP信道和L2CAP信令。L2CAP信道是一个双向数据通道,通向对端设备上的某一特定的协议或规范。每个通道都是独立的,可以有自己的流量控制和与其关联的配置信息。经典蓝牙使用了L2CAP的大部分功能,包括动态信道标识符、协议服务多路复用器、增强的重传、流模式等。相比而言,低功耗蓝牙只用到了最少的L2CAP功能。

低功耗蓝牙中只使用固定信道:一个用于信令信道,一个用于安全管理器,还有一个用于属性协议。低功耗蓝牙只有一种帧格式,即B帧,包含两个字节的长度字段和两个字节的信道识别符字段,如下图所示。B帧的格式和传统L2CAP在每个通道使用的基本帧格式一致,在协商使用一些更复杂的帧格式之前,传统L2CAP会一直使用该帧格式。

image-20221226141907103

安全管理器协议定义了一个简单的配对和密钥分发协议。配对是一个获取对方设备信任的过程,通常采取认证的方式实现。配对之后,接着是链路加密和密钥分发过程。在密钥分发过程中从设备把密钥共享给主设备,当这两台设备在未来的某个时候重连时,他们可以使用先前分发的共享密钥进行加密,从而迅速认证彼此的身份。安全管理器还提供了一个安全工具箱,负责生成数据的哈希值、确认值以及配对过程中使用的短期密钥。

属性协议定义了访问对端设备上的数据的一组规则。数据存储在属性服务器的“属性”里,供属性客户端执行读写操作。客户端将请求发送至服务器,后者回复响应消息。客户端使用这些请求在服务器上找到所有的属性并且读写这些属性。属性定义了六种类型的消息:

  1. 从客户端发送至服务器的请求
  2. 从服务器发送至客户端的回复请求的响应
  3. 从客户端发送至服务器的无需响应的命令
  4. 从服务器发送至客户端的无需确认的通知
  5. 从服务器发送至客户端的指示
  6. 从客户端发送至服务器的回复指示的确认

属性是被编址并打上标签的一小块数据。每个属性均包含一个用来标识该属性的唯一的句柄、一个用于标识存储数据的类型以及一个值。例如,一个类型是“温度”、值为20.5℃的属性可能放在句柄为0x01CE的属性里。属性协议没有定义任何属性类型,但规定某些属性可以分组,并且可以通过属性协议发现分组的语义。

通用访问规范定义了设备如何发现、连接,以及为用户提供有用的信息。它还定义了设备之间如何建立长久的关系,称为绑定。要启用此功能,规范定义了设备如何实现可发现、可连接和可绑定。还介绍了设备如何使用规程以发现其他设备、连接到其他设备。读取他们的设备名并和它们进行绑定。

应用层在控制器和主机之上。应用层规约定义了三种类型:特性、服务和规范。这些规约均构建在通用属性规范上。通用属性规范为特性和服务定义了属性分组,应用程序为使用这些属性组定义了规约。

  1. 特性

    特性是采用已知格式、以通用唯一识别码UUID作为标记的一小块数据。由于特性要求能够重复使用,因而设计时没有涉及行为。只要是添加了行为的东西,它的重用性就会大打折扣。特性有个很有意思的地方,它们被定义为计算机的可读格式,而非人类的可读文字。这赋予了计算机相应的能力:当遇到一个素未谋面的特性时,可以下载计算机的相关读取规则,用来向用户显示该特性。

  2. 服务

    服务是人类可读的一组特征及相关的行为规范。一个服务可包含其他服务。父服务只能定义自身包含的服务,它不能改变包含的服务的特性或者行为。服务有两种类型:首要服务和次要服务。

  3. 规范

    规范是用例或者应用的最终体现。规范是描述两个或多个设备的说明,每个设备提供一个或多个服务。规范描述如何发现并连接设备,从而为每台设备确定所需的拓扑结构。规范描述了客户端行为,用于发现服务和服务特性,以及使用该服务实现用例或应用所要求的的功能。

链路层

链路层状态机

链路层状态机定义了5种状态:

  • 就绪态
  • 广播态
  • 扫描态,扫描态有两个子状态:主动扫描和被动扫描
  • 发起态
  • 连接态,连接态有两个子状态:主、从

image-20221227145458856

上电后,链路层进入并保持就绪态,直到接到主机的命令。

处于广播态的链路层可以发送广播报文,也可以发送扫描响应,用以回应主动扫描的设备。可被发现或者可被连接的设备需要处于广播态。想向一定区域内其他设备广播数据的设备也需要处于广播态。广播态的设备停止广播后可进入就绪态。在收到发起者的连接请求之后,广播态的设备也可以进入连接态。

处于扫描态的设备能够接收广播信道的报文。扫描态可用于简单地侦听哪些设备正在广播。扫描态有两个子状态:被动扫描和主动扫描。被动扫描仅接收广播报文。主动扫描则发送扫描请求给广播态设备,并获取附加的扫描响应数据。扫描态的设备只能进入就绪态,转换的条件是停止扫描。

  1. 被动扫描中,设备只能被动地扫描,不能发送任何报文。
  2. 主动扫描中,链路层一旦发现了新的广播态设备,都会发送扫描请求,并等待该请求的响应。扫描请求和响应报文都在广播信道中传输。

为了发起连接,链路层需要处于发起态。处于发起态的发起者,其接收机用于侦听自己试图连接的设备。如果收到了来自该设备的广播报文,链路层会向其发送连接请求并进入连接态,并假设广播者也进入连接态。如果发起者不再试图发起连接,也可以进入就绪态。

从广播态或者发起态均可进入连接态。两种情况均源于发起者向广播者发起连接请求报文。连接态中两个设备相互传送数据信道报文。这也是唯一一个用到数据信道的状态,其他各个状态均使用广播信道。连接态的设备只能通过断开连接转换为就绪态,而不能进入其他状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

报文

报文是链路层的基石。报文非常简单,它是带有标签的数据,由一个设备发送,一个或多个设备接收。标签指明了数据由谁发出,以及应该由哪些设备接收。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

报头

报头的内容取决于该报文是广播报文还是数据报文。

对于广播报文,报头包含了广播报文的类型以及一些标记位,这些标记位指出了报文使用的是公共地址还是随机地址。广播报文类型共有7种,每种类型都具有不同的净荷格式及行为:

  • ADV_IND —— 通用广播指示
  • ADV_DIRECT_IND —— 定向连接指示
  • ADV_NONCONN_IND —— 不可连接指示
  • ADV_SCAN_IND —— 可扫描指示
  • SCAN_REQ —— 主动扫描请求
  • SCAN_RSP —— 主动扫描响应
  • CONNECT_REQ —— 连接请求

image-20221228110852834

image-20221228110901548

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

广播报文和数据报文

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

主机

逻辑链路控制和适配协议(L2CAP)是个复用层,可以让低功耗蓝牙复用三条不同的信道。它也支持数据的分割和重组功能,使得较大的报文可以在底层无线电中传输。

L2CAP信道

L2CAP有个很简单的概念————信道。毕竟L2CAP是一种复用层,有多个信道也不足为怪。信道是指一个数据包序列,连接两个设备上的一对服务。在两个设备间允许同时启用多条信道。

低功耗蓝牙只支持固定信道。

image-20221228112418765

L2CAP数据包结构

每个L2CA

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

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

相关文章

华大单片机新建工程步骤

1.新建文件夹,比如00_LED 2.拷贝 hc32f460_ddl_Rev2.2.0\driver 到 00_LED 3.拷贝 hc32f460_ddl_Rev2.2.0\mcu\common 到 00_LED 4.拷贝 hc32f460_ddl_Rev2.2.0\example\ev_hc32f460_lqfp100_v2\gpio\gpio_output\source 到 00_LED 5.拷贝 hc32f460_ddl_Rev2.2.…

【C++】C++11可变参数模板

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 可变参数模板的定义…

vscode-tasks.json自定义任务

以下所有内容,参考自VScode官方文档: vscode_tasks-docs任务说明文档vscode_variables-reference-docs变量说明文档vscode addtional docs for tasksvscode launch.json 属性设置文档,(下文没有介绍,没有涉及) 浅浅记录一下个人对vscode任务(task)的理解,还谈不上使用. 文章目…

Linux 性能分析工具大全

vmstat--虚拟内存统计 vmstat(VirtualMeomoryStatistics,虚拟内存统计)是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法:vmstat interval times 即每隔 interval 秒采…

德斯兰压缩机邀您体验2024第13届国际生物发酵展

参展企业介绍 德斯兰压缩机(上海)有限公司是一家专注于研发和生产“高效节能”和“无油环保”空气压缩机的的高新技术企业。公司成立于2005年,注册资金326万美金,生产基地坐落于上海市嘉定区,建筑面积高达25,500m2。公…

vscode 连接远程服务器 服务器无法上网 离线配置 .vscode-server

离线配置 vscode 连接远程服务器 .vscode-server 1. .vscode-server下载 使用vscode连接远程服务器时会自动下载配置.vscode-server文件夹,如果远程服务器无法联网,则需要手动下载 1)网址:https://update.code.visualstudio.com…

API接口在数据分析中的应用:淘宝商品信息获取实例

在数字化时代,数据分析已经成为各行各业不可或缺的一部分。无论是市场调研、竞争对手分析,还是产品优化、用户行为研究,数据分析都发挥着至关重要的作用。而API接口作为数据获取的重要渠道,其在数据分析中的应用也日益广泛。本文将…

用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

目录 一.准备工作 二.编写各个组件的页面结构 三.实现初始任务列表的渲染 四.新增任务 五.删除任务 六.展示未完成条数 七.切换状态-筛选数据 八.待办事项(全)代码 一.准备工作 在开发“ToDoList”案例之前,需要先完成一些准备工作&a…

【AOP入门案例深解析】

AOP 1.AOP简介 AOP(Aspect Oriented Programming)面向切面编程,是一种编程范式,指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象编程 作用:在步惊动原始设计的基础上进行…

蓝桥杯-AT24C02

1.概述 2.管脚 A1-A3接地 WP保护接地 代码实现 void EEPROM_Write(unsigned char*EEPROM_String,unsigned char addr,unsigned char num) {I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();while(num--){I2CSendByte(*EEPROM_String);I2CWaitAck()…

高等数学基础篇之关于圆,椭圆,圆环的应用

文章目录 前言 1.圆 1.1标准方程 1.2偏心圆 1.3参数方程 2.椭圆 2.1标准方程 2.2参数方程 2.3极坐标 3.圆环 4.扇形 前言 这篇文章主要是应对二重积分出现的一些关于圆的积分域,让大家大概了解一下,不是很详细,因为二重积分对几何…

软件的测试过程模型_v模型

V模型 作用: 主要描述测试、开发之间的对应关系 V模型优点 每个阶段比较清楚,测试过程由底层(代码)测试到高层(应用)测试过程 V模型缺点 不适用于需求的变更,发现问题的时机比较晚

基于springboot实现在线教育平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线教育平台系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微服务在线教育系统的开发全过程。通过分析微服务在线教育系统管理的不足,创建了一个计算机管理微服务在线…

Golang 基于共享变量的并发锁

一、互斥锁 先看一个并发情况,同时操作一个全局变量,如果没有锁会怎么样 假设有1000个goroutines并发进行银行余额的扣除,每次都扣除10元,起始的总余额是10000,理论上并发执行完应该是0对不对,但实际却不…

C11 lambda、线程库、包装器

目录 一、lambda表达式 1、产生背景 2、使用方法 3、使用lambda解决排序问题 4、组合捕捉 5、捕获外部变量的应用 6、lambda与函数对象 二、线程库 1、thread类 使用方法 2、线程函数参数 3、mutex的种类 std::mutex std::recursive_mutex: std::ti…

Linux中磁盘管理

一.磁盘管理的概括和简要说明 磁盘空间的管理,使用硬盘三步: (1)分区: (2)安装文件系统格式化 (3)挂载: 硬盘的分类: (1&#x…

template—模板初阶(C++)

本篇将会对 Cpp 中的模板进行一个简单的介绍(后序还关系模板进阶,对模板的内容进行更深入的讲解),其中包括模板的使用:函数模板、类模板,以及对于泛型编程的理解。其中的重点为函数模板,介绍了函…

使用Docker部署jar包

vi DockerfileDockerfile内容 FROM java:8 ADD chery5G-admin.jar chery5G-admin.jar ENTRYPOINT ["java","-jar","chery5G-admin.jar"]上传jar包到Dockerfile文件同级目录 使用Dockerfile文件,将jar包制作为镜像 docker build -t…

04矩阵键盘实现计算器操作

需求:矩阵键盘实现计算器操作 main.c 代码如下: #include <STC89C5XRC.H> #include "ApplicationProgram.h" #include "Int_DigitalTube.h" #include "Int_MatrixKeyboard.h"void main() {u8 KeyPress;App_Initialize();while (1) {Ke…

外贸企业版本自适应通用型外贸英文多语言网站

外贸网站模板&#xff1a;自适应通用型大气外贸英文多语言网站主要是以文字内容为主导&#xff0c;将页面的设计杂乱的图片和元素进行最小化或者去除&#xff0c;从而使整个页面更加简洁、清晰&#xff0c;突出信息的呈现。 下面介绍一下外贸网站模板: 自适应通用型大气外贸英…