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

06-基础例程6

基础例程6

01、WIFI实验—WebServer

实验介绍

​ 连接路由器上网是我们每天都做的事情,日常生活中只需要知道路由器的账号和密码,就可以使用手机或电脑连接到路由器,然后上网。

​ 连接路由器,将ESP32的IP地址等信息通过shell控制台输出显示

​ 模块包括热点AP模式客户端STA模式

​ 热点AP模式是指电脑或手机端直接连接ESP32发出的热点实现连接,如果电脑连接模块AP热点,这样电脑就不能上网。

​ 因此在使用电脑端和模块进行网络通信时,一般情况下使用STA模式。也就是电脑和设备同时连接到相同网段的路由器上。

硬件设计

​ 内置WIFI功能,不需要额外连接

软件设计

/* 深圳市普中科技有限公司(PRECHIN 普中)技术支持:www.prechin.net* * 实验名称:WIFI实验--WebServer* * 接线说明:LED模块-->ESP32 IO(D1)-->(15)* * 实验现象:程序下载成功后,手机连接的WIFI需和ESP32连接的WIFI处于同一频段(比如192.168.1.xx),然后在手机网页输入串口控制台输出的本机IP地址即可进入手机端网页控制板子LED。* * 注意事项:*/#include "public.h"
#include <WiFi.h>//路由器账号和密码
const char* ssid     = "uestc-2019";
const char* password = "wyj1347863";WiFiServer server(80);//LED控制引脚
#define led_pin   15//WIFI连接路由器
void wifi_connect(void)
{Serial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected.");Serial.println("IP address: ");Serial.println(WiFi.localIP());
}void setup(){Serial.begin(115200);pinMode(led_pin, OUTPUT);      // set the LED pin modedelay(10);wifi_connect();server.begin();}void loop(){WiFiClient client = server.available();   // listen for incoming clientsif (client) {                             // if you get a client,Serial.println("New Client.");           // print a message out the serial portString currentLine = "";                // make a String to hold incoming data from the clientwhile (client.connected()) {            // loop while the client's connectedif (client.available()) {             // if there's bytes to read from the client,char c = client.read();             // read a byte, thenSerial.write(c);                    // print it out the serial monitorif (c == '\n') {                    // if the byte is a newline character// if the current line is blank, you got two newline characters in a row.// that's the end of the client HTTP request, so send a response:if (currentLine.length() == 0) {// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)// and a content-type so the client knows what's coming, then a blank line:client.println("HTTP/1.1 200 OK");client.println("Content-type:text/html");client.println();// the content of the HTTP response follows the header:client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 15 on.<br>");client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 15 off.<br>");// The HTTP response ends with another blank line:client.println();// break out of the while loop:break;} else {    // if you got a newline, then clear currentLine:currentLine = "";}} else if (c != '\r') {  // if you got anything else but a carriage return character,currentLine += c;      // add it to the end of the currentLine}// Check to see if the client request was "GET /H" or "GET /L":if (currentLine.endsWith("GET /H")) {digitalWrite(led_pin, HIGH);               // GET /H turns the LED on}if (currentLine.endsWith("GET /L")) {digitalWrite(led_pin, LOW);                // GET /L turns the LED off}}}// close the connection:client.stop();Serial.println("Client Disconnected.");}
}

实验现象

Connecting to uestc-2019
..
WiFi connected.
IP address: 
192.168.0.102
New Client.
GET /H HTTP/1.1
Host: 192.168.0.102
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.0.102/H
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6Client Disconnected.
New Client.
GET /favicon.ico HTTP/1.1
Host: 192.168.0.102
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203
Accept: image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.0.102/L
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6Client Disconnected.

02、WIFI实验—Socket

实验介绍

​ 01章节学习了使用ESP32连接到无线路由器。现在学习Socket通信。

​ 在这里,我们尝试以最容易理解的方式讲述Socket。

网络通信的分层

在这里插入图片描述

​ TCP/IP模型的传输层和应用层,传输层比较熟悉的是TCP和UDP,UDP协议基本没有对IP层的数据进行任何的处理。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传输。应用层中网页常用的则是HTTP

​ 网络通信时最基础依赖于IP和端口的,HTTP一般情况下默认使用端口80。多人连接问题。

​ 应用层HTTP通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要同一个TCP协议端口传输数据。为了区分不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)。应用层和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。


​ 其实,Socket抽象层介于传输层和应用层之间,跟TCP/IP并没有什么联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。

在这里插入图片描述
套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议(通常是TCP或UDP),本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

​ Socket的出现只是为了更方便的使用TCP/IP协议,简单理解就是其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create、listen、accept、connect、read和write等,以下为通信流程:

在这里插入图片描述

​ 一个Socket通信需要一个服务器端和一个客户端。本例中,ESP32开发板为客户端,电脑使用网络调试助手作为服务器端,双方使用TCP协议传输。对于客户端,则只需要知道电脑端的IP和端口即可简历连接。

软件设计

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN普中实验名称:WIFI实验-Socket通信
接线说明:LED模块-->ESP32 IO(D1)-->(15)实验现象:程序下载成功后,软件shell控制台输出当前IP、子网掩码、网关的地址信息,在网络调试助手上连接成功后,可数据收发。注意事项:ESP32 WIFI作为客户端连接路由器热点,然后电脑也连接路由器,此时可在电脑端使用网络调试助手,设置:协议类型:TCP Server,本机主机地址:电脑端IP地址,本机主机端口:10000'''#导入Pin模块
from machine import Pin
import time
import network
import usocket#定义LED控制对象
led1=Pin(15,Pin.OUT)#路由器WIFI账号和密码
ssid="uestc-2019"
password="wyj1347863"#服务器地址和端口
dest_ip="192.168.0.100"
dest_port=10000#WIFI连接
def wifi_connect():wlan=network.WLAN(network.STA_IF)  #STA模式wlan.active(True)  #激活start_time=time.time()  #记录时间做超时判断if not wlan.isconnected():print("conneting to network...")wlan.connect(ssid,password)  #输入WIFI账号和密码while not wlan.isconnected():led1.value(1)time.sleep_ms(300)led1.value(0)time.sleep_ms(300)#超时判断,15 秒没连接成功判定为超时if time.time()-start_time>15:print("WIFI Connect Timeout!")breakreturn Falseelse:led1.value(0)print("network information:", wlan.ifconfig())return True#程序入口
if __name__=="__main__":if wifi_connect():socket=usocket.socket()  #创建socket连接addr=(dest_ip,dest_port)  #服务器IP地址和端口socket.connect(addr)socket.send("Hello PRECHIN")while True:text=socket.recv(128)  #单次最多接收128字节if text==None:passelse:print(text)socket.send("I get:"+text.decode("utf-8"))time.sleep_ms(300)

shell的窗口

network information: ('192.168.0.102', '255.255.255.0', '192.168.0.1', '192.168.0.1')
b'12345678\r\n'
b'123456'

03、WIFI实验—MQTT

​ 前面学习了Socket通信,当服务器和客户端建立起连接时,就可以相互通信。在互联网应用,大多使用WebSocket接口来传输数据。

​ 在物联网中,如果是海量的数据,就需要用到MQTT(消息队列遥测传输)协议。

实验介绍

​ MQTT是IBM于1999年提出的,和HTTP一样属于应用层,工作在TCP/IP协议族上,通常还会调用socket接口。是一个基于客户端-服务器的消息发布/订阅传输协议。其特点是协议是轻量、简单、开放和易于实现的,这些特点使得它适用范围非常广泛。

​ 总结下来MQTT有以下的优势/特性:

  • 异步消息协议
  • 面向长连接
  • 双向数据传输
  • 协议轻量级
  • 被动数据获取

在这里插入图片描述

​ 从上图可看到,MQTT通信的角色有两个,分别是服务器和客户端。服务器只负责中转数据,不做存储;客户端可以是信息发送者或订阅者,也可以同时是两者。如下图所示。

在这里插入图片描述

​ 确定了角色后,数据如何传输呢?下图是MQTT最基本的数据帧格式,例如温度传感器发布了主题“Temperature”编号,消息是“25”(表示温度)。那么所有订阅了这个主题编号的客户端(手机应用)就会收到相关信息,从而实现通信。

在这里插入图片描述

​ 由于特殊的发布/订阅机制,服务器不需要存储数据(当然也可以在服务器的设备上建立一个客户端来订阅保存信息),因此非常适合海量设备的传输。

在这里插入图片描述

硬件设计

软件设计

分为发布者和订阅者

发布者

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN普中实验名称:WIFI实验-MQTT通信(发布者)
接线说明:LED模块-->ESP32 IO(D1)-->(15)实验现象:程序下载成功后,软件shell控制台输出当前IP、子网掩码、网关的地址信息,MQTT在线助手,输入网址:http://www.tongxinmao.com/txm/webmqtt.php#进入,按默认设置,选择连接,然后在Subscribe订阅主题中选择程序中设置的Topic主题:/public/pz_esp32/1注意事项:ESP32 WIFI作为客户端连接路由器热点,然后电脑也连接路由器,此时可连接成功输出信息'''#导入Pin模块
from machine import Pin
import time
from machine import Timer
import network
from simple import MQTTClient#定义LED控制对象
led1=Pin(15,Pin.OUT)#路由器WIFI账号和密码
ssid="uestc-2019"
password="wyj1347863"#WIFI连接
def wifi_connect():wlan=network.WLAN(network.STA_IF)  #STA模式wlan.active(True)  #激活start_time=time.time()  #记录时间做超时判断if not wlan.isconnected():print("conneting to network...")wlan.connect(ssid,password)  #输入WIFI账号和密码while not wlan.isconnected():led1.value(1)time.sleep_ms(300)led1.value(0)time.sleep_ms(300)#超时判断,15 秒没连接成功判定为超时if time.time()-start_time>150:print("WIFI Connect Timeout!")breakreturn Falseelse:led1.value(0)print("network information:", wlan.ifconfig())return True#发布数据任务
def mqtt_send(tim):client.publish(TOPIC, "Hello PRECHIN")#程序入口
if __name__=="__main__":if wifi_connect():SERVER="mq.tongxinmao.com"PORT=18830            #通信猫的端口CLIENT_ID="PZ-ESP32"  #客户端IDTOPIC="/public/pz_esp32/1"  #TOPIC名称client = MQTTClient(CLIENT_ID, SERVER, PORT)client.connect()#开启RTOS定时器,周期 1000ms,执行MQTT通信接收任务tim = Timer(0)tim.init(period=1000, mode=Timer.PERIODIC,callback=mqtt_send)

ESP32作为客户端,发布者

电脑作为客户端,订阅者

调试软件

在这里插入图片描述

shell

在这里插入图片描述

订阅者

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN普中实验名称:WIFI实验-MQTT通信(订阅者)
接线说明:LED模块-->ESP32 IO(D1)-->(15)实验现象:程序下载成功后,软件shell控制台输出当前IP、子网掩码、网关的地址信息,MQTT在线助手,输入网址:http://www.tongxinmao.com/txm/webmqtt.php#进入,按默认设置,选择连接,然后在Publish发布主题中选择程序中设置的Topic主题:/public/pz_esp32/1,设置要发送的信息,点击发布,在Shell控制台即可输出主题和消息注意事项:ESP32 WIFI作为客户端连接路由器热点,然后电脑也连接路由器,此时可连接成功输出信息'''#导入Pin模块
from machine import Pin
from machine import Timer
import time
import network
from simple import MQTTClient#定义LED控制对象
led1=Pin(15,Pin.OUT)#路由器WIFI账号和密码
ssid="uestc-2019"
password="wyj1347863"#WIFI连接
def wifi_connect():wlan=network.WLAN(network.STA_IF)  #STA模式wlan.active(True)  #激活start_time=time.time()  #记录时间做超时判断if not wlan.isconnected():print("conneting to network...")wlan.connect(ssid,password)  #输入WIFI账号和密码while not wlan.isconnected():led1.value(1)time.sleep_ms(300)led1.value(0)time.sleep_ms(300)#超时判断,15 秒没连接成功判定为超时if time.time()-start_time>150:print("WIFI Connect Timeout!")breakreturn Falseelse:led1.value(0)print("network information:", wlan.ifconfig())return True#设置 MQTT 回调函数,有信息时候执行
def mqtt_callback(topic,msg):print("topic: {}".format(topic))print("msg: {}".format(msg))#接收数据任务
def mqtt_recv(tim):client.check_msg()#程序入口
if __name__=="__main__":if wifi_connect():SERVER="mq.tongxinmao.com"PORT=18830CLIENT_ID="PZ-ESP32"  #客户端IDTOPIC="/public/pz_esp32/1"  #TOPIC名称client = MQTTClient(CLIENT_ID, SERVER, PORT)  #建立客户端client.set_callback(mqtt_callback)  #配置回调函数client.connect()client.subscribe(TOPIC)  #订阅主题#开启RTOS定时器,周期 300ms,执行MQTT通信接收任务tim = Timer(0)tim.init(period=300, mode=Timer.PERIODIC,callback=mqtt_recv)

ESP32作为客户端的订阅者,订阅主题

电脑作为客户端的发布者,发布主题

  • 调试软件

在这里插入图片描述

shell界面

在这里插入图片描述

04、WIFI实验—手机控制LED

软件设计

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN普中实验名称:WIFI实验-手机控制LED
接线说明:LED模块-->ESP32 IO(D1)-->(15)实验现象:程序下载成功后,手机连接的WIFI需和ESP32连接的WIFI处于同一频段(比如192.168.1.xx),然后在手机网页输入Shell控制台输出的本机IP地址即可进入手机端网页控制板子LED注意事项:ESP32作为服务器,手机或电脑作为客户端'''#导入Pin模块
from machine import Pin
import time
import network
import socket#定义LED控制对象
led1=Pin(15,Pin.OUT,Pin.PULL_DOWN)#连接的WIFI账号和密码
ssid = "uestc-2019"
password = "wyj1347863"#WIFI连接
def wifi_connect():wlan=network.WLAN(network.STA_IF)  #STA模式wlan.active(True)  #激活if not wlan.isconnected():print("conneting to network...")wlan.connect(ssid,password)  #输入 WIFI 账号密码while not wlan.isconnected():led1.value(1)time.sleep_ms(300)led1.value(0)time.sleep_ms(300)led1.value(0)return Falseelse:led1.value(0)print("network information:", wlan.ifconfig())return True#网页数据
def web_page():if led1.value() == 0:gpio_state="OFF"else:gpio_state="ON"html = """<html><head> <title>ESP32 LED control</title> <meta name="viewport" content="width=device-width, initial-scale=1"><link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}.button2{background-color: #4286f4;}</style></head><body> <h1>ESP32 LED control</h1> <p>GPIO state: <strong>""" + gpio_state + """</strong></p><p><a href="/?led=on"><button class="button">ON</button></a></p><p><a href="/?led=off"><button class="button button2">OFF</button></a></p></body></html>"""return html#程序入口
if __name__=="__main__":if wifi_connect():#SOCK_STREAM表示的是TCP协议,SOCK_DGRAM表示的是UDP协议my_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #创建socket连接# 将socket对象绑定ip地址和端口号my_socket.bind(('', 80))# 相当于电话的开机 括号里的参数表示可以同时接收5个请求my_socket.listen(5)while True:# 进入监听状态,等待别人链接过来,有两个返回值,#一个是对方的socket对象,一个是对方的ip以及端口client, addr = my_socket.accept()print('Got a connection from %s' % str(addr))# recv表示接收,括号里是最大接收字节request = client.recv(1024)request = str(request)print('Content = %s' % request)led_on = request.find('/?led=on')led_off = request.find('/?led=off')if led_on == 6:print('LED ON')led1.value(1)if led_off == 6:print('LED OFF')led1.value(0)response = web_page()client.send('HTTP/1.1 200 OK\n')client.send('Content-Type: text/html\n')client.send('Connection: close\n\n')client.sendall(response)client.close()

实验现象

在这里插入图片描述

网页端

在这里插入图片描述

相关文章:

06-基础例程6

基础例程6 01、WIFI实验—WebServer 实验介绍 ​ 连接路由器上网是我们每天都做的事情&#xff0c;日常生活中只需要知道路由器的账号和密码&#xff0c;就可以使用手机或电脑连接到路由器&#xff0c;然后上网。 ​ 连接路由器&#xff0c;将ESP32的IP地址等信息通过shell…...

【附安装包】Eplan2022安装教程

软件下载 软件&#xff1a;Eplan版本&#xff1a;2022语言&#xff1a;简体中文大小&#xff1a;1.52G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.co…...

大数据-玩转数据-Flink窗口

一、Flink 窗口 理解 在流处理应用中&#xff0c;数据是连续不断的&#xff0c;因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次&#xff0c;但是有时我们需要做一些聚合类的处理&#xff0c;例如&#xff1a;在过去的1分钟内有多少用户点击…...

【python爬虫】—豆瓣电影Top250

豆瓣电影Top250 豆瓣榜单简介需求描述Python实现 豆瓣榜单简介 豆瓣电影 Top 250 榜单是豆瓣网站上列出的评分最高、受观众喜爱的电影作品。这个榜单包含了一系列优秀的影片&#xff0c;涵盖了各种类型、不同国家和时期的电影。 需求描述 使用python爬取top250电影&#xff…...

【跟小嘉学 Rust 编程】十五、智能指针

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

Python爬虫基础之正则表达式

目录 一、什么是正则表达式&#xff1f; 二、re.compile()编译函数 三、group()获取匹配结果函数 四、常用匹配规则 4.1匹配单个字符 4.2匹配前字符次数 4.3匹配原生字符串 4.4匹配字符串开头和结尾 4.5分组匹配 五、re.match()开头匹配函数 六、re.search()全文搜索…...

【LeetCode】双指针妙解有效三角形的个数

Problem: 611. 有效三角形的个数 文章目录 题目分析讲解算法原理复杂度Code 题目分析 首先我们来分析一下本题的思路 看到题目中给出的示例 题目的意思很简单&#xff0c;就是将给到的数字去做一个组合&#xff0c;然后看看这三条边是否可以构成三角形。那判断的方法不用我说&a…...

mysql 计算两点之间距离

先说一下我们可能会用到的一些场景&#xff0c;这样同学们可以先评估&#xff0c;该篇文章是否对你有帮助&#xff01; 场景&#xff1a; 假设 美团&#xff0c;我点外卖时&#xff0c;系统会让我先进行定位&#xff0c;比如我定位在了 A 点&#xff0c;系统就会给我推荐&…...

c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码?

c语言自定义头文件是什么情况下使用&#xff1f;一般在什么情况下引用自定义的头文件&#xff1f;一般在自定义头文件中写什么代码&#xff1f; C语言自定义头文件是一种用来封装函数和变量声明的文件&#xff0c;它通常用于将一组相关的函数和变量的声明集中在一个地方&#…...

electron应用打包成功纪念一下

electron应用打包成功纪念一下&#xff0c;以前曾经行过后来打包各种报错&#xff0c;现在有空就尝试解决一下 首先安装nvm能够方便切换node版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash 顺利安装后你用nvm list查看node列表时会…...

远程办公中安全远程访问解决方案

什么是安全远程访问 安全的远程访问是一个至关重要的过程&#xff0c;可让您使用互联网从远处完全控制某人的设备。为了确保安全&#xff0c;为受保护的远程访问采取了额外的身份验证和加密措施。 为什么安全远程访问解决方案很重要 当 IT 技术人员从远处帮助人们解决计算机…...

StartUp启动框架-Android启动性能

简述 当谈论Android应用程序的启动性能时&#xff0c;StartUp启动框架是一个不可忽视的关键工具。它旨在优化应用程序的启动过程&#xff0c;确保用户在打开应用时能够迅速获得流畅、高效的体验。让我们来深入了解StartUp框架的作用和重要性&#xff0c;以及它是如何改善Andro…...

Positive Technologies:五分之四的网络攻击具有针对性

Positive Technologies 对 2023 年第二季度的相关网络威胁进行了分析。报告显示&#xff0c;自今年年初以来&#xff0c;有针对性的攻击数量增加了 10%&#xff0c;目前占 78%。专家们注意到利用漏洞的大规模攻击和大量用户个人数据的泄露。此外&#xff0c;在此期间&#xff0…...

clickhouse的另类表引擎

clickhouse常用的MergeTree引擎外&#xff0c;还有特殊的引擎 1&#xff0c;memory引擎&#xff0c;顾名思义&#xff0c;数据是存储在内存中&#xff0c;数据不会被压缩也不会倍格式化转换数据在内存中保存的形态与查询时看到的如出一辙&#xff0c;重启ck数据丢失 2&#xff…...

Uniapp新版本打包后覆盖安装,新增的页面无法跳转,需退出重新启动才可以打开的解决方案

最近写uniapp项目&#xff0c;发现一个坑&#xff0c;在新版本覆盖安装后直接打开APP&#xff0c;新增的页面竟然无法跳转&#xff0c;需要重新启动才可以正常打开&#xff0c;在网上查了很多方法&#xff0c;最终总结下来有以下几点&#xff1a; 1.看打的是debug包还是releas…...

系统架构设计高级技能 · 面向服务架构设计理论与实践

点击进入系列文章目录 系统架构设计高级技能 面向服务架构设计理论与实践 一、SOA的相关概念1.1SOA的定义1.2 业务流程与业务流程执行语言 二、SOA的发展史三、SOA与微服务的区别三、SOA的参考架构四、SOA的主要协议规范五、SOA的设计标准要求六、SOA的作用与设计原则七、SOA的…...

QT注册界面练习(信号与槽实现页面跳转)

一、注册界面练习思路以及具体代码 在完成注册页面搭建的前提下&#xff0c;通过信号与槽机制实现多组件之间的相互通信&#xff0c;实现页面跳转。 基本步骤&#xff1a; 首先&#xff0c;将注册页面的登录按钮与成功登陆信号绑定&#xff0c;当用户名与密码均匹配时&#xf…...

MySQL从入门到精通【进阶篇】之 主从复制详解

文章目录 0.前言1. 主从复制简介2. 主从复制的工作流程主从复制过程中的日志文件作用&#xff08;Binary Log&#xff09;和中继日志&#xff08;Relay Log&#xff09; 3. MySQL主从复制的配置4. 参考资料 0.前言 MySQL的主从复制和读写分离是数据库领域的基本概念&#xff0…...

vue使用qrcodejs2生成二维码

目录 概要 构建展示的vue组件qrcode.vue 组件的使用 概要 项目中用到需要展示二维码的样式&#xff0c;想到了qrcode 例如&#xff1a; 前提&#xff1a;安装包 npm install qrcodejs2 --save 构建展示的vue组件qrcode.vue <template><div style"width: …...

python注释

任何编程语言都少不了注释&#xff0c;Python也不例外&#xff0c;以下是Python注释的具体用法&#xff1a; 单行注释 Python编程语言的单行注释常以#开头&#xff0c;单行注释可以作为单独的一行放在被注释代码行之上&#xff0c;也可以放在语句或者表达式之后。 实例&…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...