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

使用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.mzph.cn/news/718341.shtml

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

相关文章

美国亚利桑那州立大学宣布与OpenAI建立合作伙伴关系!

美国亚利桑那州立大学 (Arizona State University) 在官网宣布—— 将与OpenAI建立合作伙伴关系&#xff01; 该校也成为了第一个与OpenAI合作的高等教育机构。 来源&#xff1a;亚利桑那州立大学官网 亚利桑那州立大学校长表示&#xff1a; “我们认识到人工智能系统将持续…

Redis安全加固策略:配置文件权限设置 配置本地日志存储目录 连接超时时间限制

Redis安全加固策略&#xff1a;配置文件权限设置 & 配置本地日志存储目录 & 连接超时时间限制 1.1 配置文件权限设置1.2 配置本地日志存储目录1.3 连接超时时间限制 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1.1 配置文件权限…

Qt/事件分发器/事件过滤器

事件分发器 //事件分发器bool event(QEvent* e); //事件分发器&#xff1a;&#xff1a;用途 分发事件 bool MyLabel::event(QEvent* e) {if(e->type() QEvent::MouseButtonPress){//如果是鼠标摁下 拦截事件 不向下分发QMouseEvent* ev static_cast<QMouseEvent*>…

Deeplearning4j【基础 01】初识Java深度学习框架DL4J

初识Java深度学习框架DL4J 1.起因2.简介3.组件3.1 Deeplearning4j/ScalNet3.1.1 Deeplearning4jf&#xff08;Java&#xff09;3.1.2 ScalNet&#xff08;Scala&#xff09; 3.2 ND4J/LibND4J3.3 SameDiff3.4 DataVec3.5 Arbiter3.6 RL4J 4.总结 内容来自网络&#xff0c;基于官…

Redis--线程模型详解

Redis线程模型 Redis内部使用的文件事件处理器&#xff08;基于Reactor模式开发的&#xff09;file event handler是单线程的&#xff0c;所以Redis线程模型才叫单线程模型&#xff0c;它采用IO多路复用机制同时监听多个socket&#xff0c;当被监听的socket准备好执行accep、r…

072:vue+cesium 实现下雪效果

第072个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中实现下雪效果,这里使用着色器来实现实例特效。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共120行)着色代码实现心得:专栏目标示例效果

Wifi技术知识

参考文章 https://www.163.com/dy/article/FDFT60T70550I80C.html https://www.zhihu.com/tardis/bd/art/485711752?source_id1001 wifi代数 以前大家看电脑手机路由器参数&#xff0c;WiFi都是802.11a/b/n/g/ac/ax&#xff0c;这学名读起来有些麻烦&#xff0c;现在好了&…

第12届智能计算与无线光通信国际会议(ICWOC 2024)即将召开!

2024年第12届智能计算与无线光通信国际会议&#xff08;ICWOC 2024&#xff09;将于2024年6月21-23日在中国重庆召开。随着深度学习等人工智能技术的不断进步&#xff0c;以自动化、自治为特征的智能应用预计将激增。本届会议主题为“光通信智能链接”&#xff0c;旨在为相关技…

ubuntu环境下docker容器详细安装使用

文章目录 一、简介二、ubuntu安装docker1.删除旧版本2.安装方法一3. 安装方法二&#xff08;推荐使用&#xff09;4.运行Docker容器5. 配置docker加速器 三、Docker镜像操作1. 拉取镜像2. 查看本地镜像3. 删除镜像4. 镜像打标签5. Dockerfile生成镜像 四、Docker容器操作1. 获取…

深入理解C语言中的变量和常量

变量和常量 1. 前言2. 预备知识2.1 printf和%d2.2 \n2.3 scanf2.4 scanf在vs中报错2.5 extern2.6 数组的初始化 3. 变量和常量的区别4. 变量4.1 定义变量的方法4.2 变量的分类4.2.1 局部优先 4.3 变量的使用4.4 变量的作用域4.4.1 局部变量的作用域4.4.2 全局变量的作用域 4.5 …

机器学习|KNN和Kmeans

KNN和Kmeans KNN KNN-K个最近的邻居&#xff0c;而K是可人先预设出来的。 所谓近朱者赤&#xff0c;近墨者黑。 可以选取离当前最近的K个样本来作为辅助判断&#xff0c;因为本样本和最近的K个样本应该是处于一种相似的状态。 以下是一个苹果和梨的识别任务。 图上会出现一个未…

【软件设计师】通俗易懂的去了解算法的时间复杂度

&#x1f413; 时间复杂度 常用排序的时间复杂度 时间频度 算法需要花费的时间&#xff0c;和它语句执行的次数是成正比的&#xff0c;所以会把一个算法种语句执行次数称为语句频度和时间频度、记作T(n)。 定义 时间复杂度就是找到一个无限接近时间频度T(n)同数量级的函数&am…

mirthConnect忽略HTTPS SSL验证

mirthConnect SSL忽略验证 1、下载https网站证书 点击不安全---->证书无效 2、查看mirth 秘钥库口令 在mirthConnect 的conf目录下面keystore.storepass 3、导入证书到本地 在jdk的bin目录下面执行 keytool -importcert -file "下载的网站证书路径" -keysto…

CV论文--2024.3.4

1、Deep Networks Always Grok and Here is Why 中文标题&#xff1a;深度网络总是让人摸不着头脑&#xff0c;原因如下 简介&#xff1a;本文探讨了深度神经网络&#xff08;DNN&#xff09;中一种称为"延迟泛化"或"Grokking"的现象。在接近零的训练误差…

如何用Elementor创建WordPress会员网站

在下面的文章中&#xff0c;我们将向您展示如何使用Elementor和MemberPress在WordPress中轻松构建会员网站。这篇文章将涵盖WordPress会员网站设置过程、会员资格和受保护内容创建、重要页面和登录表单设计、电子邮件通知管理、报告等。 目录 什么是WordPress会员网站&#x…

【go从入门到精通】go基本类型和运算符用法

大家好&#xff0c;这是我给大家准备的新的一期专栏&#xff0c;专门讲golang&#xff0c;从入门到精通各种框架和中间件&#xff0c;工具类库&#xff0c;希望对go有兴趣的同学可以订阅此专栏。 --------------------------------------------------------------------------…

.NET高级面试指南专题十四【 观察者模式介绍,最常用的设计模式之一】

简介&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;其目的是定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。 原理&#xff1a; 在观察者模式中…

从零开始搭建web组态

成果展示&#xff1a;by组态[web组态插件] 一、技术选择 目前只有两种选择&#xff0c;canvas和svg Canvas: 是一个基于像素的渲染引擎&#xff0c;使用JavaScript API在画布上绘制图像&#xff0c;它的优点包括&#xff1a; Canvas渲染速度快&#xff0c;适合处理大量图像和…

TIOBE 2024榜单启示:程序员如何把握未来编程趋势与机遇

程序员如何选择职业赛道&#xff1f; 程序员的职业赛道就像是一座迷宫&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗&#xff1f;快来了解如何选择职业赛道吧&#xff01; 方向一…

CSS中如何解决 1px 问题?

1px 问题指的是&#xff1a;在一些 Retina屏幕 的机型上&#xff0c;移动端页面的 1px 会变得很粗&#xff0c;呈现出不止 1px 的效果。原因很简单——CSS 中的 1px 并不能和移动设备上的 1px 划等号。它们之间的比例关系有一个专门的属性来描述&#xff1a; window.devicePix…