一文了解低功耗蓝牙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

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

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

相关文章

C语言 | Leetcode C语言题解之第10题正则表达式匹配

题目: 题解: bool isMatch(char* s, char* p) {int m strlen(s);int n strlen(p);// dp[i][j] 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配bool dp[m 1][n 1];memset(dp, false, sizeof(dp));dp[0][0] true; // 空字符串和空模式匹配// 处理 …

00-JAVA基础-javassist字节码操作

字节码操作 什么是字节码 Java字节码(Java bytecode)是Java虚拟机(JVM)执行的一种虚拟指令格式。它是由Java编译器生成的,基于栈的指令集,用于在Java虚拟机上执行。字节码文件包含了JVM能够识别的指令&am…

【JSON2WEB】 12基于Amis-admin的动态导航菜单树

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

Flume 拦截器概念及自定义拦截器的运用

文章目录 Flume 拦截器拦截器的作用拦截器运用1.创建项目2.实现拦截器接口3.编写事件处理逻辑4.拦截器构建5.打包与上传6.编写配置文件7.测试运行 Flume 拦截器 在 Flume 中,拦截器(Interceptors)是一种可以在事件传输过程中拦截、处理和修改…

FreeRtos入门-4 事件组与同步点

事件组 事件组 同步点 创建 xEventGroupCalc xEventGroupCreate();//1&#xff0c;创建事件组 xEventGroupSyc xEventGroupCreate() 设置 xEventGroupSetBits(xEventGroupCalc,(1<<0));//设置事件组bit0 位 xEventGroupSync(xEventGroupSyc,BUSYING,ALL,portMAX…

VB 通过COM接口解析PSD文件

最近有PS测评的需求&#xff0c;故而想到了解析psd文件&#xff0c;目的就是为了获取文档信息和图层信息&#xff1b;获取PS的图像信息有很多方式&#xff0c;有过程性的&#xff0c;比如监听PS的各种操作事件&#xff1b;有结果性的&#xff0c;比如本文写的解析PSD文件。 0.…

使用pip安装geopandas(24.4更新)

geopandas是我们用Python进行地理分析常用的库&#xff0c;在数据处理、分析、制图等场景中有着极为广泛的应用&#xff0c;但是在安装过程中会出现各种问题。​geopandas的安装方式有很多&#xff0c;今天我们选取较为简单的pip来进行geopandas的安装。 ​首先&#xff0c;我…

内部类(InnerClass)

概述 什么是内部类 将一个类A定义在另一个类B里面&#xff0c;里面的那个类A就称为内部类&#xff08;InnerClass&#xff09;&#xff0c;类B则称为外部类&#xff08;OuterClass&#xff09;。 为什么要声明内部类呢 具体来说&#xff0c;当一个事物A的内部&#xff0c;还有…

Java web第一次作业

1.学会用记事本编写jsp文件&#xff0c;并放进tomcat的相关目录下&#xff0c;运行。 源代码&#xff1a; <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head> <title>我的第一个JSP页面</ti…

JavaSE——运算符

1. 概念 运算符是一种用于执行特定操作的符号或关键字。在编程中&#xff0c;运算符用于对变量、常量和表达式进行操作&#xff0c;以产生一个结果。 作为一门计算机语言&#xff0c; Java 也提供了一套丰富的运算符来操纵变量。 Java 中运算符可分为以下&#xff1a;算术运算…

电商系列之促销

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

算法沉淀——动态规划篇(子数组系列问题(下))

算法沉淀——动态规划篇&#xff08;子数组系列问题&#xff08;下&#xff09;&#xff09; 前言一、等差数列划分二、最长湍流子数组三、单词拆分四、环绕字符串中唯一的子字符串 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 …

CSS之第一个CSS样式和CSS选择符

前端这些博客&#xff0c;我觉得都是固定的语法&#xff0c;故而不会以过多的文字进行描述&#xff0c;本系列博文均以实例和代码介绍的方式进行&#xff0c;主要按照代码进行。不会以过多的文字描述。 第一个CSS样式 <!DOCTYPE html> <html lang"en">…

【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

目录 &#x1f4dd;认识文件 &#x1f6a9;树型结构组织 和 目录 &#x1f388;绝对路径和相对路径 &#x1f6a9;文件类型 &#x1f4dd;文件系统操作 &#x1f388;File 概述 &#x1f388;File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…

【C语言】翻译环境与运行环境

一、前言 在我们学习C语言的时候&#xff0c;第一个接触的程序就是&#xff1a;在屏幕上打印” hello word! “&#xff0c;可当时的我们却未去深入的理解与感悟&#xff0c;一个程序代码是如何运行的&#xff1b;而这一期的博客&#xff0c;则是带着我们&#xff0c;通过C代码…

mac电脑安装redis教程

1、下载地址 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/#redis-downloads 2、安装 2.1 解压下载后的压缩文件 2.2 进入…

Vulnhub:WESTWILD: 1.1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap enm4ulinux sumbclient get flag1 ssh登录 提权 横向移动 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 0…

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;递归判断解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖…

linux操作系统的进程状态

这个博客只是为了自己复习用的&#xff01;&#xff01;&#xff01; 冯诺依曼体系结构 计算机是由一个一个硬件组成的 输入设备&#xff1a;键盘&#xff0c;鼠标&#xff0c;扫描仪&#xff0c;写板等等 中央处理器&#xff08;CPU&#xff09;:含有运算器和控制器等 输出单…