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

蓝牙BLE学习-GAP

1.概述

       GAP层(Generic access profile-通用访问配置文件)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式的一种,而且也是最简单的一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接。GAP保证了不同的BLE设备可以互相发现对方并建立连接

       GAP定义了蓝牙设备如何发现和建立与其他设备的安全或不安全连接。它处理一些一般模式的业务,比如询问、命名和搜索,还处理一些安全问题,比如担保。同时还处理一些有关连接的业务,比如链路建立、信道和连接建立。GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其他蓝牙应用规范的基础。GAP是所有其他配置文件的基础,它定义了在蓝牙设备之间建立基带链路的通用方法,除此之外,GAP还定义了下列内容:

  1. 必须在所有蓝牙设备中实施的功能
  2. 发现和链接设备的通用步骤
  3. 基本用户界面术语

       GAP是应用层能够直接访问BLE协议栈的最底层,它包括管理广播和连接事件的有关参数。GAP模块代表了所有蓝牙设备的共用基础功能,如传输,协议或者应用规范所使用的模式和访问过程。GAP的服务包括设备发现,连接方式,安全,认证,关联模型和服务发现等。

       总之一句话,GAP是保证BLE设备能互相发现和连接的规范。GAP就好比一种语言,大家都说同一种语言才能相互听懂,相互知道说的是什么。否则就只能大眼瞪小眼。

       BLE协议栈的GAP层负责处理设备的接入方式和过程,包括设备发现,链路建立,链路终止,启动安全功能,设备配置。

       GAP还定义了以下四种角色类型:

       广播者(Broadcaster):用于只通过广播发送数据的应用。广播发送者,是不可连接的设备。广播者角色只是广播信息而不接受信息(ibeacon类似应用)。

       观察者(Observer):用于接收广播数据的应用。扫描广播,不能够启动连接。观察者只监听空气中的事件(抓包器)。 

      外围设备(Peripheral):用于通过广播发送数据并且可以建立链路的应用。广播发送者,是可连接的设备,在单一链路层连接时作为从机。

      中央设备(Central):用于接收广播数据并且建立一条或多条链路的应用。扫描广播启动连接,在单一或多链路层连接时作为主机,支持三个同时连接。 

2. GAP结构

2.1 GAP的位置

       GAP层作为蓝牙协议层的组成模块,如下图所示,虚线框内的部分为蓝牙协议层。Application在蓝牙协议层之上,baseband/RF位于蓝牙协议层之下。GAP层给application提供访问Upper stack的接口

 

2.2 GAP的功能

      GAP提供如下功能

广播(Advertising):设置和获取广播参数,启动和停止

扫描(Scan):设置和获取扫描参数,启动和停止

连接(Connection):设置连接参数,创建连接,终止连接,更新连接参数

配对:设置配对参数,启动配对。使用passkey entry方式时输入/显示passkey,删除绑定设备密钥

密钥管理:根据设备地址和地址类型查找密钥,保存/加载绑定设备信息的密钥,解析random address

      其他:

设置GAP公共参数,例如外貌和名字。

获取支持的最大BLE链路数目

修改白名单(white list)

生成/设置本地设备random address

配置本地设备identiy address

    广播

中央设备能够与外围设备建立连接,外围设备必须处于广播状态,它每经过一个时间间隔发送一次广播数据包,这个时间间隔被称为广播间隔。他的范围是20ms到10.24s。广播间隔影响建立连接的时间。

中央设备在发送一个连接请求来发起连接之前,必须接收到一个广播数据包。外围设备发送一个广播数据包之后一小段时间内只监听连接请求。

一个广播数据包最多能携带31字节的数据,它通常包含用户可读的名字、关于设备发送数据包的有关信息、用于表示此设备是否可被发现的标志等类似的标志。

当中央设备接收到广播数据包后,它可以发送请求更多数据包的请求,称为扫描回应。如果它被设置成主动扫描。外围设备将会发送一个扫描响应作为对集中器请求的回应。扫描回应最多可以携带31字节的数据。

扫描

扫描是中央设备监听广播数据包和发送扫描请求的过程。它有2个定时参数需要特别注意:扫描窗口和扫描间隔。

对于每一个扫描间隔,中央设备扫描的时间等于一个扫描窗口,这就意味着如果扫描窗口等于扫描间隔,那么集中器将处于连接扫描之中。扫描窗口和扫描间隔之比称为扫描占空比。

连接

中央设备和外围设备第一次交换数据定义为连接状态。在一个连接状态中,中央设备将会在一个特定定义的间隔从外围设备请求数据,这个间隔称为连接间隔,它由中央设备决定并应用于连接,但是外围设备可以发送连接参数更新请求给中央设备。根据蓝牙核心规范,连接间隔必须在7.5ms到4S之间。

如果外围设备在一个时间帧内没有回应集中器的数据包,被称为连接监管超时,连接则被认为丢失。

可以通过在每一个连接间隔中传输多个数据包以获得更高的数据吞吐量(IOS一次连接间隔最多可以交互4次,安卓为6次)。在蓝牙5.0里,每个传输数据包最多可以写到247个字节的应用数据。但是如果电流消耗是重点,同时外围设备也没有数据要发送,则可以忽略一定数量的连接间隔,这个忽略连接间隔的数目称为从机延迟(从机潜伏)。

 在一个连接中,除了广播信道,设备间在频带的所有信道中进行通信。

2.3 GAP层设备状态

GAP层设备状态由advertising、scan、connection组成。每个状态都有相应的子状态,

advertising

advertising有四个子状态,分别为idle、start、advertising和stop。

  1. idle:默认状态,不发送广播
  2. start:在idle启动广播后,启动广播的流程尚未完成。start为临时状态,若成功启动广播,则进入广播状态。若启动失败,则回到idle状态
  3. advertising:成功启动广播后,设备发送广播。若广播类型为快速广播,一旦超时,则进入idle状态。
  4. stop:在停止广播之后,停止广播的流程尚未完成。stop为临时状态,若成功停止广播,则进入idle状态。若停止失败,则回到advertising状态。 

 

scan

scan状态有四个子状态,idle、start、scanning和stop。

  1. idle:不进行scan
  2. start:在idle状态启动scan之后,启动scan的流程尚未完成。start状态为临时状态,若成功启动scan,则进入scanning状态。若启动scan失败,则返回idle状态。
  3. scanning:成功启动scan。在此状态下,设备进行scan,接收advertisement。使用延时扫描时,若持续时间参数非零,则scan时间超时后,进入idle状态。
  4. stop:在scanning停止之后,停止scan的流程尚未完成。stop状态为临时状态,若成功停止scan,则进入idle状态。若停止scan失败,则返回scanning状态

 3. GAP配置

3.1 GAP安全模式

GAP在启动连接时会负责BLE连接的安全功能。只有对通过身份验证的连接而言的某些数据是可读或可写的。一旦形成一个连接,两个设备可以通过一个过程进行连接,称为配对。进行配对时,密钥建立加密或认证的链接。例如当两个设备要建立配对关系时,外围设备需要中央设备提供密钥以完成配对。这个密钥可以是固定值或随机值。中央设备发送正确的密钥后,两台设备交换安全密钥并验证链接。

在许多情况下,两个设备会经常建立连接和断开连接。BLE具有一个安全功能,允许两个设备在配对的时候给对方一个长久的安全密钥。此功能被称为绑定。绑定后的两个设备每次重连时能够迅速重新确立加密和认证,并且不需要经过充分的配对过程,只需要提供他们存储的长期密钥信息即可。

加密方式大概分为一下几种

不允许连接

无安全要求(可直接连接)

加密连接

MITM(man in the middle-中间人攻击)保护

LESC(LE secure connections-)加密

签名

3.2 蓝牙设备名称与外观

设备名称 

当我们需要查找蓝牙设备的时候,大部分情况都是通过设备名称来查找的。协议栈也是支持用户自行修改设备名称的。在设置的时候可以设置short_name和full_name。

short_name:可以成为可选名称,字面意思上可以理解为名称的简写。当一个名称比较长的时候,由于广播的信息容量是有限的。要留空间放置其他信息,没有那么多空间显示全名,因此APP显示的时候为简称。

 

full_name:如果名称不是很长,广播数据可以容纳。那么可以通过GAP设置全名显示。

 

设备外观

当我们在搜寻蓝牙的时候,不但可以找到蓝牙设备的名称,还可以查看到蓝牙设备的外观。外观是什么,就决定了我们找的设备是什么。例如未知键盘鼠标温度计手表等等

 

 

4. GAP连接

在一个典型的蓝牙系统中,外围设备发送具体的广播数据让所有中央设备知道它是一个可连接的设备。广播内容包含设备地址,还包含了一些额外的数据,比如设备名称。中央设备接收到广播之后发送一个搜索请求给外围设备,外围设备答复一个搜索应答,这就是设备发现的过程。

设备发现之后,中央设备就知道外围设备是一个可连接的设备。中央设备可以发送一个建立链接的请求给外围设备,开始进行主机和从机设备的互联。

 在一个连接中,包含了如下参数:

 连接间隔:

 在一个BLE连接中,使用跳频机制,这样两个设备之间可以在一个特定的通道上进行数据收发。在一个特定的时间之后,会跳到一个新的通道上,LL层负责通道切换。这个发现设备并收到数据的事件,就被称为连接事件。

 尽管没有应用程序数据需要收发,两个设备之间仍然需要交换链路层数据来保持连接。连接间隔是两个连接事件之间的时间,使用一个单元是1.25ms的步进。连接间隔从最小值6(7.5ms)到最大值3200(4.0S)。

 不同的应用需要不同的连接间隔,一个长时间的连接间隔将会节约更多的能量,因为设备可以在两个连接事件之间睡眠更长的时间。但是他会导致数据发送不及时。如果有数据要发送,那么只能等下一个连接事件到来时才能被发送。

 值得注意的是,连接间隔参数是中央设备进行设置,外围设备只是负责执行。

 从机潜伏周期:

 这个参数描述了从机跳过连接事件的次数。这使外围设备具有一定的灵活性,如果它不具有任何数据传送,它可以选择跳过连接事件,并保持睡眠,从而提供了一些积蓄力量。这一决定取决于外围设备。也可以成为从机延迟,从设备能够忽略主设备的链接事件的最大值。比如:从设备延迟为6的话,那么从设备每隔6个锚点可以监听到主设备发送过来的数据包。如果从设备延迟为0,从设备在每个锚点都可以监听主设备的数据包。

 监督超时:

 这是两个成功的连接事件之间间隔的最大值。如果超过这个时间还未出现成功的连接事件,那么设备将会考虑失去连接,返回一个未连接状态。这个参数值使用10ms的步进。监督超时时间从最小10(100ms)到最大3200(32.0s)。监督超时时间必须大于有效连接事件。

有效连接事件时间 = 连接间隔 * (1 + 从机延迟值)。

连接间隔、潜伏周期的不同组合,有好有坏,而如何组合,需要根据实际的应用场景而定。例如短连接间隔,功耗高,数据吞吐量高,发送等待时间短。长链接间隔,功耗低,数据吞吐量低,发送等待时间长。低潜伏值,从机在没有数据发送的情况下功耗高,但从机可以快速的收到主机的数据。高潜伏值,从机在没有数据发送的情况下可以低功耗。但从机无法及时收到主机的数据,但主机能及时收到从机的数据。

在某些情况下,中央设备请求与外围设备建立链接包含的连接参数对外围设备而言是不利的。此时,外围设备可以在连接过程中改变连接参数。这个取决于外围设备的应用程序。外围设备可以通过设置连接参数更新请求,请求中央设备改变连接参数。这个请求包含四个参数:最小链接间隔、最大链接间隔、从机潜伏周期、连接超时时间。这些值代表了外围设备针对连接的期望参数,连接间隔是以范围的形式提供的。当中央设备接收到这个请求后,中央设备有权利决定是接受还是拒绝这些参数。

4.1 连接间隔

每个尖刺就是一次连接事件(Connection events),两个连接事件的中间为sleeping休眠时间。从图中也可以看出,在每次从机的连接事件中,首先是射频接收,然后才是射频发送。其实也是为了保证主机和从机的射频时序是相匹配的。设备在建立链接之后的大多数事件都是处于sleeping。这种情况下耗电量比较低,只有在连接事件(connection events)中,耗电量才相对较高,但持续时间很短。这也是为什么BLE非常省电的原因之一。

在两个connection interval连接间隔之间,BLE会使用跳频机制。两个设备使用特定的信道发送和接收数据,然后过一段时间后,再使用新的信道(BLE协议栈的LL链路层处理信道的切换)。两个设备在切换信道后发送和接收数据被称为一个连接事件。尽管没有应用数据被发送或接收,两个设备仍旧会交换链路层数据(空包 Empty PDU)来维持连接。在每个连接事件中,都是由主机发送,从机回复。

当大数据传递时,通讯数据包是连续传递的。主机会选择最小连接间隔来进行通讯。无数据传递时,主机会选择最大链接间隔来定期询问从机状态,以保持连接不中断。当从机向主机发送一个连接参数更新请求后,主机会按照请求,修改连接间隔。但这个时间需要在主机设置的最大和最小连接间隔之内。

4.2 从机潜伏周期

 从机设备没有数据要发时,跳过一定数目的连接事件Connection Event。范围0-499。设置为0则每次连接间隔都连接。数字越小,通讯速度越快,但功耗越高。注:如果在距离远或干扰大的情况下,当无数据通信时,这个值设置大,可以减少掉线的概率。比如防丢器:如果这个参数设置为0,表示规定时间内必须响应从机,不然就以为是蓝牙断开了。如果设置为3,假设信号不好时,中间丢了3个包,只接受到了1个就表示连接正常。因为他会跳过其中3个,保证了不掉线的概率。

从机设备没有数据要发时,跳过一定数目的连接事件Connection Event。范围0-499。设置为0则每次连接间隔都连接。数字越小,通讯速度越快,但功耗越高。注:如果在距离远或干扰大的情况下,当无数据通信时,这个值设置大,可以减少掉线的概率。比如防丢器:如果这个参数设置为0,表示规定时间内必须响应从机,不然就以为是蓝牙断开了。如果设置为3,假设信号不好时,中间丢了3个包,只接受到了1个就表示连接正常。因为他会跳过其中3个,保证了不掉线的概率。 

允许从机在没有数据发送的情况下,跳过一定数目的连接事件。在这些连接事件中,不必回复主机的包。这样就更省电。 

4.3 连接超时

 超时时间,就是两个设备在连接的这段时间没有发生通讯而导致连接自动断开的值。Range(10ms-32s)。用在信号不太好的情况下,给对方一点时间,超过这个时间通讯就建立失败。

连接间隔、从机潜伏周期以及超时时间这三者必须满足以下公式:

超时时间 > (1 + 从机潜伏周期) * 连接间隔。否则连接就会不正常断开。

这三个连接参数不同情况下对通信速率和功耗的影响:

连接间隔缩短,主机和从机通信更加频繁。提高了数据吞吐速度,缩短了数据发送的时间,增加了功耗。

连接间隔增长,通信频率降低,数据吞吐速度降低,增加了数据发送的时间,降低了功耗。

潜伏间隔减少,每次连接事件中都回复主机包,功耗增加,数据发送速度提高。

潜伏间隔增加,功耗降低,数据发送速度降低。

蓝牙协议栈定义了主机决定连接参数的值(连接间隔、潜伏周期、超时时间),从机可以请求更新这些参数,但是由主机决定是否接受,接受的值是多少。所以会出现手机接受参数后和从机请求的参数有偏差的情况,甚至是拒绝(IOS)。安卓和IOS都是在手机和设备建立链接时就会默认设置这些参数,APP开发时无法修改这些参数,这些默认参数是由手机厂商决定的。

 

相关文章:

蓝牙BLE学习-GAP

1.概述 GAP层(Generic access profile-通用访问配置文件)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式的一种,而且也是最简单的一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的…...

算法训练营day28(补), 贪心算法2

//122. 买卖股票的最佳时机 II func maxProfit(prices []int) int { result : 0 //利润总和 for i : 1; i < len(prices); i { if prices[i]-prices[i-1] > 0 { result result (prices[i] - prices[i-1]) } } return result } //55. 跳跃游戏 func canJump(nums []…...

Vue核心基础4:绑定样式、条件渲染、列表渲染

1 绑定样式 【代码】 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绑定样式</title><s…...

go-zero读取mysql部分字段

读取部分字段&#xff0c;使用函数 QueryRowPartialCtx 。 假设有如下一张表&#xff1a; CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ctime DATETIME);要读取字段 ctime 值。 定义一结构体&#xff1a; type X struct {state int db:"…...

反转一个单链表

反转一个单链表 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 需要虚拟节点么&#xff1f; 答&#xff1a;不需要&#xff0c;因为没有删除节点&#xff0c;只是改变了节点的指向。 遍…...

拿捏c语言指针(中)

前言 书接上回 拿捏c语言指针&#xff08;上&#xff09; 此篇主要讲解的是指针与数组之间的爱恨情仇&#xff0c;跟着我的脚步一起来看看吧~ 创造不易&#xff0c;可以帮忙点点赞吗 如有差错&#xff0c;欢迎指出 理解数组名 数组名是首元素地址 例外 1.sizeof&#xff0…...

鸿蒙语言ArkTS(更好的生产力与性能)

ArkTS是鸿蒙生态的应用开发语言 ArkTS提供了声明式UI范式、状态管理支持等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发应用。 同时&#xff0c;它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;进一步通过规范强化静态检…...

VBA技术资料MF120:打印固定标题行列

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…...

MongoDB聚合运算符:$add

$add运算符将将数字相加或将数字和日期相加。如果参数之一是日期&#xff0c;则 $add会将其他参数视为毫秒&#xff0c;并添加到日期中。 语法 { $add: [ <expression1>, <expression2>, ... ] }参数可以是任何有效的表达式&#xff0c;只要能否解析为数值或日期…...

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_4

《剑指Offer》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 148. 验证图书取出顺序——栈的压入、弹出序列2. LCR 14…...

数据库第四次实验

目录 1.建立数据表并插入数据 2 视图的创建 2.1 行列子集视图的创建 2.2 多表视图 2.3视图上建立视图 2.4分组视图 2.5带表达式的视图 3 删除视图 ​​​​​​​​​​​​​​4 查询视图 ​​​​​​​5 更新视图 5.1 修改某一个属性 5.2 删除一条数据 5.3 插入…...

基于PPNSA+扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于PPNSA扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图和优化收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行…...

UnityShader——06UnityShader介绍

UnityShader介绍 UnityShader的基础ShaderLab UnityShader属性块介绍 Properties {//和public变量一样会显示在Unity的inspector面板上//_MainTex为变量名&#xff0c;在属性里的变量一般会加下划线&#xff0c;来区分参数变量和临时变量//Texture为变量命名//2D为类型&…...

人工智能学习与实训笔记(一):零基础理解神经网络

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 一、什么是神经网络模型 二、机器学习的类型 2.1 监督学习 2.2 无监督学习 2.3 半监督学习 2.4 强化学习 三、网络模型结构基础 3.1 单层网络 ​编辑 3.2 多层网络 3.3 非线性多层网络…...

LeetCode刷题小记 一、【数组】

LeetCode刷题小记 一、【数组】 文章目录 LeetCode刷题小记 一、【数组】写在前面1. 数组1.1 理论基础1.2 二分查找1.3 移除元素1.4 有序数组的平方1.5 长度最小的子数组1.6 螺旋矩阵II Reference 写在前面 本系列笔记主要作为笔者刷题的题解&#xff0c;所用的语言为Python3&…...

iOS总体框架介绍和详尽说明

iOS是由苹果公司开发的移动操作系统&#xff0c;为iPhone、iPad、iPod Touch等设备提供支持。iOS采用了基于Unix的核心&#xff08;称为Darwin&#xff09;&#xff0c;并采用了类似于Mac OS X的图形用户界面。以下是iOS的总体框架介绍和详尽说明&#xff1a; UIKit框架&#…...

【C++】const与constexpr详解

1. constexpr&#xff1a;常量表达式 所谓常量表达式,指的就是由多个(≥1)常量组成的表达式。换句话说,如果表达式中的成员都是常量,那么该表达式就是一个常量表达式。这也意味着&#xff0c;常量表达式一旦确定&#xff0c;其值将无法修改。 实际开发中&#xff0c;我们经常会…...

蓝桥杯:日期统计讲解(C++)

日期统计 本题来自于&#xff1a;2023年十四届省赛大学B组真题 主要考察&#xff1a;暴力。 代码放在下面&#xff0c;代码中重要的细节全都写了注释&#xff0c;非常清晰明了&#xff1a; #include <bits/stdc.h> //万能头文件 using namespace std;int main() {…...

Python re.findall()中的正则表达式包含多个括号时的返回值——包含元组的列表

当re.findall()中的正则表达式包含多个括号时&#xff0c;返回值是一个列表&#xff0c;其中每个元素都是一个元组。这个元组的长度与正则表达式中括号的数量相同&#xff0c;元组中的每个元素都是与相应括号中的模式匹配的文本。 import re # 定义一个包含三个括号的正则表达…...

Python——列表

一、列表的特性介绍 列表和字符串⼀样也是序列类型的数据 列表内的元素直接⽤英⽂的逗号隔开&#xff0c;元素是可变的&#xff0c;所以列表是可变的数据类型&#xff0c;⽽字符串不是。 列表的元素可以是 Python 中的任何类型的数据对象。如&#xff1a;字符串、…...

无人机图像识别技术研究及应用,无人机AI算法技术理论,无人机飞行控制识别算法详解

在现代科技领域中&#xff0c;无人机技术是一个备受瞩目的领域。随着人们对无人机应用的需求在不断增加&#xff0c;无人机技术也在不断发展和改进。在众多的无人机技术中&#xff0c;无人机图像识别技术是其中之一。 无人机图像识别技术是利用计算机视觉技术对无人机拍摄的图像…...

清华AutoGPT:掀起AI新浪潮,与GPT4.0一较高下

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域迎来了一个又一个突破。最近&#xff0c;清华大学研发的AutoGPT成为了业界的焦点。这款AI模型以其出色的性能&#xff0c;展现了中国在AI领域的强大实力。 目录 引言&…...

人工智能学习与实训笔记(二):神经网络之图像分类问题

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 目录 二、图像分类问题 2.1 尝试使用全连接神经网络 2.2 引入卷积神经网络 2.3 分类函数Softmax 2.4 交叉熵损失函数 2.5 学习率优化算法 2.6 图像预处理算法 2.6.1 随机改变亮暗、对比度和颜色等 …...

SSM框架,spring-aop的学习

代理模式 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来…...

【设计模式】4、策略模式

文章目录 一、问题二、解决方案2.1 真实世界的类比2.2 策略模式结构2.3 适用场景2.4 实现方式2.5 优缺点2.6 与其他模式的关系 三、示例代码3.1 go3.2 rust 策略模式是一种行为设计模式&#xff0c;它能定义一系列算法&#xff0c;把每种算法分别放入独立的类中&#xff0c;以是…...

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(深入)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;世界上的另一个我 1:02━━━━━━️&#x1f49f;──────── 3:58 &#x1f504; ◀️ ⏸ ▶️ ☰ &am…...

【机构vip教程】Android SDK手机测试环境搭建

Android SDK 的安装和环境变量的配置 前置条件&#xff1a;需已安装 jdk1.8及 以上版本 1、下载Android SDK&#xff0c;解压后即可&#xff08;全英文路径&#xff09;&#xff1b;下载地址&#xff1a;http://tools.android-studio.org/index.php/sdk 2、新建一个环境变量&…...

2024.2.18

使用fgets统计给定文件的行数 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./test.txt","w"))NULL){perror("open err");return -1;}fputc(h,fp);fputc(\n,fp);fput…...

Haproxy实验

环境: servera(Haproxy):192.168.233.132 serverb(web1):192.168.233.144 serverc(web2):192.168.233.140 serverd(客户端):192.168.233.141 servera(Haproxy): yum install haproxy -y vim /etc/haproxy/haproxy.cfg(配置文件) # 设置日志&#…...

CSRNET图像修复,DNN

CSRNET图像修复 CSRNET图像修复&#xff0c;只需要OPENCV的DNN...

004 - Hugo, 分类

004 - Hugo, 分类content文件夹 004 - Hugo, 分类 content文件夹 ├─.obsidian ├─categories │ ├─Python │ └─Test ├─page │ ├─about │ ├─archives │ ├─links │ └─search └─post├─chinese-test├─emoji-support├─Git教程├─Hugo分类├─…...

Vue3之ElementPlus中Table选中数据的获取与清空方法

Vue3之ElementPlus中Table选中数据的获取与清空方法 文章目录 Vue3之ElementPlus中Table选中数据的获取与清空方法1. 点击按钮获取与清空选中表格的数据1. 用到ElementPlus中Table的两个方法2. 业务场景3. 操作案例 1. 点击按钮获取与清空选中表格的数据 1. 用到ElementPlus中…...

Leetcode 516.最长回文子序列

题意理解&#xff1a; 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 回文理解为元素对称的字串&#xff0c;这里…...

cool Node后端 中实现中间件的书写

1.需求 在node后端中&#xff0c;想实现一个专门鉴权的文件配置&#xff0c;可以这样来解释 就是 有些接口需要token调用接口&#xff0c;有些接口不需要使用token 调用 这期来详细说明一下 什么是中间件中间件顾名思义是指在请求和响应中间,进行请求数据的拦截处理&#xf…...

Leecode之面试题消失的数字

一.题目及剖析 https://leetcode.cn/problems/missing-number-lcci/description/ 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 注意&#xff1a;本题相对书上原题稍作改动 示例 1&…...

STM32的三种下载方式

结果jlink&#xff0c;串口&#xff0c;stlink方式都没有问题&#xff0c;是当时缩减代码&#xff0c;看真正起作用的代码段有哪些&#xff0c;就把GPIO初始化中 /*开启GPIO外部时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); 把开启外部时钟的代码注释掉了。…...

华为 huawei 交换机 接口 MAC 地址学习限制接入用户数量 配置示例

目录 组网需求: 配置思路&#xff1a; 操作步骤&#xff1a; 配置文件&#xff1a; 组网需求: 如 图 2-14 所示&#xff0c;用户网络 1 和用户网络 2 通过 LSW 与 Switch 相连&#xff0c; Switch 连接 LSW 的接口为GE0/0/1 。用户网络 1 和用户网络 2 分别属于 VLAN10 和 V…...

使用Python生成二维码的完整指南

无边落木萧萧下&#xff0c;不如跟着可莉一起游~ 可莉将这篇博客收录在了&#xff1a;《Python》 可莉推荐的优质博主首页&#xff1a;Kevin ’ s blog 本文将介绍如何使用Python中的qrcode库来生成二维码。通过简单的代码示例和详细解释&#xff0c;读者将学习如何在Python中轻…...

排序前言冒泡排序

目录 排序应用 常见的排序算法 BubbleSort冒泡排序 整体思路 图解分析 ​ 代码实现 每趟 写法1 写法2 代码NO1 代码NO2优化 时间复杂度 排序概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递…...

红队笔记Day3-->隧道上线不出网机器

昨天讲了通过代理的形式&#xff08;端口转发&#xff09;实现了上线不出网的机器&#xff0c;那么今天就来讲一下如何通过隧道上线不出网机器 目录 1.网络拓扑 2.开始做隧道&#xff1f;No&#xff01;&#xff01;&#xff01; 3.icmp隧道 4.HTTP隧道 5.SSH隧道 1.什么…...

C 练习实例70-求字符串长度

题目&#xff1a;写一个函数&#xff0c;求一个字符串的长度&#xff0c;在 main 函数中输入字符串&#xff0c;并输出其长度。 解答&#xff1a; #include <stdio.h> int length(char *s); int main() {int len;char str[20];printf("请输入字符串:\n");scan…...

HarmonyOS—@State装饰器:组件内状态

State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&a…...

Linux系统——防火墙拓展及重点理解

目录 一、iptables 1.基本语法 2.四表五链——重点记忆 2.1四表 2.2五链 2.3总结 3.iptables选项示例 3.1 -Z 清空流量计数 3.2 -P 修改默认规则 3.3 -D 删除规则 3.4 -R 指定编号替换规则 5.白名单 6.通用匹配 7.示例 7.1添加回环网卡 7.2可以访问端口 7.3 主…...

阿里云短信验证码的两个坑

其它都参照官网即可&#xff0c;其中有两个坑需要注意&#xff1a; 1、除去官网pom引用的包之外&#xff0c;还需要引用以下包&#xff1a; <dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifact…...

c入门第十五篇——学而时习之(阶段性总结)

古人说&#xff1a;“学而时习之。”古人又说&#xff1a;“温故而知新。”古人还说&#xff1a;“读书百遍&#xff0c;其义自见。” 总结一个道理那就是好书要反反复复的读&#xff0c;学习过的知识要时常去复习它&#xff0c;才有可能常读常新。 我&#xff1a;“师弟&…...

抽象的前端

问题背景&#xff1a;vue3&#xff0c;axios 直接导致问题&#xff1a;路由渲染失败 问题报错&#xff1a;Uncaught SyntaxError: The requested module /node_modules/.vite/deps/axios.js?v7bee3286 does not provide an export named post (at LoginIn.vue:16:9) 引入组…...

UPC训练赛二十/20240217

A:无穷力量 题目描述 2022年重庆突发山火让世界看到了中国一个又一个的感人事迹&#xff1a;战士们第一时间奔赴火场&#xff0c;志愿者们自发组成团队&#xff0c;为救火提供一切的可能的服务&#xff0c;人们自发输送物资&#xff0c;有的志愿者甚至几天几夜没有睡觉。每个…...

【51单片机】LCD1602(江科大)

1.LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:162个字符,每个字符为5*7点阵 2.引脚及应用电路 3.内部结构框图 屏幕: 字模库:类似于数码管的数…...

conda与pip的常用命令

conda的常用命令 1.查看conda版本 $ conda --version conda 23.11.02.查看conda的配置信息 $ conda infoactive environment : baseactive env location : /home/myPc/miniconda3shell level : 1user config file : /home/myPc/.condarcpopulated config files : conda vers…...

你知道什么是物联网MQTT么?

目录 你知道什么是物联网MQTT么&#xff1f;MQTT的基本概念MQTT的工作原理MQTT的应用场景MQTT的实例案例智能家居场景工业监控场景 你知道什么是物联网MQTT么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、基于发布/订阅模式…...