网站首页url/今日北京新闻

网站首页url,今日北京新闻,注册网站帐号注销,橙子建站是什么平台可靠吗ardunio WiFi连接模板 ardunio R4 WiFi 开发板有着不错的性能和板载内存,本机自带 WiFi 连接模块,可以完成简单的网络服务。对于这个小东西我情有独钟,也总希望能够用它来做些什么,所以先从 WiFi 连接开始学起,未来考…

ardunio WiFi连接模板

ardunio R4 WiFi 开发板有着不错的性能和板载内存,本机自带 WiFi 连接模块,可以完成简单的网络服务。对于这个小东西我情有独钟,也总希望能够用它来做些什么,所以先从 WiFi 连接开始学起,未来考虑一步一步为它接入大模型服务,做出一个小的桌面显示小玩具。

WiFiClient 只能访问简单的http链接

ardunio R4 WiFi开发板依赖WiFiS3.h库进行网络连接。同时,最好新建一个保存密钥的头文件保存WiFi名称和密码。

使用WiFiClient声明client对象,用于表示一个TCP/IP客户端(类似于网络套接字)。并声明WiFi连接状态status,初始化为WL_IDLE_STATUSWifiS3库内置如下几种WiFi连接状态:

  • WL_NO_SHIELD** / **WL_NO_MODULE :没有检测到WiFi模块。
  • WL_IDLE_STATUS :WiFi模块处于空闲状态。
  • WL_NO_SSID_AVAIL :没有可用的SSID。
  • WL_SCAN_COMPLETED :WiFi扫描完成。
  • WL_CONNECTED :成功连接到WiFi网络。
  • WL_CONNECT_FAILED :连接失败。
  • WL_CONNECTION_LOST :连接丢失。
  • WL_DISCONNECTED :断开连接。
  • WL_AP_LISTENING :WiFi模块作为接入点监听中。
  • WL_AP_CONNECTED :设备已连接到WiFi模块作为接入点。
  • WL_AP_FAILED :接入点模式启动失败。
WiFiClient client;
int status = WL_IDLE_STATUS;

之后在setup中配置网络连接初始化:声明波特率 → WiFi连接 → 尝试连接直到成功 → 打印IP。

void setup() {Serial.begin(115200);delay(1000);Serial.println("Connecting to WiFi");WiFi.begin(ssid, pass);                          //WifiS3库已经内置WiFi全局变量,可以直接使用while(WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("Connected to WiFi");Serial.println("IP Address: ");Serial.println(WiFi.localIP());}

WiFiSSLClient 可以访问https安全链接

WiFiClient只能访问基础的http连接,想要允许 Arduino 设备通过 WiFi 网络与支持 SSL/TLS 加密的服务器建立安全连接,从而安全地发送和接收数据需要使用WiFiSSLClient 类。它的使用方法和WiFiClient相似,只需改为声明WiFiSSLClient client;

为了向服务器发送请求,我们使用如下方式添加请求内容:

if (client.connect(server, 443)) {Serial.println("connected to server");client.println("GET / HTTP/1.1");client.println("Host: www.google.com");client.println("Connection: close");client.println();
}

client.connect(server, 443)这行代码尝试通过TCP/IP协议连接到目标服务器的443端口(HTTPS默认端口)。如果连接成功,说明Arduino已经与网页服务器建立了通信通道。

client.println() 是用来向服务器发送HTTP请求,GET / HTTP/1.1表示请求根路径(/)的内容,使用HTTP 1.1协议;**Host: www.google.com指定目标主机名;Connection: close**告诉服务器在响应完成后关闭连接。

请求完成,我们可以使用如下方式查看服务器响应内容:

void read_response() {uint32_t received_data_num = 0;while (client.available()) {/* actual data reception */char c = client.read();/* print data to serial port */Serial.print(c);/* wrap data to 80 columns*/received_data_num++;if(received_data_num % 80 == 0) {Serial.println();}}
}

参考完整示例,访问少数派文章为Claude桌面端集成tavily搜索 - 少数派

/*TLS WiFi Web client - 访问少数派文章Board CA Root certificate bundle is embedded inside WiFi firmware:https://github.com/arduino/uno-r4-wifi-usb-bridge/blob/main/certificates/cacrt_all.pem
*/#include "WiFiS3.h"
#include "WiFiSSLClient.h"
#include "IPAddress.h"#include "secret.h"///please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;        // your network password (use for WPA, or use as key for WEP)int status = WL_IDLE_STATUS;
// 修改为少数派网站
char server[] = "sspai.com";    // 少数派网站域名// Initialize the SSL client
WiFiSSLClient client;/* -------------------------------------------------------------------------- */
void setup() {
/* -------------------------------------------------------------------------- *///Initialize serial and wait for port to open:Serial.begin(115200);while (!Serial) {; // wait for serial port to connect. Needed for native USB port only}// check for the WiFi module:if (WiFi.status() == WL_NO_MODULE) {Serial.println("Communication with WiFi module failed!");// don't continuewhile (true);}String fv = WiFi.firmwareVersion();if (fv < WIFI_FIRMWARE_LATEST_VERSION) {Serial.println("Please upgrade the firmware");}// attempt to connect to WiFi network:while (status != WL_CONNECTED) {Serial.print("Attempting to connect to SSID: ");Serial.println(ssid);// Connect to WPA/WPA2 network.status = WiFi.begin(ssid, pass);// wait 10 seconds for connection:delay(10000);}printWifiStatus();Serial.println("\nStarting connection to sspai.com...");// if you get a connection, report back via serial:if (client.connect(server, 443)) {Serial.println("connected to server");// Make a HTTP request for the specific article:client.println("GET /post/97248 HTTP/1.1");client.println("Host: sspai.com");client.println("User-Agent: Mozilla/5.0 (compatible; Arduino/1.0)");  // 添加更友好的User-Agentclient.println("Accept: text/html");                                  // 接受HTML内容client.println("Connection: close");client.println();} else {Serial.println("Connection to server failed");}
}/* just wrap the received data up to 80 columns in the serial print*/
/* -------------------------------------------------------------------------- */
void read_response() {
/* -------------------------------------------------------------------------- */uint32_t received_data_num = 0;while (client.available()) {/* actual data reception */char c = client.read();/* print data to serial port */Serial.print(c);/* wrap data to 80 columns*/received_data_num++;if(received_data_num % 80 == 0) {Serial.println();}}
}/* -------------------------------------------------------------------------- */
void loop() {
/* -------------------------------------------------------------------------- */read_response();// if the server's disconnected, stop the client:if (!client.connected()) {Serial.println();Serial.println("disconnecting from server.");client.stop();// do nothing forevermore:while (true);}
}/* -------------------------------------------------------------------------- */
void printWifiStatus() {
/* -------------------------------------------------------------------------- */// print the SSID of the network you're attached to:Serial.print("SSID: ");Serial.println(WiFi.SSID());// print your board's IP address:IPAddress ip = WiFi.localIP();Serial.print("IP Address: ");Serial.println(ip);// print the received signal strength:long rssi = WiFi.RSSI();Serial.print("signal strength (RSSI):");Serial.print(rssi);Serial.println(" dBm");
}

串口打印示例:

14:11:22.536 -> SSID: ZTE_2AED09
14:11:22.536 -> IP Address: 192.168.0.5
14:11:22.578 -> signal strength (RSSI):-51 dBm
14:11:22.578 -> 
14:11:22.578 -> Starting connection to sspai.com...
14:11:23.804 -> connected to server
14:11:24.536 -> HTTP/1.1 200 OK
14:11:24.536 -> Date: Thu, 13 Mar 2025 06:11:22 GMT
14:11:24.536 -> Content-Type: text/html; c
14:11:24.536 -> harset=utf-8
14:11:24.536 -> Content-Length: 119824
14:11:24.536 -> Connection: close
14:11:24.536 -> Vary: Accept-Encoding
14:11:24.536 -> 
14:11:24.536 -> Cache-Control: no-store
14:11:24.536 -> 
14:11:24.536 -> <!DOCTYPE html>
14:11:24.536 -> <html lang="zh-CN" id="html">
14:11:24.536 -> <head>
14:11:24.536 -> 
14:11:24.536 ->   <meta charset="utf-8">
14:11:24.536 ->   <meta name="viewport" content="width=device-width, us
14:11:24.536 -> er-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewpor
14:11:24.568 -> t-fit=cover">
14:11:24.568 ->   <meta name="theme-color" content="" />
14:11:24.568 ->   <meta
14:11:24.568 ->     http-equiv="C
14:11:24.568 -> ontent-Security-Policy"
14:11:24.568 ->     content="frame-src https://sspai.com https://*.sspai
14:11:24.568 -> .com https://*.bilibili.com https://bilibili.com https://v.qq.com https://embed.
14:11:24.568 -> music.apple.com https://jinshuju.net https://share.newsroom.apple;"
14:11:24.607 ->   >
14:11:24.607 ->   <meta 
14:11:24.607 -> name="fragment" content="!">
14:11:24.607 ->   <link rel="shortcut icon" href="https://cdn-stati
14:11:24.607 -> c.sspai.com/favicon/sspai.ico" type="image/x-icon" />
14:11:24.607 ->   <link rel="icon" href="h...14:11:48.951 ->     var _hmt = _hmt || []
14:11:48.951 -> ;
14:11:48.951 ->     (function () {
14:11:48.951 ->       var hm = document.createElement("script");
14:11:48.951 ->       hm.s
14:11:48.951 -> rc = "//hm.baidu.com/hm.js?92174dab8163cf598817a93d11d5c588";
14:11:48.984 ->       var s = docu
14:11:48.984 -> ment.getElementsByTagName("script")[0];
14:11:48.984 ->       s.parentNode.insertBefore(hm, s);
14:11:48.984 -> 
14:11:48.984 ->     })();
14:11:48.984 -> 
14:11:48.984 ->   </script>
14:11:48.984 ->   <!-- Baidu Push -->
14:11:48.984 ->   <script>
14:11:48.984 ->     (function () {
14:11:48.984 ->      
14:11:48.984 ->  var bp = document.createElement('script');
14:11:48.984 ->       var curProtocol = window.locat
14:11:48.984 -> ion.protocol.split(':')[0];
14:11:48.984 ->       if (curProtocol === 'https') {
14:11:48.984 ->         bp.src 
14:11:48.984 -> = 'https://zz.bdstatic.com/linksubmit/push.js';
14:11:48.984 ->       } else {
14:11:49.025 ->         bp.src = 
14:11:49.025 -> 'http://push.zhanzhang.baidu.com/push.js';
14:11:49.025 ->       }
14:11:49.025 ->       var s = document.getEle
14:11:49.025 -> mentsByTagName("script")[0];
14:11:49.058 ->       s.parentNode.insertBefore(bp, s);
14:11:49.058 ->     })();
14:11:49.058 ->  
14:11:49.058 ->  </script>
14:11:49.058 -> </body>
14:11:49.058 -> </html>
14:11:49.058 -> 
14:11:49.058 -> disconnecting from server.

WiFiServer把ardunio作为服务器

ardunio同样可以作为服务器使用,提供浏览器以http访问IP的能力。它的交互过层如下:

  1. 浏览器(客户端)连接到Arduino的IP地址
  2. 浏览器发送HTTP请求
  3. Arduino处理请求并返回网页内容
  4. 浏览器接收内容并断开连接
  5. Arduino在串口打印“客户端断开连接”

通过声明WiFiServer server(80);来定义服务器。之后,使用server.begin();启动服务器。主循环参考如下:

void loop() {// 检查是否有新的客户端连接WiFiClient client = server.available();if (client) {Serial.println("新客户连接");String currentLine = "";    // 用于存储当前读取的HTTP请求行// 当客户端保持连接时持续处理while (client.connected()) {// 检查是否有数据可读if (client.available()) {// 逐字符读取HTTP请求char c = client.read();Serial.write(c);        // 将读取的字符输出到串口监视器// 处理换行符if (c == '\n') {// 空行标志着HTTP请求头的结束if (currentLine.length() == 0) {sendHttpResponse(client);  // 发送HTTP响应break;                     // 退出处理循环} else {currentLine = "";         // 重置当前行,准备读取下一行}} else if (c != '\r') {      // 忽略回车符currentLine += c;           // 将字符添加到当前行}}}delay(1);                        // 短暂延时确保数据传输完成client.stop();                   // 关闭客户端连接Serial.println("客户端断开连接");}
}

当浏览器向ardunio发送请求时,ardunio服务器会向客户端发送HTTP响应,通过自定义的sendHttpResponse函数封装了这个响应,它具体如下:

void sendHttpResponse(WiFiClient &client) {// 发送HTTP头client.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html; charset=UTF-8");client.println("Connection: close");client.println();// 发送HTML内容client.print(HTML_HEADER);// 可以在这里处理动态内容替换String content = HTML_CONTENT;content.replace("%SERVER_TIME%", String(millis() / 1000));client.print(content);client.print(HTML_FOOTER);
}
  • client.println("HTTP/1.1 200 OK"); :这行代码发送HTTP状态行。 HTTP/1.1 表示使用的HTTP协议版本, 200 是状态码,代表请求已成功处理, OK 是状态码对应的文本描述。客户端收到这个状态行后,就知道请求已经成功处理。
  • client.println("Content-Type: text/html; charset=UTF-8"); :这行代码发送 Content-Type 头部。它告诉客户端响应内容的类型是HTML,并且使用的字符编码是UTF - 8。这样客户端就能正确解析和显示响应内容。
  • client.println("Connection: close"); :这行代码发送 Connection 头部。 close 表示在响应完成后,服务器会关闭与客户端的连接。这是一种常见的做法,特别是在处理简单的HTTP请求时。
  • client.println(); :这行代码发送一个空行。在HTTP协议中,空行用于分隔头部和主体。发送空行后,后续发送的内容就是响应的主体部分了。

服务器完整示例如下

#include "WiFiS3.h"
#include "IPAddress.h"
#include "secret.h" // 确保创建此文件
#include "html_content.h"// 在arduino_secrets.h中定义您的网络凭据
// #define SECRET_SSID "ZTE_2AED09" 
// #define SECRET_PASS "您的密码"
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;int status = WL_IDLE_STATUS;
WiFiServer server(80);void setup() {// 初始化串口通信Serial.begin(115200);while (!Serial) {; // 等待串口连接}Serial.println("Arduino Web Server启动");// 检查WiFi模块if (WiFi.status() == WL_NO_MODULE) {Serial.println("WiFi模块通信失败!");while (true); // 不继续}// 检查固件版本String fv = WiFi.firmwareVersion();Serial.print("WiFi固件版本: ");Serial.println(fv);if (fv < WIFI_FIRMWARE_LATEST_VERSION) {Serial.println("请升级固件");}// 连接到WiFi网络while (status != WL_CONNECTED) {Serial.print("尝试连接到SSID: ");Serial.println(ssid);// 连接到WPA/WPA2网络status = WiFi.begin(ssid, pass);// 等待10秒连接delay(10000);}// 打印WiFi状态printWifiStatus();// 启动服务器server.begin();Serial.println("服务器已启动");
}void loop() {// 检查是否有新的客户端连接WiFiClient client = server.available();if (client) {Serial.println("新客户连接");String currentLine = "";    // 用于存储当前读取的HTTP请求行// 当客户端保持连接时持续处理while (client.connected()) {// 检查是否有数据可读if (client.available()) {// 逐字符读取HTTP请求char c = client.read();Serial.write(c);        // 将读取的字符输出到串口监视器// 处理换行符if (c == '\n') {// 空行标志着HTTP请求头的结束if (currentLine.length() == 0) {sendHttpResponse(client);  // 发送HTTP响应break;                     // 退出处理循环} else {currentLine = "";         // 重置当前行,准备读取下一行}} else if (c != '\r') {      // 忽略回车符currentLine += c;           // 将字符添加到当前行}}}delay(1);                        // 短暂延时确保数据传输完成client.stop();                   // 关闭客户端连接Serial.println("客户端断开连接");}
}void sendHttpResponse(WiFiClient &client) {// 发送HTTP头client.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html; charset=UTF-8");client.println("Connection: close");client.println();// 发送HTML内容client.print(HTML_HEADER);// 可以在这里处理动态内容替换String content = HTML_CONTENT;content.replace("%SERVER_TIME%", String(millis() / 1000));client.print(content);client.print(HTML_FOOTER);
}void printWifiStatus() {// 打印SSIDSerial.print("SSID: ");Serial.println(WiFi.SSID());// 打印IP地址IPAddress ip = WiFi.localIP();Serial.print("IP Address: ");Serial.println(ip);// 打印信号强度long rssi = WiFi.RSSI();Serial.print("signal strength (RSSI):");Serial.print(rssi);Serial.println(" dBm");// 显示访问链接Serial.println();Serial.print("在浏览器中访问 http://");Serial.println(ip);
}

http网页

#ifndef HTML_CONTENT_H
#define HTML_CONTENT_H// HTML头部
const char HTML_HEADER[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Arduino Web服务器</title><style>body {font-family: Arial, sans-serif;margin: 20px;text-align: center;background-color: #f0f0f0;}h1 {color: #0066cc;}.container {max-width: 800px;margin: 0 auto;background-color: white;padding: 20px;border-radius: 8px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);}</style>
</head>
<body><div class="container">
)rawliteral";// 主要内容
const char HTML_CONTENT[] PROGMEM = R"rawliteral(<h1>Arduino Web服务器</h1><p>欢迎访问Arduino UNO R4 WiFi服务器!</p><p>服务器运行正常</p><p>当前时间: <span id="server-time">%SERVER_TIME%</span></p>
)rawliteral";// 底部
const char HTML_FOOTER[] PROGMEM = R"rawliteral(</div>
</body>
</html>
)rawliteral";#endif

串口打印

打开浏览器,访问http://192.168.0.5

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

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

相关文章

得物 Android Crash 治理实践

一、前言 通过修复历史遗留的Crash漏报问题&#xff08;包括端侧SDK采集的兼容性优化及Crash平台的数据消费机制完善&#xff09;&#xff0c;得物Android端的Crash监控体系得到显著增强&#xff0c;使得历史Crash数据的完整捕获能力得到系统性改善&#xff0c;相应Crash指标也…

SpringBoot3+Lombok如何配置logback输出日志到文件

Background/Requirement SpringBoot3Lombok如何配置logback输出日志到文件&#xff0c;因为我需要对这些日志进行输出&#xff0c;控制台输出和文件输出&#xff0c;文件输出是为了更好的作为AuditLog且支持滚动式备份&#xff0c;每天一个文件。 Technical Solution 1.确保你…

主流向量数据库对比

在 AI 的 RAG&#xff08;检索增强生成&#xff09;研发领域&#xff0c;向量数据库是存储和查询向量嵌入的核心工具&#xff0c;用于支持高效的语义搜索和信息检索。向量嵌入是文本或其他非结构化数据的数值表示&#xff0c;RAG 系统通过这些嵌入从知识库中检索相关信息&#…

[操作系统] 学校课程关于“静态优先级抢占式调度“作业

今天我们来分享两道题目哈, 学校弄得题目. T1: 静态优先级, 抢占式(1为高优先级) 图解: 以下是静态优先级抢占式调度的解题过程和结果&#xff1a; 解题思路&#xff1a; 优先级规则&#xff1a; 数值越小优先级越高。新进程到达时&#xff0c;若其优先级高于当前运行进程&…

使用DeepSeek完成一个简单嵌入式开发

开启DeepSeek对话 请帮我使用Altium Designer设计原理图、PCB&#xff0c;使用keil完成代码编写&#xff1b;要求&#xff1a;使用stm32F103RCT6为主控芯片&#xff0c;控制3个流水灯的原理图 这里需要注意&#xff0c;每次DeepSeek的回答都不太一样。 DeepSeek回答 以下是使…

嵌入式八股C语言---面向对象篇

面向对象与面向过程 面向过程 就是把整个业务逻辑分成多个步骤,每步或每一个功能都可以使用一个函数来实现面向对象 对象是类的实例化,此时一个类就内部有属性和相应的方法 封装 在C语言里实现封装就是实现一个结构体,里面包括的成员变量和函数指针,然后在构造函数中,为结构体…

Distilling the Knowledge in a Neural Network知识蒸馏

一.知识蒸馏的定义 1. 量化VS蒸馏 量化&#xff1a;减小精度 例如参数float32—>float16蒸馏&#xff1a;Student model模仿Teacher model,在保持较高性能的同时&#xff0c;减少模型大小和计算复杂度的技术。 二.知识蒸馏步骤 1.教师模型训练: 训练一个大型且复杂的神…

Flutter_学习记录_device_info_plus 插件获取设备信息

引入三方库device_info_plus导入头文件 import package:device_info_plus/device_info_plus.dart;获取设备信息的主要代码 DeviceInfoPlugin deviceInfoPlugin DeviceInfoPlugin(); BaseDeviceInfo deviceInfo await deviceInfoPlugin.deviceInfo;完整案例 import package…

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中&#xff0c;如何确保接口质量&#xff1f;自动化测试是关键。通过构建标准化、可复用的测试框架&#xff0c;能显著提升测试效率与准确性&#xff0c;为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标&#xff1a; ● 实现快速、高效的接口测试…

智能运维管理系统的主要优势

智能运维管理系统通过整合大数据、人工智能、机器学习等技术&#xff0c;显著提升了IT运维的效率和质量。以下是智能运维管理系统的主要优势&#xff1a; 一、提升运维效率 1.自动化运维 自动执行重复性任务&#xff08;如日志分析、故障排查、系统备份&#xff09;&#xf…

【python运行Janus-Pro-1B文生图功能】

前言 体验了一把本地部署Janus-Pro-1B实现文生图功能。 1、开源项目下载 官方开源项目代码直接从Github上下载。 2、模型下载 模型官方下载需要魔法 Janus-Pro-1B模型文件&#xff1a;Janus-Pro-1B模型文件 百度网盘&#xff1a; https://pan.baidu.com/s/16t4H4z-QZe2UDAg4…

跨越时空的对话:图灵与GPT-4聊AI的前世今生

&#xff08;背景&#xff1a;虚拟咖啡厅&#xff0c;图灵身着1950年代西装&#xff0c;端着一杯热茶&#xff0c;GPT-4以全息投影形态坐在对面&#xff09; 图灵&#xff08;喝了口茶&#xff09;&#xff1a;“听说你能写诗&#xff1f;我当年在布莱切利园破解Enigma时&…

L2-4 吉利矩阵

输入样例&#xff1a; 7 3输出样例&#xff1a; 666 这道题是暴力纯搜&#xff0c;但是很难想&#xff0c;我这个是看的别人的代码 #include "bits/stdc.h" using namespace std; int x[20][20]; int l, n; int cnt 0; int sumx[5], sumy[5]; void dfs(int x, in…

Quickwit+Jaeger+Prometheus+Grafana搭建Java日志管理平台

介绍 生产服务应用可观测性在当下比较流行的方案&#xff0c;其中出现了大量高性能、开箱即用、易上手的的开源产品&#xff0c;大大丰富了在可观测性领域产品的多样性&#xff0c;本文讲述基于OTLP协议推送Java项目遥测数据&#xff08;日志、指标、链路&#xff09;到后端存储…

SpringMVC (一)基础

目录 SpringMVC 一 简单使用 1 新建模块选择指定参数 2 创建实现类 3 将项目启动 4 运行结果&#xff1a;在浏览器当中响应执行 二 RequestMapping 三 请求限定 SpringMVC SpringMVC是Spring的web模块&#xff0c;用来开发Web应用&#xff0c;SpringMVC应用最终作为B/…

【机器人-基础知识】欧拉角、旋转矩阵和四元数

1. 欧拉角 1.1. 欧拉角的定义 欧拉角是一组三个角度,用于描述一个刚体在三维空间中的定向关系。具体来说,它们表示从一个固定参考坐标系到刚体坐标系的一系列旋转。常见的定义方式是将总体旋转分解为三个连续的简单旋转,每次旋转都绕着当前坐标系的某一固定轴进行。 例如,…

xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱

XXL-JOB XXL-JOB是一个分布式任务调度平台&#xff08;XXL是作者徐雪里姓名拼音的首字母&#xff09;&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 源码仓库地址&#xff1a;https://github.com/xuxueli/xxl-job 源码结构&#xff1a; 系统架构 在xxl-j…

大数据学习(63)- Zookeeper详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91e; &#x1f…

【数据结构】3顺序表

0 章节 &#xff12;&#xff0e;&#xff11;到&#xff12;&#xff0e;&#xff13;小节。 理解与表达线性表的逻辑结构&#xff1b; 线性表的结构、结构与操作&#xff1b; 顺序表的表示与实现&#xff1b;顺序表应用&#xff1b; 重点 线性表概念、顺序表定义运算与实现&a…

WPF从初学者到专家:实战项目经验分享与总结

WPF从初学者到专家&#xff1a;实战项目经验分享与总结 一、前言二、WPF 基础概念与入门2.1 什么是 WPF2.2 XAML 基础2.3 数据绑定基础 三、第一个 WPF 项目&#xff1a;简单的待办事项列表3.1 项目需求分析3.2 项目搭建与界面设计3.3 业务逻辑实现 四、中级项目&#xff1a;音…