LoRaWAN协议

news2024/9/23 1:24:37

目录

一、介绍

1、LPWA是什么?

2、LoRa是什么?

3、LoRaWAN是什么?

4、浅谈LoRa与LoRaWAN的区别

5、LoRaWAN开发背景

6、LoRaWAN与NB-IOT如何选择?

二、LoRaWAN网络结构

1、组网结构

2、星型拓扑结构

三、数据格式

1、PHY帧格式

2、MAC帧格式

(1)帧的类型

 (2)自适应数据速率

(3)帧计数器

四、MAC命令

 五、终端激活

1、终端激活后的数据存储

2、空中激活OTAA

​编辑

3、独立激活ABP

六、终端节点的三种模式

1、Class A---双向传输终端

2、Class B---划定接收时隙的双向传输终端

3、Class C---最大化接收时隙的双向传输终端

七、小结


一、介绍

1、LPWA是什么?

        LPWA(Low Power Wide Area,低功耗广域网)是一种无线通信技术,专为满足物联网(IoT)设备的需求而设计。LPWA网络的两大特点:低功耗、远距离无线通信。LPWA技术包括多种协议和标准,其中最常见的有LoRaWAN、NB-IoT等。

[蜂窝LPWA(授权频段)]     

        在需要授权的蜂窝LPWA中,通常使用运营商的基站和通信网络。但是,物联网设备需要配备LPWA模块才能和基站保持稳定通信。因此,物联网设备和基站之间的区域往往是城区、居民区、工业区等人口密度较高的区域。而在到基站的通信存在困难的山区和偏远岛屿等远离城区的地区,则选择后述的非蜂窝LPWA。

[非蜂窝LPWA(免授权频段)] 

        非蜂窝LPWA不需要使用运营商的通信网络,从LPWA模块通过网关就可以将获得的数据发送到网络服务器或应用服务器。

2、LoRa是什么?

        LoRa,即远距离无线电(Long Range Radio)是一种由美国Semtech公司开发的无线通信技术,其主要特点是长距离传输和低功耗。LoRa技术通过调制技术实现了在长距离范围内的低功耗通信。

按区域(部分)划分的LoRa频带 

3、LoRaWAN是什么?

        LoRaWAN是建立在LoRa技术之上的协议,用于在物联网中实现设备与网络之间的通信。它主要包括2个部分:通信协议和体系结构。可以能提供一个低功耗、可扩展、高服务质量、安全的长距离无线网络。借助于LoRa长距离的优势,LoRaWAN采用星型无线拓扑,有效延长电池寿命、降低网络复杂度和后续轻易扩展容量。它将网络实体分成4类:End Nodes(终端节点)、Gateway(网关)、LoraWAN Server(LoRaWAN服务器)和Applicaton Server(用户服务器)。

4、浅谈LoRa与LoRaWAN的区别

        LoRa是一种物理层通信技术,主要关注物理层的通信。LoRa通过ccs调制信号可以实现点对点或点对多点的通信。而LoRaWAN则建立在LoRa技术之上,其规定了通信协议和体系架构,更适用于构建大规模物联网网络,支持设备与互联网之间的通信。

5、LoRaWAN开发背景

        在 5G 等网络快速发展的时代,我们为什么要研究LoRaWAN呢?我们来设想一个环境:在一个偏远的农业区域,有一片大规模的农田,需要实时监测土壤湿度、温度、光照强度等参数,以优化灌溉、施肥等农业操作,提高产量和质量。监测设备分布广泛且距离远,每个设备要求低功耗以便长期运行,且数据传输频率较低。

        如果我们采用 5G 的话,虽然可以提供高速的数据传输,但其覆盖范围在农村和偏远地区通常较差,需要建立多个基站来覆盖大面积农田,导致高昂的基础设施成本。而且设备在待机和数据传输时的功耗较高,无法满足需要长期运行且更换电池困难的场景。

        所以在需要广域覆盖、低功耗和低成本的特定场景,LoRaWAN无疑是更合适的选择。这也是为什么在5G等技术快速发展的同时,LoRaWAN仍然被广泛研究和应用的原因。

6、LoRaWAN与NB-IOT如何选择?

        前文提到过LPWA,LoRaWAN就是典型的非蜂窝LPWA,NB-IOT是典型的蜂窝LPWA。二者都是比较常用的低功耗广域网,我们要怎么选择呢?这和我们需要应用的场景有很大的关系。

        LoRa工作在1GHz以下的非授权频段,故在应用时不需要额外付费。NB-IoT和蜂窝通信使用1GHz以下的授权频段。处于500MHz和1GHz之间的频段对于远距离通信是最优的选择,因为天线的实际尺寸和效率是具有相当优势的。LoRaWAN使用免费的非授权频段,并且是异步通信协议,对于电池供电和低成本是最佳的选择。LoRa 和 LoRaWAN 协议,在处理干扰、网络重叠、可伸缩性等方面具有独特的特性,但却不能提供像蜂窝协议一样的服务质量(QoS)。据悉授权的Sub-GHz频段的竞拍,每MHz价格不菲。蜂窝网络和NB-IoT出于对服务质量(QoS)的考虑,并不能提供类似LoRa一样的电池寿命。由于QoS和高昂的频段使用费,需要确保QoS的应用场景推荐使用蜂窝网络和NB-IoT,而低成本和大量连接是首选项,则LoRa是不错的选择。

二、LoRaWAN网络结构

1、组网结构

        LoRa整体网络结构分为终端、网关、网络服务、应用服务几个功能,一般LoRa终端和网关之间可以同过LoRa无线技术进行数据传输,而网关和核心网或广域网之间的交互可以通过TCP/IP协议,当然可以是有线连接的以太网,亦可以为4G类的无线连接。

2、星型拓扑结构

        LoRaWAN采用的便是星型拓扑结构,以网关为中心节点,其他的终端节点都通过独立的链路与中心节点相连,中心节点充当数据传输的枢纽,负责转发数据包。

        这种拓扑结构易于管理,而且每个节点都有独立的链路连接到中心节点,因此出现故障时只会影响单个节点,不会影响整个网络的运行。新节点的添加非常方便,只需将其与中心节点相连即可。这种扩展方式不会对现有网络造成任何中断。

三、数据格式

1、PHY帧格式

        LoRa的物理层PHY帧格式主要用于描述数据在无线信道上传输的结构和编码方式。主要包括了前导码、帧头部分、物理有效载荷和CRC校验字段。

(1)前导码Preamble:前导码由一系列特定模式的比特序列组成,用于接收端设备同步时钟和检测帧的开始。

(2)帧头部分PHDR:PHDR包含帧控制字段和设备地址,用于标识和管理帧的类型、长度以及发送或接收数据的设备。

(3)物理有效载荷PHYPayload:PHYPayload是实际要传输的数据部分,包括LoRaWAN的MAC帧以及应用数据。

(4)校验CRC:CRC字段用于检测和纠正数据传输过程中可能引入的误码,以确保数据的完整性和可靠性。(只有上行链路消息中存在CRC)

2、MAC帧格式

        LoRaWAN的MAC层帧负责管理数据在网络中的传输和接收顺序,以及设备之间的通信控制。PHY帧通过包含MAC帧作为其PHYPayload的一部分来传输LoRaWAN中的MAC层数据。

 (1)MHDR:MAC头部,指定了帧的类型和MAC命令。

 (2)Devaddr:设备地址,标识发送或接收数据的LoRaWAN终端设备。

 (3)FCtrl:帧控制字段,包括确认要求、ADR标志、帧计数器位(FCnt)以及FOpts存在标志。

 (4)FCnt:帧计数器,用于管理数据帧的顺序和完整性。

 (5)FOpts:选项字段,包含可选的MAC命令或配置信息。

 (6)FPort:端口字段,指示应用数据的端口号。

 (7)FRMPayload:应用有效载荷,包含应用数据。

 (8)MIC:消息完整性代码,用于验证MAC帧数据的完整性和真实性。长度为4字节。

(MIC是通过使用数据的加密密钥(如NwkSKey)计算而来,用于在接收端验证数据的完整性,防止数据在传输过程中被篡改或伪造。LoRaWAN网络使用MIC来确保数据在传输过程中的安全性和可靠性)

(1)帧的类型

        MHDR指定了帧的类型,LoRaWAN定义了六个不同的MAC消息类型:

 (2)自适应数据速率

        先看一下FCtl的结构:

下行

 

上行

        我们可以看到其中一位为ADR,也就是自适应数据速率。什么是ADR呢?LoRa网络允许终端采用任何可能的数据速率。LoRaWAN 协议利用该特性来优化固定终端的数据速率,这就是自适应数据速率。当这个使能时,网络会优化使得尽可能使用最快的数据速率。移动的终端由于射频环境的快速变化,数据速率管理就不再适用了,应当使用固定的数据速率。

        如果ADR的位字段有置位,网络就会通过相应的MAC命令来控制终端设备的数据速率。如果ADR位没设置,网络则无视终端的接收信号强度,不再控制终端设备的数据速率。

        如果终端被网络优化过的数据速率高于自己默认的数据速率,它需要定期检查下网络仍能收到上行的数据。每次上行帧计数都会累加(是针对于每个新的上行包,重传包就不再计数),终端增加ADR_ACK_CNT计数。如果直到ADR_ACK_LIMIT次上行(ADR_ACK_CNT>=ADR_ACK_LIMIT)都没有收到下行回复,它就得置高ADR应答请求位(ADRACKReq)。网络必须在规定时间内回复一个下行帧,这个时间是通过ADR_ACK_DELAY来设置,上行之后收到任何下行帧就要把ADR_ACK_CNT的计数重置。如果终端在ADR_ACK_LIMIT+ADR_ACK_DELAY时间内没有收到回复,终端必须切换到下一个更低速率,使得能够获得更远传输距离来重连网络。终端如果在每次ADR_ACK_DELAY到了之后依旧连接不上,就需要每次逐步降低数据速率。

        最后,在整理一下帧挂起位(FPending)。帧挂起位只在下行交互中使用,表示网关还有挂起数据等待下发,需要终端尽快发送上行消息再打开一个接收窗口。

(3)帧计数器

        每个终端有两个计数器跟踪数据帧的个数,一个是上行链路计数器(FCntUp),由终端在每次上行数据给网络服务器时累加;另一个是下行链路计数器(FCntDown),由服务器在每次下行数据给终端时累计。网络服务器为每个终端跟踪上行帧计数及下行帧计数。终端入网成功后,终端和服务端的上下行帧计数同时置0。每次发送消息后,发送端与之对应的FCntUp或FCntDown就会加1。接收方会同步保存接收数据的帧计数,对比收到的计数值和当前保存的值,如果两者相差小于MAX_FCNT_GAP,接收方就按接收的帧计数更新对应的值。如果两者相差大于MAX_FCNT_GAP就说明了中间丢失了很多数据,这条以及后面的数据就会被丢弃掉。

四、MAC命令

        对于网络管理者而言,有一套专门的MAC命令用来在服务器和终端MAC层之间交互。这套MAC命令对应用程序或者应用服务器或者运行在终端设备上的应用程序是不可见的。

 五、终端激活

        为了加入LoRaWAN网络,每个终端需要初始化及激活。终端的激活有两种方式,一种是空中激活(OTAA),当设备部署和重置时使用;另一种是独立激活(ABP),此时初始化和激活这两步就在一个步骤内完成。

1、终端激活后的数据存储

        激活后,终端会存储如下信息:设备地址(DevAddr)、应用ID(AppEUI)、网络会话密钥(NwkSKey)、应用会话密钥(AppSKey)。

(1)设备地址(DevAddr):终端地址由可标识当前网络设备的32位ID所组成,高7位是Nwkld,用来区别同一区域内的不同网络,另外也保证防止节点窜到别的网络去。它的低25位是NwkAddr,是终端的网络地址,可以由网络管理者来分配。

(2)应用ID(AppEUI):APPEUI是唯一ID,标识终端的应用提供者。

(3)网络会话密钥(NwkSKey):NwkSKey被终端和网络服务器用来计算和校验所有消息的MIC,以保证数据完整性。也用来对单独MAC的数据消息载荷进行加解密。

(4)应用会话密钥(AppSKey):AppSKey被终端和网络服务器用来对应用层消息进行加解密。当应用层消息载荷有MIC时,也可以用来计算和校验该应用层MIC。

2、空中激活OTAA

        针对空中激活,终端必须按照加网流程来和网络服务器进行数据交互。如果终端丢失会话消息,则每次必须重新进行一次加网流程。加网流程需要终端准备好如下三个参数:DevEUI、AppEUI、AppKey。

(1)终端ID(DevEUI):唯一的ID,用于标识唯一的终端设备。

(2)应用密钥(AppKey):当终端通过OTAA方式加入网络,AppKey用来产生会话密钥NwkSKey和AppSKey,会话密钥分别用来加密和校验网络层和应用层数据。

        从终端角度看,加网流程是由和服务器的两个MAC命令交互组成的,分别是join request 和 join accept。加网流程总是由终端发送join-request来发起。

        join-request消息包含了AppEUI和DevEUI,后面还跟了2个字节的声明DevNonce。DevNonce是一个随机值。网络服务器为每个终端过去的DevNonce数值,如果相同设备发出相同的DevNonce的join-request就会忽略。

        如果网络服务器准许终端加入网络,就会用join-accept对join-request进行应答。join-accept是作为一个普通下行帧进行下发的。如果join-request不被接受,则终端不会收到回应。

        join-accept消息的帧格式包括3字节的应用随机数(AppNonce)、网络标识符(NetID)、终端地址(DevAddr),TX和RX之间的延时(RxDelay),用于终端所加入的网络的可选信道频率列表(CFList)。

        AppNonce是由网络服务器所提供的一个随机值或者某些形式的唯一ID,用于终端得到两个会话密钥NwkSKey和AppSKey。

3、独立激活ABP

        ABP激活就是让终端跳过join-request和join-accept的加网流程,直接加入到指定网络中。ABP入网意味着DevAddr和两个会话密钥NwkSKey和AppSKey直接存储在终端中,终端一开始就配置了入网必要的信息。

        每个终端必须要有唯一的NwkSKey和AppSKey。这样,一个设备的密钥被破解也不会造成其他设备的安全性危险。

六、终端节点的三种模式

1、Class A---双向传输终端

         所有LoRaWAN设备都必须支持Class A。

         每个设备上传(uplink)消息后,网络服务器可以在两个接收窗口期间(RX1和RX2)发送下行(downlink)消息。接收窗口RX1一般是在上行后1秒开始,接收窗口RX2是在上行后2秒开始。简单来说,终端有数据了,就上报,顺便收一下服务器下发的指令。终端没数据的时候,服务器下发不了指令。

        Class A是最节能的,因为设备大部分时间处于睡眠状态,只有在发送消息后才会打开接收窗口,支持最少量的下行通信,应用于电池供电的传感器节点,如温度传感器、烟雾探测器等。

2、Class B---划定接收时隙的双向传输终端

        Class B现在是应用最广泛的,但同时也是最复杂的。Class B的目的就是在Class A终端随机上行后的接收窗口之外,让终端也能在可预见的时间内开启接收。Class B是让网关周期发送信标来同步网络中的所有终端,以便终端能够在周期时隙的确定时间点打开一个短的接收窗口(叫做“ ping slot”)。

        网关通过周期发送信标来同步时间(beacon周期默认为128秒),除去BEACON_RESERVED(为Beacon数据包预留时间窗口)和BEACON_GUARD(Beacon窗口的保护时间,此时间段内,节点不得发起Class A通信)的便是BEACON_WINDOW(约为122.88秒),将BEACON_WINDOW划分成4096份,我们把每一份称作一个“slot”(每个slot约为30ms)。其中,终端和NS约定好的slot我们称作“ping slot”,在这段期间,Class B 会开启接收窗口。“ping slot”之间的时间间隔我们称作“ping period”,第一个ping slot可以通过pingNB、ping period和DevAddr计算出来,之后每过一个ping period就开启ping slot。

        节点应用层请求LoRaWAN层切换到Class B。节点的LoRaWAN层搜索beacon并返回结果(BEACON_LOCKED或者BEACON_NOT_FOUND)。LoRaWAN层可使用DeviceTimeReq MAC指令加快beacon搜索过程。一旦进入Class B模式,节点所有上行帧的FCTRL_ClassB(FCTRL域中位Class B)都置1,从而告知NS本节点已进入Class B模式。节点MAC层将自动在每个beacon和ping时间窗打开接收。节点成功收到beacon后,LoRaWAN层会把beacon内容和RSSI传给应用层;节点在ping slot成功收到下行后,处理方法同Class A下行。LoRaWAN层在组织beacon和ping时会考虑最大可能时钟偏差。如果在指定周期内没有接收到beacon,则意味着网络同步丢失。MAC层必须通知应用层切换回Class A。随后终端在上行帧的LoRaWAN层中将不再设置Class B的位域,用以通知NS终端不再处于Class B模式。

        这里说的有点啰嗦了,在这里做个总结吧!在从Class A切换到Class B之前,终端必须首先接收一个网络的信标来将自身的时间与网络时间进行校准。一旦处于Class B模式,终端必须定期地去搜索并且接收一个网络信标,以消除自身内部时间相对于网络时间的任何漂移。Class B模式的设备也许会短暂性地无法接收信标,在这种情况下,终端必须考虑它内部时钟可能产生的漂移,逐步加大信标和ping时隙的接收窗口时间。(通过逐渐加大接收窗口时间,设备能够在更长的时间范围内扫描信标信号,从而增加重新接收到信标并重新同步的机会。)

3、Class C---最大化接收时隙的双向传输终端

        Class C和Class A比较像。Class C终端会尽可能地使用RX2窗口来监听。按照Class A的规定,终端是在RX1无数据收发才进行RX2接收。为了满足这个规定,终端会在上行发送结束和RX1接收窗口开启之间,打开一个短暂的RX2窗口,一旦RX1接收窗口关闭,终端会立即切换到RX2接收状态;RX2接收窗口会持续打开,除非终端需要发送其他消息。

        设备几乎一直处于接收模式,只有在发送上行消息时短暂关闭接收窗口。所以Class C设备的实时性非常好,但是耗电量较高。通常应用于不需要考虑电池寿命的应用,如电力驱动设备、工业控制设备等。

七、小结

        本篇文章主要从LoRaWAN的结构、协议等入手进行讲解,为大家整理了LoRaWAN协议栈。后续关于如何搭建LoRaWAN服务器(NS、AS)、如何移植网关等我会陆陆续续进行整理。

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

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

相关文章

golang AST语法树解析

1. 源码示例 package mainimport ("context" )// Foo 结构体 type Foo struct {i int }// Bar 接口 type Bar interface {Do(ctx context.Context) error }// main方法 func main() {a : 1 }2. Golang中的AST golang官方提供的几个包,可以帮助我们进行A…

代码随想录算法训练营第五十五天|101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

101.孤岛的总面积 题目链接:101.孤岛的总面积沉没孤岛 文档讲解:代码随想录 状态:不会 思路: 步骤1:将边界上的陆地变为海洋 步骤2:计算孤岛的总面积 题解: public class Main {// 保存四个方…

【UE5.1】NPC人工智能——02 NPC移动到指定位置

效果 步骤 1. 新建一个蓝图,父类选择“AI控制器” 这里命名为“BP_NPC_AIController”,表示专门用于控制NPC的AI控制器 2. 找到我们之前创建的所有NPC的父类“BP_NPC” 打开“BP_NPC”,在类默认值中,将“AI控制器类”一项设置为“…

动手学深度学习——3.多层感知机

1.线性模型 线性模型可能出错 例如,线性意味着单调假设: 任何特征的增大都会导致模型输出的增大(如果对应的权重为正), 或者导致模型输出的减小(如果对应的权重为负)。 有时这是有道理的。 例…

R绘制Venn图及其变换

我自己在用R做各种分析时有不少需要反复用到的基础功能,比如一些简单的统计呀,画一些简单的图等等,虽说具体实现的代码也不麻烦,但还是不太想每次用的时候去找之前的代码。 索性将常用的各种函数整成了一个包:pcutils…

前端JS特效第34集:jQuery俩张图片局部放大预览插件

jQuery俩张图片局部放大预览插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Co…

数据结构与算法02迭代|递归

目录 一、迭代(iteration) 1、for循环 2、while循环 二、递归&#xff08;recursion&#xff09; 1、普通递归 2、尾递归 3、递归树 三、对比 简介&#xff1a;在算法中&#xff0c;重复执行某个任务是常见的&#xff0c;它与复杂度息息相关&#xff0c;在程序中实现重…

MySQL MVCC原理

全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;主要是为了提高数据库的并发性能。 1、版本链 对于使用InnoDB存储引擎的表来说&#xff0c;它的聚簇索引记录中都包含两个必要的隐藏列&#xff1a; 1、trx_id&#xff1a;每次一个事务对某条…

connect by prior 递归查询

connect by prior 以公司组织架构举例&#xff0c;共四个层级&#xff0c;总公司&#xff0c;分公司&#xff0c;中心支公司&#xff0c;支公司 总公司level_code为1 下一层级的parent_id为上一层级的id&#xff0c;建立关联关系 SELECT id, name, LEVEL FROM org_info a STA…

区块链学习05-web3中solidity和move语言

Solidity 和 Move 语言的比较&#xff1a;Web3 开发中的两种选择 Solidity 和 Move 都是用于开发区块链平台智能合约的编程语言。它们具有一些相似之处&#xff0c;但也存在一些关键差异。 相似之处: Solidity 和 Move 都是图灵完备语言&#xff0c;这意味着它们可以表达计算…

提高引流精准性的策略

1、定位清晰&#xff1a;明确你的目标用户是谁&#xff0c;了解他们的需求和兴趣&#xff0c;定制内容和策略以吸引他们。 2、价值输出&#xff1a;提供有价值的内容或服务&#xff0c;让用户觉得添加你的微信是有益的&#xff0c;比如独家资讯、优惠券、专业咨询等。 3、筛选…

vs2019 QT无法打开源文件QModbusTcpClient

vs2019无法打开源文件QModbusTcpClient 如果配置的msvc2019,则查找到Include目录 然后包含&#xff1a; #include <QtSerialBus/qmodbustcpclient.h>

PostgreSQl 物化视图

物化视图&#xff08;Materialized View&#xff09;是 PostgreSQL 提供的一个扩展功能&#xff0c;它是介于视图和表之间的一种对象。 物化视图和视图的最大区别是它不仅存储定义中的查询语句&#xff0c;而且可以像表一样存储数据。物化视图和表的最大区别是它不支持 INSERT…

【设计模式】【创建型模式】【02工厂模式】

系列文章 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 系…

redis原理之底层数据结构(三)-quicklist

1.绪论 前面讲过的ziplist在查找元素的时候是o(n)的复杂度&#xff0c;如果ziplist长度太长&#xff0c;会导致查找元素很缓慢&#xff0c;而ziplist是拥有内存连续的优势&#xff0c;为了保留ziplist内存连续的优势&#xff0c;但是又不能保留太长的长度&#xff0c;我们出现…

MQ基础1

对应B站视频&#xff1a; MQ入门-01.MQ课程介绍_哔哩哔哩_bilibili 微服务一旦拆分&#xff0c;必然涉及到服务之间的相互调用&#xff0c;目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中&#xff0c;调用者发起请求后需要等待服务提供者执行业务返回结果后…

【Linux杂货铺】期末总结篇3:用户账户管理命令 | 组账户管理命令

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux杂货铺、Linux实践室 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 第五章5.1 ⛳️Linux 账户5.2 ⛳️用户配置文件和目录&#xff08;未完待续&#xff09;5.2.1 …

java面向对象进阶篇--static

一、前言 java进阶篇已经开始了&#xff0c;先从面向对象开始&#xff0c;由于时间原因今天就只更新了static部分&#xff0c;内容上特别详细&#xff0c;一些特别的注意事项也在反复的提醒大家。 温馨提示一下&#xff0c;往后的java篇会越来越难&#xff0c;希望大家能够坚…

推荐5个实用的可视化工具

面对海量的数据&#xff0c;我们应该如何高效地提取其价值&#xff0c;让复杂的信息一目了然&#xff1f;这正是可视化工具大显身手的舞台。今天&#xff0c;我就来分享几款非常好用的数据可视化工具&#xff0c;它们不仅能够帮助你轻松驾驭数据&#xff0c;还能让你的工作汇报…

vite配置环境变量和使用,配置正确后import.meta.env.VITE_APP_BASE_URL编译报错的解决方法

一、配置&#xff1a; 1.新增四个环境文件 .env.development .env.test .env.production .env.pre 内容为不同环境的不同参数变量必须以VITE_APP开头&#xff0c;如&#xff1a; #接口地址 VITE_APP_BASE_URL"&#xffe5;&#xffe5;&#xffe5;&#xffe5;&#xff…