系列文章目录

持续更新…


文章目录

  • 系列文章目录
  • 前言
  • 一、Wi‑Fi 智能配网概述
    • 1.SmartConfig 简介
    • 2.SmartConfig 工作原理
    • 3.SmartConfig 协议类型
  • 二、Wi‑Fi 智能配网类型定义及相关API
  • 三、Wi‑Fi 智能配网示例程序
  • 总结


前言

在物联网设备开发过程中,如果将 Wi-Fi 的 SSID 和密码直接写死在程序中肯定不合理。为了解决这一问题,ESP32 提供了多种 配网方式,其中 SmartConfig 智能配网(又称“一键配网”)是一种常用且高效的方案。SmartConfig 可以让用户通过手机 App 将 Wi-Fi 网络的名称和密码发送给 ESP32 设备,从而避免在代码中硬编码 Wi-Fi 信息。本篇文章将基于最新的 ESP-IDF,介绍 Wi-Fi SmartConfig 的原理和使用方法,并重点演示 Espressif 自家的 ESPTouch 智能配网方式。


一、Wi‑Fi 智能配网概述

1.SmartConfig 简介

SmartConfig 是由德州仪器(TI)开发的一种 Wi-Fi 配网技术,用于将新的 Wi-Fi 设备连接到目标路由器。它的特点是在不建立传统网络连接的情况下,由手机等移动设备将 Wi-Fi 凭据通过广播的方式发送给待配网的设备。对于那些没有屏幕或输入接口的“无头”设备来说,SmartConfig 提供了一种简便的配网途径。利用 SmartConfig,用户无需直接在设备上输入或预先配置 Wi-Fi SSID 和密码,设备通电后进入配网模式,几分钟内即可完成网络连接。

2.SmartConfig 工作原理

SmartConfig 的实现原理是利用手机和路由器的广播机制传递 Wi-Fi 信息。在配网过程中,手机通过 App 将包含 Wi-Fi SSID 和密码的内容编码进一系列特殊的 UDP 广播数据包中,并在无线网络中发送出来。
在这里插入图片描述

ESP32 设备启动 SmartConfig 后,会进入 Wi-Fi 混杂模式轮循监听各个信道上的数据帧。当设备捕获到符合特定编码规则的广播包时,就能解析出其中包含的 Wi-Fi 名称和密码,并据此配置 ESP32 的 Wi-Fi STA 模式连接到对应的 AP(路由器)。如果在当前信道未能监听到有效数据,设备会切换到下一个信道继续监听,直到成功获取 Wi-Fi 信息为止。整个过程无需让手机直接与设备建立连接,避免了手动连接热点等繁琐步骤。

3.SmartConfig 协议类型

ESP32 平台目前支持三种类型的 SmartConfig 协议:Airkiss、ESPTouch 和 ESPTouch v2。其中,Airkiss 是腾讯微信推出的配网协议,常用于微信硬件平台;ESPTouch 则是乐鑫提供的官方配网协议,对应 Espressif 提供的手机 App(ESP-Touch)。开发者可以根据需求调用接口设定 SmartConfig 的类型。

需要特别说明的是 ESPTouch v2:从 SmartConfig v3.0 开始,ESP-IDF 新增了对 ESPTouch v2 的支持。相比传统的 ESPTouch,v2 版本采用了全新的算法提高了配网速度,并增加了 AES 加密传输和自定义数据字段等功能。这意味着在使用 ESPTouch v2 时,Wi-Fi 密码等敏感信息可以加密广播,提高了配网的安全性;但同时由于加密过程增加了数据传输量,在开启随机 IV(初始化向量)等安全特性时,配网所需时间可能略有增加。一般情况下,使用 ESPTouch(包括 v2)方式能满足多数应用需求。本文的示例也将采用 Espressif 官方的 ESPTouch 方法进行演示。

二、Wi‑Fi 智能配网类型定义及相关API

需包含头文件:esp_smartconfig.h:
Wi‑Fi 智能配网类型定义

/** SmartConfig 配网协议类型枚举 */
typedef enum {SC_TYPE_ESPTOUCH = 0,    // ESPTouch 配网(Espressif 官方协议)SC_TYPE_AIRKISS,         // AirKiss 配网(腾讯微信协议)SC_TYPE_ESPTOUCH_AIRKISS,// 组合配网模式(同时兼容 ESPTouch 和 AirKiss)SC_TYPE_ESPTOUCH_V2      // ESPTouch v2 配网(包含AES加密的改进版)
} smartconfig_type_t;/** SmartConfig 配网过程事件枚举 */
typedef enum {SC_EVENT_SCAN_DONE,      // 已完成周围 Wi-Fi 信道扫描SC_EVENT_FOUND_CHANNEL,  // 已找到目标路由器所在信道SC_EVENT_GOT_SSID_PSWD,  // 已获取到 Wi-Fi 的 SSID 和密码SC_EVENT_SEND_ACK_DONE   // 已发送确认信息(ACK)给手机端
} smartconfig_event_t;/* ===== GOT_SSID_PSWD 事件的数据结构 =====* 当拿到凭据时,事件回调会携带此结构体(从中取 ssid/password/bssid 等)*/
typedef struct {uint8_t ssid[32];         /* 目标 AP SSID(以 '\0' 结尾) */uint8_t password[64];     /* 对应密码(以 '\0' 结尾) */bool    bssid_set;        /* 是否携带并使用 BSSID(MAC)定向入网 */uint8_t bssid[6];         /* 目标 AP 的 BSSID(当 bssid_set = true 时有效) */smartconfig_type_t type;  /* 本次实际使用的协议类型(ESPTouch / AirKiss) */uint8_t token;            /* 与手机 App 通讯用的 token(ACK 用) */uint8_t cellphone_ip[4];  /* 手机的 IPv4 地址(便于双向确认) */
} smartconfig_event_got_ssid_pswd_t;/* ===== SmartConfig 启动配置 =====* 可开启日志、ESPTouch v2 加密(需 16 字节密钥)*/
typedef struct {bool  enable_log;                /* 配网过程打印日志(默认 false) */bool  esp_touch_v2_enable_crypt; /* 开启 v2 加密(true/false) */char *esp_touch_v2_key;          /* v2 加密密钥,长度需为 16 字节 */
} smartconfig_start_config_t;

Wi‑Fi 智能配网相关API

// 获取 SmartConfig 库版本号字符串
const char *esp_smartconfig_get_version(void);// 开始 SmartConfig 配网(Station 或 SoftAP-Sta模式下调用)
esp_err_t esp_smartconfig_start(const smartconfig_start_config_t *config);// 停止 SmartConfig 配网并释放资源(无论成功与否都应调用)
esp_err_t esp_smartconfig_stop(void);// 设置 SmartConfig 配网超时时间(单位秒,15~255,默认加45秒偏移,从寻找信道开始计时)
esp_err_t esp_esptouch_set_timeout(uint8_t time_s);// 设置 SmartConfig 配网协议类型(需在 esp_smartconfig_start 之前调用)
esp_err_t esp_smartconfig_set_type(smartconfig_type_t type);// 设置是否启用快速模式(需在 esp_smartconfig_start 之前调用)
esp_err_t esp_smartconfig_fast_mode(bool enable);// 获取 ESPTouch v2 配网的预留数据(在 SC_EVENT_GOT_SSID_PSWD 事件后调用)
esp_err_t esp_smartconfig_get_rvd_data(uint8_t *rvd_data, uint8_t len);

三、Wi‑Fi 智能配网示例程序

本程序演示如何使用ESP-Touch智能配网功能。
让ESP32通过手机APP自动获取WiFi的SSID和密码,无需在代码中硬编码 WiFi 信息。

/** ESP32-S3 智能配网(SmartConfig)示例** 本程序演示如何使用ESP-Touch智能配网功能,让ESP32通过手机APP* 自动获取WiFi的SSID和密码,无需在代码中硬编码WiFi信息。** 智能配网流程:* 1. ESP32启动后进入SmartConfig模式,等待配网* 2. 用户使用手机APP(如ESP-Touch)发送WiFi信息* 3. ESP32接收到WiFi信息后自动连接* 4. 连接成功后退出配网模式**/#include <string.h>                // 字符串处理函数
#include "freertos/FreeRTOS.h"     // FreeRTOS实时操作系统
#include "freertos/task.h"         // 任务管理
#include "freertos/event_groups.h" // 事件组(用于任务间通信)
#include "esp_wifi.h"              // WiFi驱动
#include "esp_event.h"             // 事件处理
#include "esp_smartconfig.h"       // 智能配网功能
#include "esp_netif.h"             // 网络接口
#include "nvs_flash.h"             // 非易失性存储
#include "esp_log.h"               // 日志输出// ======================== 事件位定义 ========================
// 使用事件组来标记不同的状态
static const int CONNECTED_BIT = BIT0;     // 位0:WiFi连接成功标志
static const int ESPTOUCH_DONE_BIT = BIT1; // 位1:ESP-Touch配网完成标志// ======================== 全局变量 ========================
static EventGroupHandle_t s_wifi_event_group; // 事件组句柄,用于任务间通信
static const char *TAG = "smartconfig";       // 日志标签/** 事件处理函数 - 处理WiFi和SmartConfig相关事件** 参数说明:* - arg: 用户数据(本例中未使用)* - event_base: 事件类型(WIFI_EVENT、IP_EVENT、SC_EVENT等)* - event_id: 具体的事件ID* - event_data: 事件携带的数据** 这个函数会在WiFi状态或SmartConfig状态发生变化时自动被调用*/
static void event_handler(void *arg,                   // 用户参数(未使用)esp_event_base_t event_base, // 事件基础类型int32_t event_id,            // 事件IDvoid *event_data)            // 事件数据
{// 处理WiFi STA启动事件if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START){esp_wifi_connect(); // WiFi启动后立即尝试连接ESP_LOGI(TAG, "WiFi STA启动,开始连接...");}// 处理WiFi断开连接事件else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED){esp_wifi_connect(); // 断开后自动重连ESP_LOGI(TAG, "WiFi断开连接,正在重连...");}// 处理获取IP地址事件else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP){ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;char ip[16];esp_ip4addr_ntoa(&event->ip_info.ip, ip, sizeof(ip));ESP_LOGI(TAG, "🎉 WiFi连接成功!获取到IP地址: %s", ip);xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT); // 设置连接成功标志}// 处理SmartConfig扫描完成事件else if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE){ESP_LOGI(TAG, "SmartConfig扫描完成");}// 处理SmartConfig找到信道事件else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL){ESP_LOGI(TAG, "SmartConfig找到目标信道");}// 处理SmartConfig获取SSID和密码事件else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD){ESP_LOGI(TAG, "SmartConfig获取到WiFi信息");// 获取SmartConfig传递的WiFi信息smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t *)event_data;wifi_config_t wifi_config;                // WiFi配置结构体bzero(&wifi_config, sizeof(wifi_config)); // 清零配置结构体// 复制SSID和密码到WiFi配置中memcpy(wifi_config.sta.ssid, evt->ssid, sizeof(wifi_config.sta.ssid));memcpy(wifi_config.sta.password, evt->password, sizeof(wifi_config.sta.password));ESP_LOGI(TAG, "SSID: %s", wifi_config.sta.ssid);ESP_LOGI(TAG, "密码: %s", wifi_config.sta.password);// 先断开当前连接,然后应用新的WiFi配置esp_wifi_disconnect();                          // 断开当前连接esp_wifi_set_config(WIFI_IF_STA, &wifi_config); // 设置新的WiFi配置esp_wifi_connect();                             // 使用新配置连接WiFi}// 处理SmartConfig发送确认完成事件else if (event_base == SC_EVENT && event_id == SC_EVENT_SEND_ACK_DONE){ESP_LOGI(TAG, "✅ SmartConfig配网完成");xEventGroupSetBits(s_wifi_event_group, ESPTOUCH_DONE_BIT); // 设置配网完成标志}
}/** SmartConfig任务函数** 这个任务负责:* 1. 启动ESP-Touch智能配网* 2. 等待WiFi连接成功或配网完成* 3. 配网完成后停止SmartConfig并删除自己** 参数:parm - 任务参数(未使用)*/
static void smartconfig_task(void *parm) // 任务参数(未使用)
{EventBits_t uxBits; // 用于接收事件位的变量ESP_LOGI(TAG, "启动SmartConfig配网任务");// 配置SmartConfig参数smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT(); // 使用默认配置esp_smartconfig_set_type(SC_TYPE_ESPTOUCH);                          // 设置配网类型为ESP-Touchesp_smartconfig_start(&cfg);                                         // 启动SmartConfigESP_LOGI(TAG, "请使用ESP-Touch手机APP进行配网");ESP_LOGI(TAG, "等待手机发送WiFi配置信息...");// 主循环:等待事件while (1){// 等待事件位:WiFi连接成功 或 ESP-Touch配网完成uxBits = xEventGroupWaitBits(s_wifi_event_group,                // 事件组句柄CONNECTED_BIT | ESPTOUCH_DONE_BIT, // 等待的事件位true,                              // 读取后清除事件位false,                             // 只要有一个事件位被设置就返回portMAX_DELAY);                    // 无限等待// 检查WiFi是否连接成功if (uxBits & CONNECTED_BIT){ESP_LOGI(TAG, "WiFi连接成功!");}// 检查ESP-Touch配网是否完成if (uxBits & ESPTOUCH_DONE_BIT){ESP_LOGI(TAG, "ESP-Touch配网流程完成");esp_smartconfig_stop(); // 停止SmartConfigESP_LOGI(TAG, "SmartConfig已停止");vTaskDelete(NULL); // 删除当前任务(自我删除)}}
}/** WiFi初始化函数** 这个函数完成以下工作:* 1. 初始化网络栈和事件循环* 2. 创建WiFi STA接口* 3. 初始化WiFi驱动* 4. 创建事件组* 5. 注册事件处理函数* 6. 设置WiFi模式并启动*/
static void wifi_init(void)
{ESP_LOGI(TAG, "🔧 开始初始化WiFi系统");// 第1步:初始化网络接口层ESP_ERROR_CHECK(esp_netif_init()); // 初始化TCP/IP网络栈// 第2步:创建默认事件循环ESP_ERROR_CHECK(esp_event_loop_create_default()); // 创建默认事件循环// 第3步:创建默认WiFi STA接口esp_netif_create_default_wifi_sta(); // 创建STA网络接口// 第4步:初始化WiFi驱动wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); // 使用默认WiFi配置ESP_ERROR_CHECK(esp_wifi_init(&cfg));                // 初始化WiFi驱动// 第5步:创建事件组(用于任务间通信)s_wifi_event_group = xEventGroupCreate(); // 创建事件组// 第6步:注册事件处理函数// 注册WiFi事件处理器ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,       // 事件类型:WiFi事件ESP_EVENT_ANY_ID, // 事件ID:所有WiFi事件&event_handler,   // 事件处理函数NULL,             // 用户数据NULL));           // 事件处理器实例// 注册IP事件处理器ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,            // 事件类型:IP事件IP_EVENT_STA_GOT_IP, // 事件ID:获取IP地址&event_handler,      // 事件处理函数NULL,                // 用户数据NULL));              // 事件处理器实例// 注册SmartConfig事件处理器ESP_ERROR_CHECK(esp_event_handler_instance_register(SC_EVENT,         // 事件类型:SmartConfig事件ESP_EVENT_ANY_ID, // 事件ID:所有SC事件&event_handler,   // 事件处理函数NULL,             // 用户数据NULL));           // 事件处理器实例// 第7步:设置WiFi模式并启动ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); // 设置为STA(客户端)模式ESP_ERROR_CHECK(esp_wifi_start());                 // 启动WiFiESP_LOGI(TAG, "✅ WiFi系统初始化完成");
}/** 程序主入口函数** 这是ESP32程序的起始点,完成以下工作:* 1. 初始化NVS存储* 2. 清除之前保存的WiFi配置(可选)* 3. 初始化WiFi系统* 4. 创建SmartConfig配网任务*/
void app_main(void)
{ESP_LOGI(TAG, "ESP32 SmartConfig智能配网程序启动");// 第1步:初始化NVS存储esp_err_t ret = nvs_flash_init(); // 初始化NVSif (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND){ESP_ERROR_CHECK(nvs_flash_erase()); // 如果有问题就擦除ESP_ERROR_CHECK(nvs_flash_init());  // 重新初始化}ESP_LOGI(TAG, "✅ NVS存储初始化完成");// 第2步:清除之前保存的WiFi配置(强制重新配网)// 注意:如果您希望保留之前的WiFi配置,请注释掉下面这行ESP_ERROR_CHECK(nvs_flash_erase_partition("nvs"));ESP_ERROR_CHECK(nvs_flash_init());ESP_LOGI(TAG, "已清除之前的WiFi配置,强制重新配网");// 第3步:初始化WiFi系统wifi_init(); // 调用WiFi初始化函数// 第4步:创建SmartConfig配网任务xTaskCreate(smartconfig_task,   // 任务函数"smartconfig_task", // 任务名称4096,               // 任务堆栈大小(字节)NULL,               // 任务参数3,                  // 任务优先级NULL);              // 任务句柄ESP_LOGI(TAG, "SmartConfig任务已创建");ESP_LOGI(TAG, "系统已准备就绪,等待配网...");
}

总结

通过本篇内容,我们了解了 SmartConfig 智能配网的原理和使用方法。在 ESP32 上利用 SmartConfig,可以让设备在运行时通过手机快速获取 Wi-Fi 凭据,实现 开箱即用 的联网体验。文中介绍了 ESPTouch 和 Airkiss 两种主要协议及其区别,并基于最新 ESP-IDF 提供的 API 展示了如何在代码中集成 SmartConfig 功能。希望通过本文的讲解,开发者可以熟练运用 SmartConfig,为自己的 ESP32 项目实现更加灵活友好的网络配置功能。

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

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

相关文章

CVPR深度学习研究指南:特征提取模块仍是论文创新难点

关注gongzhonghao【CVPR顶会精选】在深度学习赛道里&#xff0c;别只盯着堆模型卷参数了。最近不少高分工作都在打“可解释”这张牌&#xff0c;把原本难以理解的黑箱模型用轻量方法剖开&#xff0c;既能增强学术价值&#xff0c;还能拓展落地场景。更妙的是&#xff0c;这类研…

redis----list详解

列表&#xff08;List&#xff09;相当于数组或者顺序表一、通用命令LPUSH key value1 [value2 ...]在列表 key 的左侧&#xff08;头部&#xff09;插入一个或多个值。示例&#xff1a;LPUSH fruits apple banana → 列表变为 [banana, apple]LPUSHX 只有列表已存在时才会执行…

【python】相机输出图片时保留时间戳数据

有时候需要参考时间戳&#xff0c;写个笔记记录下 但是输出时间可能不稳&#xff0c;有待进一步优化 import cv2 import time import os# 创建一个保存图像的文件夹 output_folder "camera_images" if not os.path.exists(output_folder):os.makedirs(output_folder…

(Nginx)基于Nginx+PHP 驱动 Web 应用(上):配置文件与虚拟主机篇

1.应用场景 主要用于学习基于 Nginx PHP 驱动 Web 应用&#xff08;上&#xff09;&#xff1a; 配置文件与虚拟主机篇&#xff0c;学习弄清楚Nginx的常规操作&#xff0c;之前困惑的地方。 本文主要介绍了基于NginxPHP驱动Web应用的配置方法&#xff0c;重点讲解了Nginx配置…

【golang长途旅行第34站】网络编程

网络编程 基本介绍核心主题&#xff1a;​​ Golang面向大规模后端服务程序的设计目标中&#xff0c;网络通信是必不可少且至关重要的部分。​两种网络编程方式&#xff1a;​​​TCP Socket编程​ •性质&#xff1a;网络编程的主流 •底层协议&#xff1a;基于TCP/IP协议 •举…

Hadoop(六)

目录&#xff1a;1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构

Oracle 12g安装

1. 下载地址 官方网站 一般这种导向的进入的都是oracle的官方网站(先登录&#xff0c;如果没有就创建账号)&#xff0c;并没有真实的12g供你下载。需要你转入Oracle的云中下载&#xff1a;https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 。我选择的是12.1.0.2.0下…

ros2--service/服务--接口

获取service名称const char *get_service_name() const;std::string client_name client_->get_service_name();RCLCPP_INFO(this->get_logger(), "Client name: %s", client_name.c_str());

安卓开发---SimpleAdapter

概念&#xff1a;SimpleAdapter 是 Android 中比 ArrayAdapter 更强大的适配器&#xff0c;用于将复杂的数据绑定到复杂的布局&#xff0c;支持将 Map 中的数据映射到布局中的多个 View。方法签名&#xff1a;public SimpleAdapter( Context context, //上下文 List<? exte…

软考-系统架构设计师 办公自动化系统(OAS)详细讲解

个人博客&#xff1a;blogs.wurp.top 一、OAS的核心概念与演进 1. 什么是OAS&#xff1f; OAS是一个综合性的信息系统&#xff0c;它利用计算机技术、通信技术、系统科学和行为科学&#xff0c;为组织的日常办公事务、信息管理和协同工作提供支持。其本质是将传统办公流程电…

leetcode 155 官方golang标准答案错误

真是误人子弟&#xff0c;leetcode155题官网的golang答案是错误的。push方法的append操作&#xff0c;必然不能保证是o(1)的时间复杂度。就这还是官网的标准答案&#xff0c;就这水平&#xff0c;&#x1f604;leetcode误人子弟不是第一次了。光会刷算法&#xff0c;可惜水平还…

开源 python 应用 开发(十三)AI应用--百度智能云TTS语音合成

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#xf…

大白话说 AI 编程 Trae,小白进!

大家好&#xff0c;我是樱木。 一些小白用户&#xff0c;打开字节出的 AI 编程工具 Trae 时&#xff0c;可能觉得还是有点生疏&#xff0c;但是作为程序员&#xff0c;看到这样的界面分布&#xff0c;已经是在熟悉不过了&#xff0c;甚至心中窃喜&#xff0c;长得和 IDEA 等开…

主流国产数据库:文档完备性

官方文档通常是用户获取数据库产品相关信息最权威的渠道&#xff0c;文档的完备性&#xff08;准确、全面、易用&#xff09;直接影响着开发者的学习成本、项目实施的效率以及后期的运维便利性。 例如&#xff0c;Oracle 数据库的官方文档被广泛认为是行业的黄金标准&#xff…

现今流行的操作系统及其应用场景

2025 年主流操作系统及其应用场景&#xff0c;结合技术趋势与行业实践&#xff0c;涵盖从个人设备到关键基础设施的全场景覆盖&#xff1a;一、桌面与生产力领域1. Windows 11/12&#xff08;微软&#xff09;市场地位&#xff1a;全球桌面市场占比 71%&#xff0c;企业级场景市…

IP v 6

相关概念地址长度128bit&#xff0c;采用冒号划分为8段&#xff0c;并用16进制标识&#xff0c;其容量大到能为地球上的每一粒沙子分配一个地址&#xff0c;通常情况下其网络前缀为64位&#xff0c;接口标识为64位&#xff0c;依照写法可分为首选格式&#xff0c;即完整书写&am…

Elasticsearch冷热架构:性能与成本完美平衡

Elasticsearch 的冷热架构&#xff08;Hot-Warm-Cold Architecture&#xff09;是一种针对时序数据&#xff08;如日志、指标等&#xff09;的成本与性能优化方案&#xff0c;通过将数据在不同生命周期的存储需求分层处理&#xff0c;兼顾性能、容量和成本。其核心思想是&#…

【MFC自动生成的文件详解:YoloClassMFC.cpp 的逐行解释、作用及是否能删除】

大家好&#xff0c;欢迎来到我的MFC编程入门系列。上次我们聊了MFC项目创建后的核心文件区别&#xff08;项目名.cpp、.h、Dlg.cpp 和 Dlg.h&#xff09;&#xff0c;今天针对读者的反馈&#xff0c;专门来拆解其中最重要的一个文件&#xff1a;项目名.cpp&#xff08;这里以用…

玄机靶场 | 冰蝎3.0-jsp流量分析

文章目录一、冰蝎3.0流量特征二、索引三、题目列表步骤#1黑客IP是什么&#xff1f;步骤#2黑客上传的Webshell名是什么&#xff1f;步骤#3黑客上传WebShell的时间是多少&#xff1f;&#xff08;格式如&#xff1a;flag{YYYY-MM-DD HH:MM:SS}&#xff09;步骤#4木马的解密key是什…

基于物理信息神经网络(Physics-Informed Neural Network, PINN)的三维热传导方程求解器MATLAB

代码实现了一个基于物理信息神经网络&#xff08;Physics-Informed Neural Network, PINN&#xff09;的三维热传导方程求解器。以下是详细分析&#xff1a;&#x1f9e0; 一、主要功能 main.m&#xff1a; 构建一个全连接神经网络用于近似三维热传导方程的解 ( u(x, y, z, t) …