WIFI连接与通信
ESP32-S3 支持 2.4 GHz 的 Wi-Fi 4(802.11n)标准,提供高达 150 Mbps 的数据传输速率。它支持 STA(Station)模式、AP(Access Point)模式和 Wi-Fi 直连(Wi-Fi Direct)模式,可以灵活地连接到其他设备或创建自身的网络。ESP32-S3 还支持硬件加速的 Wi-Fi 加密算法,包括 WPA/WPA2-PSK 和 WPA3-SAE 加密。这使得加密和解密数据的速度更快,提高了系统的整体性能和安全性。
Wi-Fi 库支持配置及监控 ESP32 Wi-Fi 连网功能。
它有三种模式:
- 基站模式(即 STA 模式或 Wi-Fi 客户端模式),此时 ESP32 连接到接入点 (AP)。
- AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 ESP32。
- AP-STA 共存模式(ESP32 既是接入点,同时又作为基站连接到另外一个接入点)。
常用API介绍
下面是一些 ESP32S3 Arduino 库中常用的 Wi-Fi 相关函数的介绍:
-
WiFi.begin(ssid, password)
该函数用于连接到已经存在的Wi-Fi 网络。需要提供要连接的网络的 SSID 和密码作为参数。
-
WiFi.disconnect()
该函数用于断开当前的 Wi-Fi 连接。
-
WiFi.status()
该函数返回当前 Wi-Fi 连接的状态。返回值可能是以下之一:
WL_CONNECTED
:已连接到 Wi-Fi 网络。WL_DISCONNECTED
:未连接到 Wi-Fi 网络。WL_IDLE_STATUS
:Wi-Fi 处于空闲状态。WL_NO_SSID_AVAIL
:未找到指定的 Wi-Fi 网络。 -
WiFi.localIP()
该函数返回 ESP32S3 设备在 Wi-Fi 网络中分配的本地 IP 地址。
-
WiFi.macAddress()
该函数返回 ESP32S3 设备的 MAC 地址。
-
WiFi.scanNetworks()
该函数用于扫描周围可用的 Wi-Fi 网络。它返回一个整数,表示扫描到的网络数量。可以使用其他函数(如WiFi.SSID() 和 WiFi.RSSI())来获取每个网络的详细信息。
-
WiFi.SSID(networkIndex)
该函数返回指定索引的扫描到的 Wi-Fi 网络的 SSID。
-
WiFi.RSSI(networkIndex)
该函数返回指定索引的扫描到的 Wi-Fi 网络的信号强度(RSSI)。
STA模式
在 STA 模式下,ESP32-S3会建立 Wi-Fi 连接,连接到一个已经建立好的 Wi-Fi 热点上,通过该热点来访问互联网。STA 模式使用的场景比较多,比如在智能家居、物联网设备以及工业控制等领域中,设备需要通过 Wi-Fi 连接到网络来传递数据。
示例:连接外部WIF,当连接成功时,通过Serial串口输出IP地址
#include <WiFi.h> | |
#define LED 48 | |
// 定义 要连接的 Wi-Fi 名与密码 | |
const char* ssid = "LEDC"; // 这是我手机热点 | |
const char* password = "12345678"; // 热点的密码 | |
void setup() { | |
Serial.begin(115200);//串口调试 | |
// 先断开之前的连接 | |
WiFi.disconnect(true); | |
// 连接 Wi-Fi | |
WiFi.begin(ssid, password); | |
Serial.print("正在连接 Wi-Fi"); | |
// 检测是否链接成功 | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
Serial.println("连接成功"); | |
Serial.print("IP address: "); | |
Serial.println(WiFi.localIP()); | |
} | |
void loop() { | |
delay(1000); | |
} |
在 C 和 C++ 编程语言中,const char*
是一种常见的类型声明,以下是对其各个部分的详细阐释:
const
关键字:const
是一个修饰符,它限定了该声明的某种属性。当它出现在const char*
这样的组合中时,其主要作用是保护指针所指向的数据。这意味着,一旦你使用const char*
声明了一个指针,你就不能通过这个指针去修改其所指向的数据。它就像一个保护罩,确保数据在使用这个指针操作时不会被意外地篡改,从而增强了程序的安全性和可靠性。
char
类型关键字:char
是 C 和 C++ 中用于表示字符的数据类型。字符可以是单个的英文字母、数字、标点符号或者其他字符,并且在存储和处理文本数据时,我们通常会使用char
类型。例如,存储字符 'a' 或者 '1' 时,会使用char
类型。
*
指针声明符:*
这个符号在 C 和 C++ 中是专门用来声明指针的。当它和char
组合在一起时,就表示我们要声明的是一个指针,而且这个指针指向的数据类型是char
。简单来说,这个指针将存储一个内存地址,而该内存地址所存储的是char
类型的数据。
当我们把 const
、char
和 *
组合在一起形成 const char*
时,它的完整含义是:我们正在声明一个指针,这个指针指向的是 char
类型的数据,并且这些数据是不可修改的常量。
我们可以通过以下代码示例来进一步理解:
const char *str = "Hello, world!"; |
在这个例子中,我们声明了一个名为 str
的变量,它的类型是 const char*
。str
指向了一个存储在内存中的字符串 "Hello, world!"
。这里的 const
关键字保证了我们不能通过 str
指针去修改 "Hello, world!"
这个字符串的内容。例如,以下操作是不允许的:
str[0] = 'h'; // 错误:尝试修改 const 指针指向的数据 |
因为 str
是 const char*
类型,通过它修改所指向的数据是不合法的,编译器会报错,以防止我们不小心修改了不应该修改的数据。
总之,使用 const char*
可以有效地防止在程序中意外修改常量字符串,提高代码的健壮性和可维护性,同时也明确了该指针的操作范围和限制,使代码的意图更加清晰,让其他开发者一看便知,这个指针只能用来读取数据,而不能用于修改数据。
这样的声明在处理字符串常量、函数参数传递(当不希望函数修改字符串内容时)以及许多其他场景中都非常有用,因为它清晰地表明了指针所指向的数据是只读的,避免了潜在的数据修改错误。
AP模式
接入点(AP)是一种提供 Wi-Fi 网络访问的设备,并将其连接到有线网络的装置。ESP32S3除了不具有与有线网络的接口外,还可以提供类似的功能。这种操作模式称为软接入点(soft-AP)。可以同时连接到soft-AP的最大站数可以设置4,默认为4。
当ESP32S3单独处于AP模式下时,可以被认为是一个无法访问外网的局域网WiFi路由器节点,它可以接受各类设备的连接请求。并可以和连接设备进行TCP、UDP连接,实现数据流。在局域物联网的设计中可以承担数据收发节点的作用。
Q:可以简单理解为一个不能上网的热点?
A:这种理解基本正确。ESP32S3 在 AP 模式下可以被视为一个热点,其他设备可以搜索并连接到这个热点,但这个热点不会像家庭 Wi-Fi 路由器那样可以将设备连接到互联网,而只是创建了一个本地的无线网络环境,供连接的设备之间进行通信。
示例:当ESP32S3 在 AP 模式下运行时,它将创建一个名为“ESP32S3”的无线网络,并分配一个 IP 地址。其他设备可以搜索并连接到这个热点,但无法通过这个热点上网。
#include <WiFi.h> | |
// 设置要创建的热点名与密码 | |
const char* ssid = "ESP32S3"; | |
const char* password = "12345678"; | |
void setup() | |
{ | |
Serial.begin(115200); | |
// 创建热点 | |
WiFi.softAP(ssid, password); | |
// 打印热点 IP | |
Serial.print("Wi-Fi 接入的 IP:"); | |
Serial.println(WiFi.softAPIP()); | |
} | |
void loop() | |
{ | |
delay(500); | |
} |
到此,你应该已经知道如何使用STA 和 AP 模式了,但是,我们使用WIFI最主要的目的是数据的传输,所以接下来我会介绍如何使用WIFI进行数据传输。
TCP与UDP协议
请先确保WIFI已经连接,接下来的代码将以STA模式为例子
TCP(Transmission Control Protocol):
- 连接性:
- TCP 是一种面向连接的协议。在进行数据传输之前,发送方和接收方需要通过三次握手建立一个可靠的连接。这个过程确保双方都准备好进行数据传输,并且在传输结束后,会通过四次挥手来关闭连接。
- 三次握手的过程如下:
- 客户端发送一个 SYN(同步)数据包给服务器,表示客户端想要建立连接。
- 服务器收到 SYN 后,回复一个 SYN-ACK(同步 - 确认)数据包给客户端,表示服务器已经收到请求,并同意建立连接。
- 客户端收到 SYN-ACK 后,发送一个 ACK(确认)数据包给服务器,至此连接建立成功。
- 可靠性:
- TCP 提供高度可靠的数据传输服务。它使用序列号和确认应答机制,确保数据按序、完整地到达接收方。
- 发送方会将数据分割成多个数据包,并为每个数据包分配一个序列号。接收方收到数据包后,会向发送方发送确认应答(ACK),告知发送方已收到哪些数据包。
- 如果发送方在一定时间内没有收到确认应答,它会认为数据包丢失或损坏,将重新发送该数据包。
- TCP 还采用流量控制和拥塞控制机制,以防止发送方发送过多的数据,避免网络拥塞或接收方缓冲区溢出。
- 数据传输顺序:
- 由于使用序列号,接收方可以将接收到的数据包按照正确的顺序重新组装,保证了数据的顺序性,即使数据包在网络中经过不同的路径传输,最终也能以正确的顺序到达接收方。
- 头部开销:
- TCP 的头部通常为 20 字节,包含序列号、确认应答号、窗口大小、数据偏移量、标志位等信息,这些信息用于保证数据的可靠性和进行流量控制。
- 应用场景:
- 适用于对数据可靠性和完整性要求较高的应用,例如文件传输(FTP、HTTP)、电子邮件(SMTP、POP3)、远程登录(SSH、Telnet)等。这些应用不容许数据丢失或乱序,需要确保数据准确无误地到达目的地。
UDP(User Datagram Protocol):
- 连接性:
- UDP 是一种无连接的协议。发送方在发送数据前不需要与接收方建立连接,只需要知道接收方的 IP 地址和端口号,就可以直接发送数据。
- 因此,使用 UDP 发送数据的速度更快,但没有像 TCP 那样的连接建立和关闭过程,也就减少了额外的开销和延迟。
- 可靠性:
- UDP 不提供可靠性保证。如果数据在传输过程中丢失、损坏或乱序,UDP 不会进行重传,接收方也不会得到通知。
- 对于一些对实时性要求高、能够容忍一定程度的数据丢失的应用,这种特性可以换取更快的传输速度和更低的延迟。
- 数据传输顺序:
- UDP 不保证数据的顺序性。由于没有序列号和确认应答机制,数据包可能会乱序到达接收方,接收方接收到的数据包顺序可能与发送方发送的顺序不同。
- 头部开销:
- UDP 的头部相对简洁,只有 8 字节,包含源端口、目的端口、长度和校验和等信息,传输效率相对较高。
- 应用场景:
- 适用于对实时性要求高的应用,如实时视频会议(Skype、Zoom 等)、在线游戏、流媒体(实时视频流、音频流)等。这些应用更注重数据的实时传输,少量的数据丢失不会对整体体验产生严重影响,但对延迟非常敏感,需要尽快将数据发送出去。
总结:
- TCP 以可靠性为核心,通过复杂的连接管理和确认机制保证数据的准确传输,适用于可靠性优先的场景;而 UDP 以速度和低延迟为优势,适合对实时性要求高、对数据丢失有一定容忍度的场景。在选择使用 TCP 还是 UDP 时,需要根据具体的应用需求和网络环境来决定。例如,在物联网设备中,如果需要可靠的数据采集和控制,可能会选择 TCP;而对于实时的传感器数据传输,为了减少延迟,可能会使用 UDP。
TCP例程
首先将两块ESP32一个作为服务器端,一个作为客户端。
先讲服务器端的代码
// 这个是一个简单的服务端,用于接收客户端发送的字符串,并回复一个固定的字符串 | |
#include <WiFi.h> | |
#include <WiFiClient.h>// 引入 WiFiClient 类 | |
#include <WiFiServer.h>// 引入 WiFiServer 类,服务器端必须有 | |
// 定义 Wi-Fi 网络的 SSID 和密码 | |
const char *ssid = "LEDC"; | |
const char *password = "12344567"; | |
// 定义服务器监听的端口号 | |
const int serverPort = 6700; | |
WiFiServer server(serverPort);// 创建服务器对象 | |
WiFiClient client; // 创建客户端对象 | |
void setup() | |
{ | |
Serial.begin(115200);//串口调试 | |
// 连接到 Wi-Fi 网络 | |
WiFi.disconnect(true); // 先断开之前的 Wi-Fi 连接 | |
WiFi.begin(ssid, password); // 连接到 我的手机热点 | |
delay(1000); | |
while (WiFi.status() != WL_CONNECTED) | |
{ | |
delay(1000); | |
Serial.println("Connecting to WiFi..."); | |
} | |
Serial.println("Connectedヾ(≧▽≦*)o"); | |
// 启动服务器 | |
server.begin(); | |
Serial.println("Server started"); | |
Serial.print("IP Address: "); | |
Serial.println(WiFi.localIP());// 获取手机热点分配给ESP32的IP地址并打印到串口 | |
delay(2000); | |
} | |
void loop() | |
{ | |
// 检查是否有新的客户端连接 | |
client = server.available(); | |
if (client) | |
{ | |
Serial.println("Client connected"); | |
while (client.connected()) | |
{ | |
if (client.available()) | |
{ | |
// 读取客户端发送的字符串,一直读取直到遇到换行符 | |
String receivedString = client.readStringUntil('\n'); | |
Serial.println("Rec from client: " + receivedString); | |
// 发送响应字符串 | |
client.println("Message received by Server"); | |
} | |
} | |
Serial.println("Client disconnected"); | |
client.stop(); | |
} | |
} |
接下来是是客户端的代码
#include <WiFi.h> | |
#include <WiFiClient.h> | |
//客户端就不需要WiFiServer库了 | |
// 定义 Wi-Fi 网络的 SSID 和密码 | |
const char* ssid = ""; | |
const char* password = ""; | |
// 定义服务器的 IP 地址和端口号 | |
const char* serverIP = "这个需要先看看服务器端串口调输出的IP地址是多少"; | |
const int serverPort = 6700; //双方通信,监听的端口号要相同 | |
WiFiClient client; | |
void setup() { | |
Serial.begin(115200); | |
delay(1000); | |
// 连接到 Wi-Fi 网络 | |
WiFi.begin(ssid, password); | |
while (WiFi.status()!= WL_CONNECTED) { | |
delay(1000); | |
Serial.println("Connecting to WiFi..."); | |
} | |
Serial.println("Connectedヾ(≧▽≦*)o"); | |
// 尝试连接到服务器 | |
if (!client.connect(serverIP, serverPort)) { | |
Serial.println("Connection to server failed"); | |
return; | |
} | |
Serial.println("Connected to server"); | |
} | |
void loop() { | |
if (client.connected()) { | |
// 发送字符串 | |
client.println("Elaina is fine, very fine."); | |
Serial.println("String sent: Elaina is fine, very fine."); | |
// 检查是否有服务器的响应 | |
if (client.available()) { | |
String response = client.readStringUntil('\n'); | |
Serial.println("Received from server: " + response); | |
} | |
} else { | |
Serial.println("Not connected to server"); | |
} | |
// 可以根据需要调整发送间隔 | |
delay(3000); | |
} |
关注灵活就业新业态,关注公账号:贤才宝(贤才宝https://www.51xcbw.com)
相关文章:
WIFI连接与通信
ESP32-S3 支持 2.4 GHz 的 Wi-Fi 4(802.11n)标准,提供高达 150 Mbps 的数据传输速率。它支持 STA(Station)模式、AP(Access Point)模式和 Wi-Fi 直连(Wi-Fi Direct)模式&…...
Elixir语言的数据库编程
Elixir语言的数据库编程 介绍 Elixir是一种基于Erlang虚拟机(BEAM)的函数式编程语言,特别适用于构建可扩展和可维护的系统。它结合了Erlang的卓越并发特性和Ruby的易用性,因此在Web开发和实时应用中越来越受到欢迎。伴随着Elixi…...
python中Mako用法
Mako 是一个轻量级的 Python 模板库,它以其高效的代码生成和灵活的表达能力著称,常用于 Web 开发和静态文件生成。以下是对 Mako 的核心 API介绍。 1. 安装 Mako 首先安装 Mako: pip install mako2. 基本用法 Mako 的核心在于 Template 类…...
SMS4J - 一个聚合各种短信API商的工具
众所周知,在我们日常的项目开发中,短信验证码发送是一个必不可少的环节。 特别是如今手机互联网时代,基本所有东西都跟手机强绑定,所有的安全验证都离不开验证码这一环节。 所以对于一个系统来说,发送短信验证码成为…...
BEVFusion论文阅读
1. 简介 融合激光雷达和相机的信息已经变成了3D目标检测的一个标准,当前的方法依赖于激光雷达传感器的点云作为查询,以利用图像空间的特征。然而,人们发现,这种基本假设使得当前的融合框架无法在发生 LiDAR 故障时做出任何预测&a…...
【总结盘点类】2024,一场关于海量数据治理以及合理建模的系列写作
目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线,也是2025要继续的主线 1.今年的创作路线 今年的写作内…...
【25考研】考清华的软件工程专业的研究生需要准备什么?
清华软件复试竞争一样很激烈!建议同学认真复习! 关于项目的注意事项先来一些总结: 千万别照抄开源项目 开源项目是一个很好的参考,但直接搬过来就没啥意义啦。我们可以根据开源项目学习它的技术架构和关键点,然后结…...
网络编程-UDP套接字
文章目录 UDP/TCP协议简介两种协议的联系与区别Socket是什么 UDP的SocketAPIDatagramSocketDatagramPacket 使用UDP模拟通信服务器端客户端测试 完整测试代码 UDP/TCP协议简介 两种协议的联系与区别 TCP和UDP其实是传输层的两个协议的内容, 差别非常大, 对于我们的Java来说, …...
EXCEL的一些用法记录
按某个分隔符进行拆分多列 【数据】- 【分列】 多列调整成多行 复制 - 粘贴 - 选择【转置】 部分内容替换 SUBSTITUTE()函数 ,固定内容 加“”...
不使用 JS 纯 CSS 获取屏幕宽高
前言 在现代前端开发中,获取屏幕的宽度和高度通常依赖于 JavaScript。然而现代 CSS 也可以获取到屏幕的宽高,通过自定义属性(CSS Variables)和一些数学函数来实现这一目标。本文将详细解析如何使用 CSS 的 property 规则和一些数…...
Node.js 完全教程:从入门到精通
Node.js 完全教程:从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…...
可替代CentOS 7的Linux操作系统选型
可替代CentOS 7的其他Linux操作系统选型 一、背景介绍二、主流操作系统调研2.1 企业级产品:Red Hat Enterprise Linux/CentOS Stream2.1.1 Red Hat Enterprise Linux2.1.2 CentOS Stream2.2 其他发行版:Debian/Ubuntu2.3 开源产品:AlmaLinux / RockyLinux2.3.1 AlmaLinux2.3…...
【ESP32】ESP32连接JY61P并通过WIFI发送给电脑
前言 手头上有个ESP32,发现有wifi功能,希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器;需要安装ESP32的开发板管理器; 2.电脑接受数据是基于python的; 1. ESP32 连接手机WIFI #include <…...
【JSqlParser】Java使用JSqlParser解析SQL语句总结
简述 Java解析SQL语句有很多工具都可以做到,比如Mybatis、Druid、目前用来用去最全面的仍然是Jsqlparser,它是一个Github上的开源项目,JSqlParser是一个用于解析SQL语句的Java库,它可以帮助开发者分析和操作SQL语句的结构。无论是…...
TCP断开通信前的四次挥手(为啥不是三次?)
1.四次握手的过程 客户端A发送 FIN(终止连接请求) A:我要断开连接了(FIN)。A进入FIN_WAIT_1状态,表示请求断开,等待对方确认。 服务器B回复 ACK(确认断开请求,但还未准备…...
解决用 rm 报bash: /usr/bin/rm: Argument list too long错
但目录里面文件过多用 rm 报bash: /usr/bin/rm: Argument list too long错时怎么办: 看看以下操作记录 rootmcu:/# cd /tmp rootmcu:/tmp# rm -f /tmp/chunk* bash: /usr/bin/rm: Argument list too long rootmcu:/tmp# rm -rf /tmp/chunk* bash: /usr/bin/rm: Arg…...
AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布
1、OpenAI 的安全疏忽:ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞:攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求,利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…...
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CI/CD) 目录 项目初始化:构建一个简单的 Node.js 应用设置 Docker 环境:容器化你的应用配置 CI/CD:自动化构建与部署上线前的最后检查:…...
哈希桶(开散列)
文章目录 前言实现插入put方法实现get方法实现泛型类哈希桶 前言 哈希桶用来解决哈希冲突,牺牲空间换取时间。 通过数组和链表来实现哈希桶 public class Node{public int key;public int value;public Node next;public Node(int key,int value){this.keykey;this…...
DEBERTA:具有解耦注意力机制的解码增强型BERT
摘要 近年来,预训练神经语言模型的进展显著提升了许多自然语言处理(NLP)任务的性能。本文提出了一种新的模型架构DeBERTa(具有解耦注意力机制的解码增强型BERT),通过两种新技术改进了BERT和RoBERTa模型。第…...
WWW2025 多模态对话系统意图识别挑战赛方案总结
WWW2025 多模态对话系统意图识别挑战赛方案 代码实现:https://github.com/klayc-gzl/incent_internvl_2.5_8b 最终成绩: 大赛背景 互联网已成为提供客户服务的主要沟通渠道。网络客户服务面临的一个关键挑战是服务对话中多模态意图的高效识别。通过利…...
渗透测试--攻击常见的Web应用
本文章咱主要讨论,常见Web应用的攻击手法,其中并不完全,因为Web应用是在太多无法囊括全部,但其中的手法思想却值得我们借鉴,所以俺在此做了记录,希望对大家有帮助!主要有以下内容: 1…...
w173疫苗发布和接种预约系统
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
常用的跨域方案有哪些?
在前端开发中,跨域(Cross-Origin)是一个常见问题,通常是由于浏览器的同源策略(Same-Origin Policy)限制导致的。为了解决跨域问题,前端开发者可以采用多种方案。 1. CORS(跨域资源共…...
JS通过ASCII码值实现随机字符串的生成(可指定长度以及解决首位不出现数值)
在之前写过一篇“JS实现随机生成字符串(可指定长度)”,当时写的过于简单和传统,比较粗放。此次针对此问题,对随机生成字符串的功能进行优化处理,对随机取到的字符都通过程序自动来完成。 在写之前ÿ…...
IoTDB 1.2 升级 1.3 后 Pipe 插件失效
问题现象 客户使用 Pipe 功能将数据从 IoTDB 系统传输至 Kafka 集群,以便进行后续的数据处理与分析。在从企业版 1.2.5 升级至企业版 1.3.3.6 后,客户反馈 Kafka 的 consumer 无法接收到数据。经检查日志,发现存在以下报错: 问题…...
基于STM32的智能门锁安防系统(开源)
目录 项目演示 项目概述 硬件组成: 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…...
浅谈云端编辑器,分析其亮点与不足
浅谈云端编辑器,分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析: 1. 左侧题目筛选栏 层次结构清晰:左侧栏展示了一个层级结构,题目按主题分…...
Python字符串引号的嵌套问题
目录 1、使用不同类型的引号 2、使用转义字符 3、使用三重引号 4、嵌套三重引号 5、注意事项 在Python中,字符串可以使用单引号 () 或双引号 (") 来定义,但是如果我们要定义的字符串内也包含引号,字符串界定符的不正确使用会导致语法…...
latex如何让目录后面有点
使用前效果 在导言区引入以下代码 \usepackage[subfigure]{tocloft} \usepackage{subfigure} % 设置目录中 section 条目前导符号为连续点 \renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}}编译后的效果...
【力扣系列题目】不同路径 组合总和 最大连续1个数 打家劫舍{持续更新中...}
文章目录 不同路径不同路径[不同路径 II](https://leetcode.cn/problems/unique-paths-ii/)[不同路径 III](https://leetcode.cn/problems/unique-paths-iii/) 组合总和组合总和 【无重复数字无限制选择次数】[组合总和 II](https://leetcode.cn/problems/combination-sum-ii/)…...
方法建议ChatGPT提示词分享
方法建议 ChatGPT能够根据您的具体需求提供针对性的建议,帮助您选择最合适的研究方法。通过清晰的提示,ChatGPT可以精准地为您提供最契合的研究方案。此外,它还能协助您将这些方法灵活地应用于新的研究环境,提出创新的技术解决方案…...
Cursor的详细使用指南
以下是一份关于 Cursor 的详细使用指南: 一、安装与设置 下载与安装: 首先,访问 Cursor 的官方网站,根据你的操作系统(Windows、Mac 或 Linux)下载相应的安装程序。运行安装程序,按照屏幕上的提…...
Python----Python高级(正则表达式:语法规则,re库)
一、正则表达式 1.1、概念 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、 regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母࿰…...
电脑如何访问手机文件?
手机和电脑已经深深融入了我们的日常生活,无时无刻不在为我们提供服务。除了电脑远程操控电脑外,我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么,如何使用电脑远程访问手机上的文件呢? 如何使用电脑访问手机文件…...
计算最接近的数
计算最接近的数 真题目录: 点击去查看 E B卷 100分题型 题目描述 给定一个数组X和正整数K,请找出使表达式: X[i] - X[i 1] - … - X[i K - 1] 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 i. 其中&…...
Ubuntu离线docker compose安装DataEase 2.10.4版本笔记
1、先准备一个可以正常上网的相同版本的Ubuntu系统,可以使用虚拟机。Ubuntu系统需要安装好docker compose或docker-compose 2、下载dataease-online-installer-v2.10.4-ce.tar在线安装包,解压并执行install.sh进行安装和启动 3、导出docker镜像 sudo d…...
C#使用WMI获取控制面板中安装的所有程序列表
C#使用WMI获取控制面板中安装的所有程序列表 WMI 全称Windows Management Instrumentation,Windows Management Instrumentation是Windows中用于提供共同的界面和对象模式以便访问有关操作系统、设备、应用程序和服务的管理信息。如果此服务被终止,多数基于 Windo…...
WPF2-1在xaml为对象的属性赋值.md
1. AttributeValue方式 1.1. 简单属性赋值1.2. 对象属性赋值 2. 属性标签的方式给属性赋值3. 标签扩展 (Markup Extensions) 3.1. StaticResource3.2. Binding 3.2.1. 普通 Binding3.2.2. ElementName Binding3.2.3. RelativeSource Binding3.2.4. StaticResource Binding (带参…...
社区版Dify实现文生视频 LLM+ComfyUI+混元视频
社区版Dify实现文生视频 LLMComfyUI混元视频 一、 社区版Dify实现私有化混元视频效果二、为什么社区版Dify可以在对话框实现文生视频?LLMComfyUI混元视频 实现流程图(重点)1. 文生视频模型支持ComfyUI2. ComfyUI可以轻松导出API实现封装3. Di…...
QT调用OpenSceneGraph
OSG和osgQt编译教程,实测通过 一、下载OpenSceneGraph OpenSceneGraphhttps://github.com/openscenegraph/OpenSceneGraph 二、使用CMAKE编译OpenSceneGraph 1.打开cmake,配置源代码目录 2. CMAKE_INSTALL_PREFIX设置为install文件夹,生…...
Qt基础项目篇——Qt版Word字处理软件
一、核心功能 本软件为多文档型程序,界面是标准的 Windows 主从窗口 拥有:主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西,均在下图了。 开发该软件,主要分为下面三个阶段 1)界面设计开发 多窗口 MDI 程序…...
【Postgres_Python】使用python脚本批量创建和导入多个PG数据库
之前批量创建和导入数据库分为2个python脚本进行,现整合优化代码合并为一个python脚本,可同步实现数据库的创建和数据导入。之前的文章链接: 【Postgres_Python】使用python脚本批量创建PG数据库 【Postgres_Python】使用python脚本将多个.S…...
消息队列篇--原理篇--RabbitMQ和Kafka对比分析
RabbitMQ和Kafka是两种非常流行的消息队列系统,但它们的设计哲学、架构特点和适用场景存在显著差异。对比如下。 1、架构设计 RabbitMQ: 基AMQP协议:RabbitMQ是基于AMQP(高级消息队列协议)构建的,支持多…...
俄语画外音的特点
随着全球媒体消费的增加,语音服务呈指数级增长。作为视听翻译和本地化的一个关键方面,画外音在确保来自不同语言和文化背景的观众能够以一种真实和可访问的方式参与内容方面发挥着重要作用。说到俄语,画外音有其独特的特点、挑战和复杂性&…...
【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格
音乐流派分类 – 自动化分类不同音乐风格 在本教程中,我们将开发一个深度学习项目,用于自动化地从音频文件中分类不同的音乐流派。我们将使用音频文件的频率域和时间域低级特征来分类这些音频文件。 对于这个项目,我们需要一个具有相似大小和相似频率范围的音频曲目数据集…...
Keil5 IDE使用笔记
1 Keil生成bin文件 $K\ARM\ARMCLANG\bin\fromelf.exe --bin --outputL/L.bin !L $K: 表示 Keil 5的安装路径 L: 表示 工程名 !L: 表示 工程名.arf 后缀的文件 可根据实际需要修改 --output 的值调整生成的bin文件的存放路径。 2 下载程序报错 No ST-LINK detected Error: Fla…...
自动化办公|使用Python重命名并移动文件到对应文件夹
在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求。例如,我们有一个包含多个文件的目录,文件名的首字符表示文件应该存放在哪个文件夹中。我们可以使用Python脚本来自动完成这个任务,实现文件的分…...
【全栈】SprintBoot+vue3迷你商城(5)
【全栈】SprintBootvue3迷你商城(5) 上一期我们基本完成了与用户相关的接口,而这些接口都是用户才能干的事情,如果你没登录,那么这些接口功能你都不能实现。 那么如何做到这一步呢? 1.Token 作用 身份…...
Java 并发编程:Java 中的乐观锁与 CAS
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 025 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...