【Wio Terminal】使用WiFi(3)- Wi-F的高级使用

news/2024/4/15 4:02:00/文章来源:https://blog.csdn.net/m0_60807167/article/details/136442358

使用WiFi(3)

  • Wi-F的高级使用
    • HTTPClient 的使用
      • HTTP GET
      • HTTPs GET
      • HTTP POST
      • WebServer
      • HTTP Authentication Web Server
      • DNSServer
      • mDNS
      • mDNS-SD
      • WiFiManager

Wi-F的高级使用

本节介绍了一些WiFi的高级库用法,如HTTPClient、DNSServer和WebServer库。通过实现这些库,您可以使用简单的API开发物联网项目。

请确保您已更新了最新的固件和依赖库。
在这里插入图片描述

HTTPClient 的使用

HTTPClient用于使对web服务器的HTTPGET、POST和PUT请求变得非常容易。这里有一些例子供您入门!

HTTP GET

这是一个使用HTTPClient进行简单HTTP连接并将响应打印回串行监视器的示例。
在这里插入图片描述

  • 将yourNetwork和yourPassword更改为你的WiFi ssid和密码。
  • 将代码上传到Wio Terminal。
#include <rpcWiFi.h>
#include <HTTPClient.h>const char* ssid = "yourNetwork";
const char* password =  "yourPassword";void setup() {Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) { //Check for the connectiondelay(500);Serial.println("Connecting..");}Serial.print("Connected to the WiFi network with IP: ");Serial.println(WiFi.localIP());
}void loop() {// wait for WiFi connectionif((WiFi.status() == WL_CONNECTED)) {HTTPClient http;Serial.print("[HTTP] begin...\n");// configure traged server and urlhttp.begin("http://www.example.com/index.html"); //HTTPSerial.print("[HTTP] GET...\n");// start connection and send HTTP headerint httpCode = http.GET();// httpCode will be negative on errorif(httpCode > 0) {// HTTP header has been send and Server response header has been handledSerial.printf("[HTTP] GET... code: %d\n", httpCode);// file found at serverif(httpCode == HTTP_CODE_OK) {String payload = http.getString();Serial.println(payload);}} else {Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());}http.end();}delay(5000);
}

HTTPs GET

这是使用HTTPClient库的HTTPs连接。您可以参考此向您想要访问的网站发送HTTPs GET请求!
您可以按照此链接查找网站的根CA。
在这里插入图片描述

  • 将yourNetwork和yourPassword更改为你的WiFi ssid和密码。
  • 将代码上传到Wio Terminal。
#include <rpcWiFi.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>const char* ssid = "yourNetwork";
const char* password =  "yourPassword";const char* test_root_ca = \"-----BEGIN CERTIFICATE-----\n""MIIESjCCAzKgAwIBAgINAeO0mqGNiqmBJWlQuDANBgkqhkiG9w0BAQsFADBMMSAw\n""HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs\n""U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy\n""MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg\n""U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxTzEwggEiMA0GCSqGSIb3DQEBAQUA\n""A4IBDwAwggEKAoIBAQDQGM9F1IvN05zkQO9+tN1pIRvJzzyOTHW5DzEZhD2ePCnv\n""UA0Qk28FgICfKqC9EksC4T2fWBYk/jCfC3R3VZMdS/dN4ZKCEPZRrAzDsiKUDzRr\n""mBBJ5wudgzndIMYcLe/RGGFl5yODIKgjEv/SJH/UL+dEaltN11BmsK+eQmMF++Ac\n""xGNhr59qM/9il71I2dN8FGfcddwuaej4bXhp0LcQBbjxMcI7JP0aM3T4I+DsaxmK\n""FsbjzaTNC9uzpFlgOIg7rR25xoynUxv8vNmkq7zdPGHXkxWY7oG9j+JkRyBABk7X\n""rJfoucBZEqFJJSPk7XA0LKW0Y3z5oz2D0c1tJKwHAgMBAAGjggEzMIIBLzAOBgNV\n""HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud\n""EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJjR+G4Q68+b7GCfGJAboOt9Cf0rMB8G\n""A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl\n""BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp\n""MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g\n""BDgwNjA0BgZngQwBAgIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y\n""ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAGoA+Nnn78y6pRjd9XlQWNa7H\n""TgiZ/r3RNGkmUmYHPQq6Scti9PEajvwRT2iWTHQr02fesqOqBY2ETUwgZQ+lltoN\n""FvhsO9tvBCOIazpswWC9aJ9xju4tWDQH8NVU6YZZ/XteDSGU9YzJqPjY8q3MDxrz\n""mqepBCf5o8mw/wJ4a2G6xzUr6Fb6T8McDO22PLRL6u3M4Tzs3A2M1j6bykJYi8wW\n""IRdAvKLWZu/axBVbzYmqmwkm5zLSDW5nIAJbELCQCZwMH56t2Dvqofxs6BBcCFIZ\n""USpxu6x6td0V7SvJCCosirSmIatj/9dSSVDQibet8q/7UK4v4ZUN80atnZz1yg==\n""-----END CERTIFICATE-----\n";WiFiClientSecure client;void setup() {Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) { //Check for the connectiondelay(500);Serial.println("Connecting..");}Serial.print("Connected to the WiFi network with IP: ");Serial.println(WiFi.localIP());client.setCACert(test_root_ca);
}void loop() {if(&client) {{// Add a scoping block for HTTPClient https to make sure it is destroyed before WiFiClientSecure *client is HTTPClient https;Serial.print("[HTTPS] begin...\n");if (https.begin(client, "https://www.google.com/index.html")) {  // HTTPSSerial.print("[HTTPS] GET...\n");// start connection and send HTTP headerint httpCode = https.GET();// httpCode will be negative on errorif (httpCode > 0) {// HTTP header has been send and Server response header has been handledSerial.printf("[HTTPS] GET... code: %d\n", httpCode);// file found at serverif (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {String payload = https.getString();Serial.println(payload);}} else {Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());}https.end();} else {Serial.printf("[HTTPS] Unable to connect\n");}// End extra scoping block}} else {Serial.println("Unable to create client");}Serial.println();Serial.println("Waiting 10s before the next round...");delay(10000);
}

HTTP POST

这是一个使用Wio Terminal的HTTPClient向Web服务器发送HTTP POST请求的示例。在此演示中,我们使用python在个人电脑上设置一个简单的web服务器,该服务器可以接收并响应HTTP请求。
在这里插入图片描述
Python服务器端代码

首先,我们需要在Python中使用pip安装所需的bottle库。在终端中运行以下命令以安装bottle:

pip install bottle

导入bottle后,复制以下代码并将其保存为simple-server.py。你也可以将端口更改为你喜欢的其他端口,但要确保它与Arduino端匹配。

from bottle import run, request, post@post('/')
def index():data = request.body.read()print(data)run(host='0.0.0.0', port=1880, debug=True)

Arduino代码

  • 将yourNetwork和yourPassword更改为你的WiFi ssid和密码。
  • 将代码上传到Wio Terminal。
  • 检查终端,你可以看到来自Wio Terminal的传入HTTP请求消息。
#include <rpcWiFi.h>
#include <HTTPClient.h>const char* ssid = "yourNetwork";
const char* password =  "yourPassword";// Change the following IP to your computer's IP running the server, make sure the Port also match
const char* yourLocalIp =  "http://10.0.0.233:1880/";void setup() {Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) { //Check for the connectiondelay(500);Serial.println("Connecting..");}Serial.print("Connected to the WiFi network with IP: ");Serial.println(WiFi.localIP());
}void loop() {if(WiFi.status()== WL_CONNECTED){   //Check WiFi connection statusHTTPClient http;http.begin(yourLocalIp);  //Specify destination for HTTP requesthttp.addHeader("Content-Type", "text/plain");             //Specify content-type headerint httpResponseCode = http.POST("Hello Bottle, from Wio Terminal");   //Send the actual POST requestif(httpResponseCode>0){Serial.print("HTTP Response Code: ");Serial.println(httpResponseCode);   //Print return code}else{Serial.print("Error on sending request: ");Serial.println(httpResponseCode);}http.end();  //Free resources}else{Serial.println("Error in WiFi connection");}delay(5000);  //Send a request every 5 seconds
}

WebServer

在WebServer库的帮助下,你可以在Wio Terminal上设置并运行Web服务器。通过在与Wio Terminal连接到同一网络的任何计算机上运行的浏览器访问服务器,你可以从网页上控制硬件,读取传感器的值等等!

简单 HelloServer 示例
这将在连接的网络上使用Wio Terminal设置一个简单的Web服务器。
在这里插入图片描述

  • 将yourNetwork和yourPassword更改为您的WiFi ssid和密码。
  • 将代码上传到Wio Terminal。
  • 使用浏览器从同一网络输入Wio Terminal的IP地址来访问web服务器。
#include <rpcWiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>const char *ssid = "yourNetwork";
const char *password = "yourPassword";WebServer server(80);const int led = 13;void handleRoot() {digitalWrite(led, 1);server.send(200, "text/plain", "hello from Wio Terminal!");digitalWrite(led, 0);
}void handleNotFound() {digitalWrite(led, 1);String message = "File Not Found\n\n";message += "URI: ";message += server.uri();message += "\nMethod: ";message += (server.method() == HTTP_GET) ? "GET" : "POST";message += "\nArguments: ";message += server.args();message += "\n";for (uint8_t i = 0; i < server.args(); i++) {message += " " + server.argName(i) + ": " + server.arg(i) + "\n";}server.send(404, "text/plain", message);digitalWrite(led, 0);
}void setup(void) {pinMode(led, OUTPUT);digitalWrite(led, 0);Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);// Wait for connectionwhile (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.print("Connected to ");Serial.println(ssid);Serial.print("IP address: ");Serial.println(WiFi.localIP());server.on("/", handleRoot);server.on("/inline", []() {server.send(200, "text/plain", "this works as well");});server.onNotFound(handleNotFound);server.begin();Serial.println("HTTP server started");
}void loop(void) {server.handleClient();
}

HTTP Authentication Web Server

这个示例设置了一个需要身份验证过程的Web服务器,这在某些情况下出于安全考虑可能非常有用。
在这里插入图片描述

  • 将yourNetwork和yourPassword更改为您的WiFi ssid和密码。
  • 将代码上传到Wio Terminal。
  • 使用浏览器从同一网络输入Wio Terminal的IP地址来访问Web服务器,并输入预设的用户名和密码。
#include <rpcWiFi.h>
#include <WebServer.h>const char *ssid = "yourNetwork";
const char *password = "yourPassword";WebServer server(80);const char* www_username = "admin";
const char* www_password = "password";void setup() {Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);if (WiFi.waitForConnectResult() != WL_CONNECTED) {Serial.println("WiFi Connect Failed! Rebooting...");delay(1000);NVIC_SystemReset(); // Reset Wio Terminal}server.on("/", []() {if (!server.authenticate(www_username, www_password)) {return server.requestAuthentication();}server.send(200, "text/plain", "Login OK");});server.begin();Serial.print("Open http://");Serial.print(WiFi.localIP());Serial.println("/ in your browser to see it working");
}void loop() {server.handleClient();
}

DNSServer

我们讨论了WebServer,我们使用IP地址来访问它。 但是,如果您想通过键入域名(例如www.google.com)来访问它,则需要使用DNSServer。
在这里插入图片描述

  • 使用DNSServer必须在AP模式下。
  • 引入相应的库#include <DNSServer.h>。
  • 声明DNSServer对象。
  • 使用start()方法启动DNS服务器。
  • 使用processNextRequest()方法处理来自客户端的请求。
  • 将代码上传到Wio Terminal,并将您的PC连接到DNSServer示例Wi-Fi。
  • 输入www.wioterminal.com和www.wioterminal.com/p1。
#include <rpcWiFi.h>
#include <DNSServer.h>
#include <WebServer.h>IPAddress local_IP(192, 168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);const byte DNS_PORT = 53;DNSServer dnsServer;
WebServer webserver(80);void handleRoot()
{webserver.send(200, "text/plain", "Root page accessed via domain name");
}void handleP1()
{webserver.send(200, "text/plain", "Page 1 accessed via domain name");
}void setup()
{WiFi.mode(WIFI_AP);WiFi.softAPConfig(local_IP, gateway, subnet);WiFi.softAP("DNSServer example");webserver.on("/", handleRoot);webserver.on("/p1", handleP1);dnsServer.start(DNS_PORT, "www.wioterminal.com", local_IP); //Start the DNS service, example.com is the registered domain name.webserver.begin();
}void loop()
{dnsServer.processNextRequest();webserver.handleClient();
}

mDNS

什么是Multicast DNS(mDNS)?

Multicast DNS(mDNS)协议在没有本地名称服务器的小型网络中将主机名解析为IP地址。Multicast DNS专为小型网络设计,旨在提高其用户友好性。其想法是,用户可以在秘密的局域网中连接设备而不会出现任何问题。

Install the Seeed_Arduino_rpcmDNS
下载Seeed_Arduino_rpcmDNS,并安装到Arduino

mDNS Web Server示例
这是一个在Wio Terminal上设置mDNS Web服务器的示例,以便在同一网络中连接的其他设备可以在定义的站点上浏览该Web服务器。
在这里插入图片描述

  • 将yourNetwork和yourPassword更改为你的WiFi ssid和密码。
  • 将代码上传到Wio Terminal。
  • 使用浏览器从同一网络输入http://WioTerminal.local/来访问Web服务器,并输入预设的用户名和密码。
#include <rpcWiFi.h>
#include <RPCmDNS.h>
#include <WiFiClient.h>const char* ssid     = "yourNetwork";
const char* password = "yourPassword";// TCP server at port 80 will respond to HTTP requests
WiFiServer server(80);void setup(void)
{  Serial.begin(115200);while(!Serial){;}Serial.printf("Setup Start \r\n");// Connect to WiFi networkWiFi.begin(ssid, password);Serial.println("");// Wait for connectionwhile (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.print("Connected to ");Serial.println(ssid);Serial.print("IP address: ");Serial.println(WiFi.localIP());// Set up mDNS responder:// - first argument is the domain name, in this example//   the fully-qualified domain name is "esp8266.local"// - second argument is the IP address to advertise//   we send our IP address on the WiFi networkif (!MDNS.begin("WioTerminal")) {Serial.println("Error setting up MDNS responder!");while(1) {delay(1000);}}Serial.println("mDNS responder started");// Start TCP (HTTP) serverserver.begin();Serial.println("TCP server started");// Add service to MDNS-SDMDNS.addService("http", "tcp", 80);Serial.printf("Setup Done \r\n");
}void loop(void)
{// Check if a client has connectedWiFiClient client = server.available();if (!client) {return;}Serial.println("");Serial.println("New client");// Wait for data from client to become availablewhile(client.connected() && !client.available()){delay(1);}// Read the first line of HTTP requestString req = client.readStringUntil('\r');// First line of HTTP request looks like "GET /path HTTP/1.1"// Retrieve the "/path" part by finding the spacesint addr_start = req.indexOf(' ');int addr_end = req.indexOf(' ', addr_start + 1);if (addr_start == -1 || addr_end == -1) {Serial.print("Invalid request: ");Serial.println(req);return;}req = req.substring(addr_start + 1, addr_end);Serial.print("Request: ");Serial.println(req);String s;if (req == "/"){IPAddress ip = WiFi.localIP();String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>Hello from Wio Terminal at ";s += ipStr;s += "</html>\r\n\r\n";Serial.println("Sending 200");}else{s = "HTTP/1.1 404 Not Found\r\n\r\n";Serial.println("Sending 404");}client.print(s);client.stop();Serial.println("Done with client");
}

mDNS-SD

这是一个mDNS-SD(服务发现)示例,允许您发现同一网络中的服务。

关于基于DNS的服务发现:
在这里插入图片描述

  • 将 yourNetwork 和 yourPassword 更改为您的 WiFi ssid 和密码。
  • 将代码上传到 Wio Terminal。
#include <rpcWiFi.h>
#include <RPCmDNS.h>
#include <WiFiClient.h>const char* ssid     = "yourNetwork";
const char* password = "yourPassword";// TCP server at port 80 will respond to HTTP requests
WiFiServer server(80);void setup(void)
{  Serial.begin(115200);while(!Serial){;}Serial.printf("Setup Start \r\n");// Connect to WiFi networkWiFi.begin(ssid, password);Serial.println("");// Wait for connectionwhile (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.print("Connected to ");Serial.println(ssid);Serial.print("IP address: ");Serial.println(WiFi.localIP());// Set up mDNS responder:// - first argument is the domain name, in this example//   the fully-qualified domain name is "esp8266.local"// - second argument is the IP address to advertise//   we send our IP address on the WiFi networkif (!MDNS.begin("WioTerminal")) {Serial.println("Error setting up MDNS responder!");while(1) {delay(1000);}}Serial.println("mDNS responder started");// Start TCP (HTTP) serverserver.begin();Serial.println("TCP server started");// Add service to MDNS-SDMDNS.addService("http", "tcp", 80);Serial.printf("Setup Done \r\n");
}void loop(void)
{// Check if a client has connectedWiFiClient client = server.available();if (!client) {return;}Serial.println("");Serial.println("New client");// Wait for data from client to become availablewhile(client.connected() && !client.available()){delay(1);}// Read the first line of HTTP requestString req = client.readStringUntil('\r');// First line of HTTP request looks like "GET /path HTTP/1.1"// Retrieve the "/path" part by finding the spacesint addr_start = req.indexOf(' ');int addr_end = req.indexOf(' ', addr_start + 1);if (addr_start == -1 || addr_end == -1) {Serial.print("Invalid request: ");Serial.println(req);return;}req = req.substring(addr_start + 1, addr_end);Serial.print("Request: ");Serial.println(req);String s;if (req == "/"){IPAddress ip = WiFi.localIP();String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>Hello from Wio Terminal at ";s += ipStr;s += "</html>\r\n\r\n";Serial.println("Sending 200");}else{s = "HTTP/1.1 404 Not Found\r\n\r\n";Serial.println("Sending 404");}client.print(s);client.stop();Serial.println("Done with client");
}

WiFiManager

我们已经将广为人知的WiFi管理器移植到Wio Terminal平台上,这样您就可以使用手机或其他设备为Wio Terminal配置WiFi设置了!

Install the Seeed_Arduino_rpcWiFiManager
下载Seeed_Arduino_rpcWiFiManager

WiFiManager Auto Connect示例
在这里插入图片描述

这个示例是自动连接功能的演示。您可以使用此示例为Wio Terminal设置WiFi。

  • 将代码上传到Wio Terminal。
  • 如果Wio Terminal之前已经连接过WiFi,它将自动连接到同一网络。如果它无法连接到任何WiFi,它将进入AP模式并发出WiFi信号。使用手机连接到此WiFi并输入WiFi设置。
#include <rpcWiFi.h>
#include <DNSServer.h>
#include <WebServer.h>
#include <WiFiManager.h>void setup() {Serial.begin(115200);while(!Serial); // wait till Serial is openedWiFiManager wifiManager;// Uncomment the resetSettings() will wipe out the saved settings//wifiManager.resetSettings();//Fetches ssid and pass from RTL8720 and tries to connect//if it does not connect it starts an access point with the specified name//here  "AutoConnectAP"//and goes into a blocking loop awaiting configurationwifiManager.autoConnect("AutoConnectAP");//or use this for auto generated name ESP + ChipID//wifiManager.autoConnect();//if you get here you have connected to the WiFiSerial.println("connected...yeey :)");Serial.println(WiFi.localIP());
}void loop() {// put your main code here, to run repeatedly:
}

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

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

相关文章

Java_排序

文章目录 一、排序的概念二、常见的排序算法三、常见排序算法的实现1.插入排序1、基本思想2、直接插入排序3、希尔排序&#xff08;缩小增量排序&#xff09; 2.选择排序1、基本思想2、直接选择排序2、堆排序 3.交换排序1、冒泡排序2、快速排序3、快速排序优化4、快速排序非递归…

100 spring-security 中 /oauth/token 发送请求不携带参数 报错 “401 Unauthorized“

前言 最近存在这样的一个问题, 大致的复现方式是 访问 /oauth/token 接口, 然后不携带任何参数, 结果 服务器抛出了一个 "401 Unauthorized" 针对这个 401, 这里 梳理一下这个流程, 也会衍生出一些其他的问题 测试用例 客户端这边大致的情况是 构造参数, 然后发…

arguments和剩余参数(...)

1、arguments对象 是函数内部内置的对象&#xff0c;是一个伪数组&#xff0c;包含了调用函数是传入的所有实参。可用来动态获取函数的实参。 function init(a,b,c) {console.log(arguments)}init(1,2,3) 2、剩余函数(...) 获取多余的实参&#xff0c;并形成一个真数组&#xf…

【邀请码体系设计】准入型邀请码的功能模块设计方案

文章讨论了准入型和营销型邀请码的技术需求&#xff0c;强调了管理功能、配置灵活性、数据分析能力和预生成策略的重要性。准入型邀请码的属性包括唯一标识符、生成任务ID、有效时间、使用方式和状态&#xff0c;这些特点确保了其在一次性使用场景中的有效管理和追踪。 文章目录…

Spring——Bean的作用域

bean的作用域 Bean Scope Scope说明singleton&#xff08;默认情况下&#xff09;为每个Spring IoC容器将单个Bean定义的Scope扩大到单个对象实例。prototype将单个Bean定义的Scope扩大到任何数量的对象实例。session将单个Bean定义的Scope扩大到一个HTTP Session 的生命周期…

kibana配置 dashbord,做可视化展示

一、环境介绍 这里我使用的kibana版本为7.17版本。 语言选择为中文。 需要已经有es&#xff0c;已经有kibana&#xff0c;并且都能正常访问。 二、背景介绍 kibana的可视化界面&#xff0c;可以配置很多监控统计界面。非常方便&#xff0c;做数据的可视化展示。 这篇文章&…

Rust错误处理和Result枚举类异常错误传递

Rust 有一套独特的处理异常情况的机制&#xff0c;它并不像其它语言中的 try 机制那样简单。 首先&#xff0c;程序中一般会出现两种错误&#xff1a;可恢复错误和不可恢复错误。 可恢复错误的典型案例是文件访问错误&#xff0c;如果访问一个文件失败&#xff0c;有可能是因…

修改Android打包apk的名字和目录

app打包生成apk后通常需要进行备份&#xff0c;但是要区分好哪个apk是什么版本的、什么时候打包的&#xff0c;以方便以后区分使用。 最开始的想法是把版本号、创建时间这些加在apk文件名上即可&#xff0c;但是公司要求apk使用一个固定的名称&#xff0c;那我怎么保存版本号信…

SICP解读指南:深度阅读 “计算机领域三巨头” 之一(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 书籍介绍1.1 SICP侧重点1.2 SICP章节介绍 二. 书籍推荐2.1 书籍介绍2.2 推…

LVS 负载均衡 - DR模式

一 . DR 模式 直接路由 1.介绍&#xff1a; 直接路由&#xff08;Direct Routing&#xff09;&#xff1a;简称 DR 模式&#xff0c;采用半开放式的网络结构&#xff0c;与 TUN 模式的结构类似&#xff0c;但各节点并不是分散在各地&#xff0c;而是与调度器位于同一个物…

大语言模型系列-GPT-3.5(ChatGPT)

文章目录 前言一、GPT-3.5的创新点二、GPT-3.5的训练流程SFT数据集RM数据集PPO数据集 三、ChatGPT的诞生总结 前言 《Training language models to follow instructions with human feedback&#xff0c;2022》 前文提到了GPT-3的缺点&#xff0c;其中最大的问题是&#xff1…

JuiceSSH结合Cpolar实现公网远程SSH访问内网Linux系统

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

JavaScript 中的类型转换机制(详细讲解)

文章目录 一、概述二、显示转换Number()parseInt()String()Boolean() 三、隐式转换自动转换为布尔值自动转换成字符串自动转换成数值 一、概述 前面我们讲到&#xff0c;JS中有六种简单数据类型&#xff1a;undefined、null、boolean、string、number、symbol&#xff0c;以及…

【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数,赋值运算符重载

C入门 六个默认成员函数1 构造函数语法特性 2 析构函数语法特性 3 拷贝构造函数特性 4 赋值运算符重载运算符重载赋值运算符重载特例&#xff1a;前置 与 后置前置&#xff1a;返回1之后的结果后置&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&…

Docker-部署若依项目

文章目录 后端一、搭建局域网二、redis安装测试 三、MySQL安装四、后端项目放入位置及使用Dockerfile自定义镜像后端项目放入位置 前端配置检查各个端口是否启动nginx部署 首先得先把内部的文件给删除清空 docker images–查看有哪些文件 docker rmi -f ID–删除ID 后端 一、…

根据xlsx文件第一列的网址爬虫

seleniumXpath 在与该ipynb文件同文件下新增一个111.xlsx&#xff0c;第一列放一堆需要爬虫的同样式网页 然后使用seleniumXpath爬虫 from selenium import webdriver from selenium.webdriver.common.by import By import openpyxl import timedef crawl_data(driver, url)…

原生IP是什么?如何获取海外原生IP?

一、什么是原生IP 原生IP地址是互联网服务提供商&#xff08;ISP&#xff09;直接分配给用户的真实IP地址&#xff0c;无需代理或转发。这类IP的注册国家与IP所在服务器的注册地相符。这种IP地址直接与用户的设备或网络关联&#xff0c;不会被任何中间服务器或代理转发或隐藏。…

代码随想录算法训练营第11天

20. 有效的括号 方法&#xff1a; 1. 如果 !st.empty() return false2.如果st.top() ! s[i] return false3. 如果 st.empty() return false注意&#xff1a; 以下这种写法 不满足 题目要求的第二点&#xff0c;不能以正确的顺序闭合 if(s[i] st.top()){return true;s…

[linux] 使用 kprobe 观察 tcp 拥塞窗口的变化

tcp 中拥塞窗口用来做拥塞控制。 在发送侧&#xff0c;要发送数据的时候会基于拥塞窗口进行判断&#xff0c;当前这个包还能不能发送出去。 tcp 发包函数是 tcp_write_xmit()&#xff0c;在这个函数中调用 tcp_cwnd_test() 来判断当前拥塞窗口让不让发包。从 tcp_cwnd_test() 函…

马士超:符合国际标准的沉浸式音频HOLOSOUND的发展与未来 | 演讲嘉宾公布

一、3D音频 3D 音频分论坛将于3月27日同期举办&#xff01; 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&a…