ESP32以太网运行时配置库:支持W5500/ENC28J60与Web门户

news2026/3/23 15:04:19
1. 项目概述ESP32_SC_Ethernet_Manager 是一款专为 ESP32-S2、ESP32-S3 和 ESP32-C3 系列微控制器设计的以太网连接与凭证管理库。其核心目标是解决嵌入式设备在部署后因网络环境变更如 IP 地址段调整、DNS 服务器更换、网关迁移或设备物理位置移动而导致的“硬编码配置失效”问题。该库并非一个简单的驱动封装而是一个完整的、面向工程实践的运行时配置系统它将 LwIP 协议栈、W5500/ENC28J60 物理层驱动、Web 配置门户ConfigPortal以及非易失性存储FS有机地整合在一起形成一套开箱即用的解决方案。在工业现场、智能楼宇或农业物联网等实际场景中工程师无法预知设备最终接入的网络细节。传统做法是将 IP、子网掩码、网关等参数写死在固件中一旦网络变更就必须召回设备、重新烧录固件成本高昂且不可持续。ESP32_SC_Ethernet_Manager 的价值正在于此它赋予了设备“自我配置”的能力。设备上电后若检测到无有效网络配置或用户通过物理按键、双击复位等触发机制便会自动启动一个内置的 Web 配置门户。此时任何一台带有浏览器的设备手机、平板、电脑均可通过 Wi-Fi 连接到该门户的 AP 网络并在网页界面上直观地修改所有网络参数操作完成后点击保存设备即可立即应用新配置并尝试连接整个过程无需任何编程知识或专用工具。该库的设计哲学是“最小侵入、最大兼容”。它不强制要求用户使用特定的文件系统SPIFFS、LittleFS、FFat 均可也不绑定于某一种硬件抽象层HAL 或 LL而是通过清晰的接口定义与底层的WebServer_ESP32_SC_W5500或WebServer_ESP32_SC_ENC等基础库协同工作。这种分层架构使得开发者可以专注于业务逻辑而将复杂的网络初始化、状态机管理、HTTP 请求解析等底层细节交由库来处理显著提升了开发效率和代码的可维护性。1.1 系统架构ESP32_SC_Ethernet_Manager 的软件架构遵循经典的分层模型从下至上依次为硬件抽象层 (HAL)直接与 ESP-IDF 的 LwIP 栈和 W5500/ENC28J60 芯片驱动交互。它负责初始化 SPI 总线、配置芯片寄存器、处理中断INT 引脚、收发以太网帧。对于 ESP32-S3其默认 SPI 主机为 HSPIHost 2引脚映射为 MOSI: GPIO11, MISO: GPIO13, SCK: GPIO12, CS: GPIO10, INT: GPIO4。网络协议层基于 ESP-IDF 提供的 LwIP 实现。该层处理 TCP/IP 协议栈的核心功能包括 ARP、ICMP、UDP、TCP 的建立与维护。ESP32_SC_Ethernet_Manager通过调用ethernet_init()和tcpip_init()等标准 API 来启动此层。Web 服务层依赖于WebServer_ESP32_SC_W5500等库提供的WebServer类。它构建了一个轻量级的 HTTP 服务器用于响应来自 ConfigPortal 的所有请求GET /, GET /info, POST /eth_save 等。该层不包含复杂的模板引擎而是采用字符串拼接的方式动态生成 HTML 页面以最大限度地节省内存资源。配置管理层 (Core)这是本库的核心逻辑所在。它定义了ESP32_SC_Ethernet_Manager类该类内部维护着一个状态机管理着设备在STA客户端连接上级网络和AP接入点提供配置门户两种模式间的切换。它封装了所有与配置相关的 API如startConfigPortal()、setSTAStaticIPConfig()、addParameter()等并负责将用户在网页上输入的数据序列化为 JSON 格式持久化到文件系统中。应用接口层 (API)向用户提供一组简洁、语义明确的 C 接口。这些接口隐藏了底层的复杂性例如setSTAStaticIPConfig()函数内部会同时调用 LwIP 的ip_addr_t结构体设置、更新ETH对象的静态地址并确保这些设置在后续的ETH.begin()调用中生效。这种清晰的分层不仅保证了代码的可读性和可测试性也使得库的扩展变得极为简单。例如若未来需要支持新的以太网 PHY 芯片只需实现一个新的硬件抽象层并将其与现有的网络协议层对接上层的应用逻辑无需做任何修改。2. 核心功能与设计理念ESP32_SC_Ethernet_Manager 的核心功能远不止于“让设备连上网”它是一套围绕“配置生命周期管理”构建的完整工具集。其设计理念深刻体现了嵌入式开发中对鲁棒性、灵活性和用户体验的极致追求。2.1 运行时网络配置Runtime Network Configuration这是库最根本的功能。它允许设备在固件烧录后根据实际网络环境动态调整其网络参数。这包括DHCP 与 Static IP 的无缝切换设备可被配置为默认使用 DHCP 获取 IP但用户随时可以通过 ConfigPortal 将其切换为静态 IP反之亦然。这种灵活性对于需要固定 IP 的服务器应用如 Modbus TCP 从站和需要自动获取 IP 的客户端应用如 MQTT 发布者都至关重要。可配置的 DNS 服务器除了主 DNS还支持配置备用 DNSdns2IP当主 DNS 不可用时系统能自动降级到备用 DNS极大提升了域名解析的可靠性。这对于依赖云服务如 ThingSpeak、AWS IoT的设备尤为关键。个性化主机名Hostname遵循 RFC952 标准允许用户为设备设置一个有意义的主机名如Factory-PLC-01而非默认的ESP32-XXXXXX。这在大型网络中进行设备发现和管理时提供了极大的便利。2.2 增强型 Web 配置门户Enhanced ConfigPortalConfigPortal 是用户与设备交互的唯一窗口其体验直接决定了项目的成败。本库对此进行了多项增强Fallback 机制当设备无法连接到预设的网络时它会自动降级为 AP 模式创建一个临时的 Wi-Fi 网络SSID 为设备 Hostname确保用户始终有途径对其进行配置。信息页面Information Page提供详尽的设备诊断信息包括 MAC 地址、当前 IP、连接状态、LwIP 栈版本、SPI 工作频率等是现场排障的第一手资料。CORS跨域资源共享支持通过setCORSHeader()函数可为 ConfigPortal 的 HTTP 响应头添加Access-Control-Allow-Origin字段。这对于需要从外部 Web 应用如一个统一的设备管理平台通过 AJAX 调用 ConfigPortal API 的高级场景是必不可少的。密码保护ConfigPortal 的 AP 网络可设置访问密码防止未经授权的人员随意修改设备配置增强了系统的安全性。2.3 动态参数管理Dynamic Parameter Management这是库最具工程价值的特性之一。它允许开发者将应用层的业务参数如传感器类型、API 密钥、MQTT 服务器地址与网络参数一同纳入 ConfigPortal 的统一管理框架中。其工作流程如下定义参数在代码中声明变量如char thingspeakApiKey[17]。创建参数对象使用ESP32_EMParameter类的构造函数将变量、HTML 标签、占位符等信息封装成一个对象。注册参数调用addParameter()将对象注册到ESP32_SC_Ethernet_Manager实例中。数据持久化在 ConfigPortal 保存后库会自动将所有参数包括网络参数和自定义参数序列化为 JSON 格式并写入文件系统如/eth_cred.dat。启动加载设备每次启动时首先调用readConfigFile()从文件系统中读取 JSON 数据并反序列化回对应的变量从而实现配置的“记忆”。这一机制彻底解耦了配置逻辑与业务逻辑。开发者无需再为每个新参数编写独立的 EEPROM 读写函数所有配置都遵循同一套标准化的流程极大地降低了代码的复杂度和出错概率。2.4 时间同步与本地化NTP Timezone精准的时间戳对于日志记录、定时任务、安全认证等场景至关重要。本库集成了 NTP网络时间协议客户端功能Cloudflare NTP 支持可选择使用 Cloudflare 提供的time.cloudflare.com作为 NTP 服务器其优势在于全球分布、低延迟、高可用。多服务器冗余支持配置多个 NTP 服务器如time.nist.gov,0.pool.ntp.org,1.pool.ntp.org当首选服务器不可达时自动尝试备选提高了时间同步的成功率。时区智能转换库内置了庞大的时区数据库按大洲划分可通过宏USING_AMERICA等开关控制编译体积能够将用户在 ConfigPortal 中选择的时区名称如America/New_York自动转换为 ESP32 所需的 TZ 环境变量格式如EST5EDT,M3.2.0,M11.1.0并调用configTzTime()完成最终配置。这避免了用户手动计算 DST夏令时规则的繁琐工作。3. 关键 API 详解与工程化使用ESP32_SC_Ethernet_Manager类提供了丰富且语义清晰的 API理解其设计意图和正确用法是成功集成该库的关键。以下是对核心 API 的深度解析。3.1 初始化与配置 APIESP32_SC_Ethernet_Manager(const char* hostname)这是最常用的构造函数。hostname参数用于设置设备的 RFC952 兼容主机名。该主机名不仅用于 ConfigPortal 的 AP SSID更会在设备成功连接到网络后作为其在局域网内的标识mDNS 解析的基础。例如ESP32_SC_Ethernet_Manager(MySensorNode)将使设备在网络中可被解析为MySensorNode.local。setSTAStaticIPConfig(const ETH_STA_IPConfig config)此函数用于配置 STA 模式的静态 IP。其参数是一个结构体ETH_STA_IPConfig定义如下typedef struct { IPAddress _sta_static_ip; IPAddress _sta_static_gw; IPAddress _sta_static_sn; #if USE_CONFIGURABLE_DNS IPAddress _sta_static_dns1; IPAddress _sta_static_dns2; #endif } ETH_STA_IPConfig;工程要点该函数必须在startConfigPortal()之前调用。其作用是为 ConfigPortal 的“静态 IP 配置表单”提供一个初始值。如果用户在 ConfigPortal 中选择了 DHCP则此配置会被忽略如果用户选择了静态 IP则此配置会被用户输入的值覆盖。因此它本质上是为用户提供一个“默认值”和“编辑起点”。setConfigPortalTimeout(uint16_t seconds)此函数用于设置 ConfigPortal 的超时时间。这是一个至关重要的鲁棒性设计。在无人值守的现场如果设备因误操作进入了 ConfigPortal而无人去关闭它设备将永远卡在 Portal 中无法执行任何业务逻辑。通过设置超时如setConfigPortalTimeout(120)设备将在 120 秒后自动退出 Portal 并尝试使用已有的配置连接网络。注意此超时仅在 Portal 启动后、用户尚未访问其 Web 界面时生效一旦用户打开了 Portal 页面超时将被暂停直到用户点击“Save”或“Exit”。3.2 ConfigPortal 控制 APIstartConfigPortal()这是启动配置门户的入口函数。其返回值为booltrue表示 Portal 成功启动并完成了配置用户点击了 Savefalse表示 Portal 被超时或用户主动退出。在典型的ConfigOnSwitch示例中其调用逻辑如下// 检测到配置请求如按键按下 if (digitalRead(TRIGGER_PIN) LOW) { // ... 初始化 ... if (!ESP32_SC_Ethernet_manager.startConfigPortal()) { Serial.println(Config Portal exited without saving. Continuing with stored config.); } else { Serial.println(Config saved successfully!); } }setSaveConfigCallback(std::functionvoid(void) func)这是一个回调函数注册 API。当用户在 ConfigPortal 中完成所有配置包括网络和自定义参数并点击“Save”后库会自动调用此回调。其典型用途是设置一个标志位通知主循环需要将新配置持久化到文件系统。bool shouldSaveConfig false; void saveConfigCallback() { Serial.println(Should save config); shouldSaveConfig true; } // 在 setup() 中注册 ESP32_SC_Ethernet_manager.setSaveConfigCallback(saveConfigCallback); // 在 loop() 中检查并执行 if (shouldSaveConfig) { writeConfigFile(); // 将所有参数写入 FS shouldSaveConfig false; }3.3 动态参数 APIESP32_EMParameter构造函数该类是动态参数的核心。它提供了两个主要的构造函数分别用于简单类型和复杂类型如复选框简单类型文本输入框ESP32_EMParameter(const char *id, const char *placeholder, const char *defaultValue, int length);id: 该参数在 JSON 中的键名也是 HTMLinput元素的id属性必须全局唯一。placeholder: 输入框的提示文字。defaultValue: 初始值通常是一个指向char[]变量的指针。length: 该参数的最大长度字节数。复杂类型复选框、下拉菜单等ESP32_EMParameter(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom, int labelPlacement);custom: 一段自定义的 HTML 字符串用于生成控件。例如typecheckbox checked会生成一个默认勾选的复选框。labelPlacement: 指定标签placeholder相对于控件的位置WFM_LABEL_AFTER表示标签在控件之后。addParameter(ESP32_EMParameter* p)此函数用于将一个ESP32_EMParameter对象注册到 ConfigPortal 中。关键工程实践所有addParameter()调用必须在startConfigPortal()之前完成。库在启动 Portal 时会遍历所有已注册的参数并将它们渲染到 HTML 表单中。4. 文件系统FS与 JSON 配置持久化在嵌入式系统中如何可靠、高效地将配置数据存储到非易失性存储器中是一个永恒的挑战。ESP32_SC_Ethernet_Manager 采用了 JSON 格式 文件系统FS的组合方案这是一种在可读性、灵活性和资源占用之间取得优秀平衡的选择。4.1 文件系统选择与初始化库本身不绑定于某一种文件系统而是通过一个FS*类型的指针filesystem来实现抽象。开发者需要根据所使用的 ESP32 核心版本和硬件平台手动选择并初始化合适的 FSLittleFS推荐用于 ESP32-S3 等较新平台。它具有优秀的磨损均衡和掉电安全特性。初始化代码如下#include LittleFS.h FS* filesystem LittleFS; #define FileFS LittleFS #define FS_Name LittleFSSPIFFS适用于较老的 ESP32 核心版本。初始化代码如下#include SPIFFS.h FS* filesystem SPIFFS; #define FileFS SPIFFS #define FS_Name SPIFFS重要工程提示在setup()中首次使用 FS 前强烈建议调用filesystem-begin()进行初始化并检查其返回值。如果返回false通常意味着文件系统未被格式化此时可根据需求决定是否调用filesystem-format()进行格式化生产环境中应谨慎。4.2 JSON 配置文件的读写库的示例代码展示了使用 ArduinoJson 库v6.x进行 JSON 序列化/反序列化的标准流程。其核心在于writeConfigFile()和readConfigFile()两个函数。writeConfigFile()流程解析创建 JSON 文档DynamicJsonDocument json(1024);创建一个容量为 1024 字节的动态 JSON 文档。这个大小需要根据实际配置参数的数量和长度仔细估算过小会导致序列化失败过大则浪费宝贵的 RAM。填充 JSON 数据使用json[key] value;语法将所有需要保存的参数网络参数和自定义参数填入文档。打开文件File f FileFS.open(CONFIG_FILE, w);以写入模式打开配置文件。CONFIG_FILE通常定义为/eth_cred.dat。序列化并写入serializeJson(json, f);将内存中的 JSON 文档直接写入文件句柄f。关闭文件f.close();这一步至关重要它会触发文件系统的缓冲区刷新flush确保数据真正写入闪存。遗漏此步将导致数据丢失。readConfigFile()流程解析打开文件File f FileFS.open(CONFIG_FILE, r);以只读模式打开配置文件。读取文件内容由于文件大小未知代码采用先获取文件大小f.size()再动态分配足够内存std::unique_ptrchar[] buf(new char[size 1])最后f.readBytes(buf.get(), size)的方式将整个文件内容读入内存缓冲区。反序列化 JSONdeserializeJson(json, buf.get());将内存中的 JSON 字符串解析回DynamicJsonDocument对象。提取参数值使用json.containsKey(key)进行健壮性检查确认键存在后再通过json[key]获取值并赋给对应的 C 变量。例如strcpy(thingspeakApiKey, json[ThingSpeakAPI_Label]);。工程最佳实践在readConfigFile()的末尾应加入一个“配置校验”步骤。例如检查读取到的stationIP是否为一个有效的 IPv4 地址非0.0.0.0或者检查thingspeakApiKey的长度是否在合理范围内。如果校验失败应视为配置文件损坏此时应跳过加载使用代码中的默认值并可选择性地删除损坏的配置文件以避免下次启动时重复失败。5. 硬件连接与平台适配指南成功的软件离不开可靠的硬件基础。ESP32_SC_Ethernet_Manager 库对 W5500 和 ENC28J60 两种主流以太网 PHY 芯片提供了原生支持但它们的硬件连接细节存在差异必须严格遵循。5.1 ESP32-S3 与 W5500/ENC28J60 的标准连接根据 README 文档ESP32-S3 开发板如 ESP32S3_DEV与 W5500 或 ENC28J60 模块的标准连接方式如下表所示W5500/ENC28J60 引脚ESP32-S3 引脚说明MOSIGPIO11主机输出从机输入。SPI 数据线。MISOGPIO13主机输入从机输出。SPI 数据线。SCKGPIO12SPI 时钟信号。SS / CSGPIO10片选信号。低电平有效。INTGPIO4中断请求信号。W5500/ENC28J60 通过此引脚向 ESP32-S3 发送事件通知如数据包到达。此引脚必须连接否则库无法正常工作。RSTRST复位信号。可连接到 ESP32-S3 的 RST 引脚或由 MCU 软件控制。GNDGND公共地。3.3V3.3V电源。W5500/ENC28J60 为 3.3V 器件严禁连接 5V关键工程验证点INT 引脚这是最容易被忽视的关键点。如果INT引脚未连接或连接错误库将无法及时获知网络事件导致ETH.connected()始终返回false或数据接收出现严重延迟。在调试时可使用万用表的通断档确认INT引脚与 ESP32-S3 的 GPIO4 在物理上是导通的。SPI 时钟频率库在初始化时会将 SPI 时钟设置为 8MHzW5500或 25MHzENC28J60。如果遇到通信不稳定可在WebServer_ESP32_SC_W5500库的源码中将SPI_CLOCK_MHZ宏的值适当降低如改为 4以换取更高的稳定性。5.2 平台与核心版本兼容性库的 README 明确指出它支持 ESP32-S2/S3/C3 系列并对不同版本的 Arduino-ESP32 核心有特定要求Arduino IDE: 需要 1.8.19 版本。ESP32 Core: 需要 2.0.5 版本。这是一个硬性要求因为库大量使用了该版本中引入的 LwIP 新特性如eth_config_t结构体和更稳定的 Ethernet API。文件系统库对于 LittleFS库要求 ESP32 Core 1.0.6 或 2.0.0因为这些版本已将LittleFS.h作为核心库的一部分。如果使用旧版核心1.0.6则必须手动安装第三方LITTLEFS库。工程化升级策略在项目初期应将 Arduino-ESP32 核心升级到最新稳定版。虽然新版本可能引入一些细微的 API 变更但其带来的稳定性提升、Bug 修复和新功能支持远大于升级成本。升级后务必重新编译并全面测试所有功能特别是网络连接和 ConfigPortal 的稳定性。6. 调试、排障与性能优化在嵌入式开发中“调试”往往占据了项目周期的大部分时间。掌握一套高效的调试方法论是每个工程师的必备技能。6.1 系统级调试技巧库默认启用了串口调试输出Serial其日志级别可通过_ESP32_ETH_MGR_LOGLEVEL_宏进行控制0-4数值越大日志越详细。在setup()中可通过以下方式关闭调试输出以节省资源ESP32_SC_Ethernet_manager.setDebugOutput(false);典型排障流程现象ConfigPortal 无法打开。首先检查串口日志看是否有ETH Started和RFC925 Hostname ...等成功初始化日志。如果没有问题出在硬件连接或 LwIP 初始化阶段。重点检查INT引脚和CS引脚的连接。现象能打开 Portal但无法保存配置。查看日志中是否有ETH save和Sent eth save page这表明 POST 请求已收到。如果没有问题可能出在 WebServer 层。如果有但后续没有getSTAStaticIPConfig等日志则问题出在配置保存逻辑或文件系统写入环节。此时应检查writeConfigFile()的返回值。现象保存后设备重启但 IP 未改变。这通常是因为ETH.localIP()返回的 IP 与新配置的 IP 相同导致ESP.restart()未被触发。可在loop()中添加Serial.print(Current IP: ); Serial.println(ETH.localIP());进行确认。6.2 内存与性能优化ESP32-S3 的 RAM 资源约 320KB虽比前代丰富但对于运行 LwIP、WebServer 和 JSON 解析的复合应用仍需精打细算。JSON 文档大小DynamicJsonDocument json(1024)是一个常见的内存“黑洞”。对于只有几个简单参数的小型项目可将其减小到512或256。应使用json.memoryUsage()函数在调试时打印其实际内存占用以精确评估。ArduinoJson 版本库支持 ArduinoJson v5 和 v6。v6 在内存管理和 API 设计上更为先进强烈推荐使用 v6。v5 的DynamicJsonBuffer在某些情况下可能导致栈溢出。NTP 时区数据库时区数据库是另一个内存大户。库通过USING_AMERICA、USING_EUROPE等宏进行条件编译。在产品化时务必只启用设备实际部署区域的宏。例如一个销往北美的产品应只保留#define USING_AMERICA true其余全部设为false此举可节省数 KB 的 Flash 空间。6.3 ADC 与 WiFi/BT 共存问题这是一个 ESP32 系列芯片特有的硬件限制与本库的以太网功能无直接关系但因其普遍性必须在此强调。ESP32 拥有两个 ADCADC1 和 ADC2。其中ADC2 被 WiFi/BT 模块内部占用。因此任何使用 ADC2 的引脚GPIO0, 2, 4, 12-15, 25-27在 WiFi/BT 开启时都无法进行模拟读取。解决方案是首选方案改用 ADC1 的引脚GPIO32-GPIO39。次选方案如果必须使用 ADC2 引脚则需在analogRead()之前通过adc2_config_width()和adc2_config_channel_atten()等函数手动获取并释放 ADC2 的锁。但这需要深入理解 ESP-IDF 的底层驱动风险较高不推荐在产品中使用。这一限制提醒我们在进行硬件原理图设计时就应将模拟信号采集电路规划在 ADC1 的引脚上从源头规避此问题。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…