AutoConnect:ESP32/ESP8266 运行时 Wi-Fi 配网与 OTA 一体化方案

news2026/3/28 0:05:18
1. AutoConnect 库深度技术解析面向嵌入式工程师的 ESP32/ESP8266 运行时 Wi-Fi 配置系统AutoConnect 是一个专为 ESP32 和 ESP8266 平台设计的 Arduino 库其核心目标是在设备运行时runtime通过 Web 界面完成 Wi-Fi 网络的动态配置与连接管理。它并非一个简单的 HTTP 服务器封装而是一个完整的、可嵌入的、生产就绪的“Wi-Fi 配置子系统”。对于嵌入式工程师而言AutoConnect 的价值在于它将复杂的网络状态机、Web 服务、存储管理、用户交互和 OTA 更新等模块进行了高度工程化整合使开发者能以极低的认知负荷将“零配置”能力注入到任何基于 ESP 的固件中。该库的设计哲学是“不侵入、可共生、易扩展”。它不强制要求项目采用特定的架构模式而是作为一层轻量级的胶水逻辑无缝集成到已有的 Web 服务框架中。无论是使用ESP8266WebServerESP8266还是WebServerESP32AutoConnect 都能复用现有对象或自行创建并托管。这种设计避免了资源冲突也使得它能与 MQTT 客户端、HTTP 客户端、传感器数据采集等业务逻辑共存于同一固件中而无需重构整个软件栈。1.1 核心功能与工程定位AutoConnect 的核心功能可归纳为以下五个相互支撑的工程模块模块工程目的关键技术实现动态 Wi-Fi 配置解决硬编码 SSID/PSK 带来的部署僵化问题支持现场快速入网基于 SoftAP Captive Portal 的双模网络发现与连接流程自动扫描、列表呈现、凭据输入与验证持久化凭据管理确保设备断电重启后能自动恢复连接提升产品鲁棒性EEPROMESP8266或 PreferencesESP32存储支持多组凭据备份与恢复凭据加密可选Web UI 扩展框架允许开发者将自定义业务页面无缝接入 AutoConnect 菜单体系AutoConnectAux类提供页面注册、参数传递与值获取支持 JSON 描述符加载解耦 HTML 与 C 逻辑内置 OTA 更新将固件升级能力下沉为平台级功能降低应用层开发复杂度AutoConnectOTA模块集成ESP8266HTTPUpdateServer/Update支持进度反馈、状态回调与错误处理状态感知与容错在弱网、断连、AP 切换等异常场景下保持服务可用性whileConnecting、whileCaptivePortal等生命周期钩子autoReconnect自动重连策略portalTimeout与retainPortal超时控制从嵌入式系统工程角度看AutoConnect 的本质是一个状态驱动的 Web 服务中间件。它接管了 Wi-Fi 连接状态机WL_CONNECTED,WL_CONNECT_FAILED,WL_NO_SSID_AVAIL等与 Web 请求处理handleClient()之间的映射关系并将这一映射逻辑封装为可配置、可扩展的 API。这使得开发者无需再手动编写if (WiFi.status() ! WL_CONNECTED) { portal.handleClient(); }这类脆弱的状态判断代码而是通过AutoConnect::begin()一次性声明意图由库内部完成所有状态流转与页面调度。1.2 系统架构与数据流AutoConnect 的整体架构遵循清晰的分层原则各层职责明确接口定义严谨------------------------------------------------- | Application Sketch | ← 用户业务逻辑 | (e.g., sensor reading, MQTT publishing) | ------------------------------------------------ ↓ ------------------------------------------------ | AutoConnect Core (AutoConnect) | ← 主控逻辑状态机、菜单路由、凭据管理 | - WiFi connection state management | | - Captive Portal SoftAP control | | - Credential storage/load (EEPROM/Preferences)| | - Menu URI routing (/ac, /_ac/config, etc.) | ------------------------------------------------ ↓ ------------------------------------------------ | Web Server Abstraction Layer | ← Web 服务适配层 | - ESP8266: ESP8266WebServer | | - ESP32: WebServer | | - Handles HTTP requests, serves static pages | ------------------------------------------------ ↓ ------------------------------------------------ | Custom Web Pages (AutoConnectAux) | ← 用户扩展层业务页面 | - Dynamically loaded HTML forms | | - JSON-based element definition (PROGMEM/SPIFFS)| | - Parameter binding value retrieval | ------------------------------------------------ ↓ ------------------------------------------------ | OTA Update Engine (AutoConnectOTA) | ← 固件更新引擎 | - HTTP-based firmware upload flash | | - Progress notification status callback | | - Partition validation error recovery | ------------------------------------------------关键数据流示例用户首次连接流程启动与检测调用ac.begin()后库首先执行WiFi.begin()。若未预设凭据或连接失败则自动进入 SoftAP 模式。Captive Portal 触发设备启动 SoftAP默认 SSIDESP_XXXXXX并启动内置 DNS/DHCP 服务。当手机浏览器访问任意 HTTP 地址时DNS 将请求重定向至 SoftAP 的 IP如172.217.28.1触发 Captive Portal 页面加载。用户交互用户在/ac页面看到“Configure New AP”菜单点击后进入扫描列表页。选择目标 SSID输入 PSK提交表单。凭据存储与连接AutoConnect接收 POST 数据校验格式后将 SSID/PSK 加密若启用并写入非易失存储。随后调用WiFi.begin(ssid, psk)尝试连接。状态反馈连接成功后SoftAP 自动关闭设备切换为 Station 模式。AutoConnect会根据bootUri配置重定向用户至/或/ac主页显示连接成功的状态。此流程完全自动化开发者仅需关注ac.begin()和ac.handleClient()两个 API其余所有网络协议栈交互、HTML 渲染、存储 I/O 均由库内部完成。2. API 接口详解与工程化使用指南AutoConnect 的 API 设计体现了典型的嵌入式 C 风格简洁、明确、无隐藏副作用。所有核心类均采用单例或 RAII 模式管理资源避免内存泄漏。2.1 主控类AutoConnectAutoConnect是整个库的入口点负责初始化、状态管理与主循环调度。2.1.1 构造与初始化// 方式1复用已有 WebServer 对象推荐资源最省 #include WebServer.h // or ESP8266WebServer.h WebServer server(80); AutoConnect ac(server); // 方式2由 AutoConnect 自行创建更简单但占用额外 RAM AutoConnect ac; void setup() { Serial.begin(115200); // 必须先初始化 WiFi否则 begin() 会失败 WiFi.mode(WIFI_STA); // 初始化 AutoConnect if (!ac.begin()) { Serial.println(AutoConnect failed to start); } }begin()函数是核心初始化函数其行为受AutoConnectConfig配置影响。若config.autoReconnect true则begin()会尝试加载上次保存的凭据并连接若config.immediateStart true则跳过WiFi.begin()直接启动 SoftAP。2.1.2 生命周期钩子Critical for RobustnessAutoConnect 提供了多个onXXX回调函数允许开发者在关键状态节点插入自定义逻辑这是实现高可靠性产品的基石。钩子函数触发时机典型工程用途示例代码片段onConnect(AutoConnectCallback_t func)Wi-Fi 成功连接到 AP 后立即调用初始化 MQTT 客户端、启动传感器采样任务、发送上线通知ac.onConnect([](){ mqttClient.connect(); });onDisconnect(AutoConnectCallback_t func)Wi-Fi 断开连接时调用清理网络资源、进入低功耗模式、记录日志ac.onDisconnect([](){ Serial.println(WiFi disconnected); });whileConnecting(AutoConnectCallback_t func)正在等待 Wi-Fi 连接结果期间周期性调用默认 1s显示连接进度LED 闪烁、更新 OLED 屏幕、检查看门狗ac.whileConnecting([](){ ledBlink(1); });whileCaptivePortal(AutoConnectCallback_t func)Captive Portal 页面被访问期间周期性调用监控 SoftAP 连接数、动态生成 AP 列表、实现超时自动关机ac.whileCaptivePortal([](){ if (WiFi.softAPgetStationNum() 0) softAPShutdown(); });工程提示whileConnecting和whileCaptivePortal是解决“假死”问题的关键。许多项目在WiFi.begin()后陷入无限等待导致看门狗复位。使用whileConnecting可以在等待期间执行其他任务保证系统响应性。2.1.3 核心状态查询与控制// 获取当前连接状态返回 WL_Status_t WL_Status_t status ac.status(); // 获取当前连接的 SSID 和 IP 地址 String ssid ac.ssid(); IPAddress ip ac.IPAddress(); // 强制启动 Captive Portal例如长按按钮触发配网 ac.portal(); // 获取当前凭据返回 AutoConnectCredential 对象 AutoConnectCredential cred ac.getCurrentCredential(); // 获取已保存的凭据列表返回 std::vectorAutoConnectCredential std::vectorAutoConnectCredential creds ac.getCredentials();ac.status()返回的是底层WiFi.status()的值因此可以直接用于标准的 Wi-Fi 状态判断逻辑与现有代码完全兼容。2.2 配置类AutoConnectConfigAutoConnectConfig是 AutoConnect 的“控制面板”所有行为均由其成员变量决定。理解其配置项是定制化开发的前提。AutoConnectConfig config; config.apid MyDevice; // SoftAP 的 SSID 名称 config.psk 12345678; // SoftAP 的密码默认无密码 config.autoReconnect true; // 连接失败后是否自动扫描并重试 config.immediateStart false; // 是否跳过 WiFi.begin()直接启动 Portal config.bootUri /; // 连接成功后重定向的 URI config.preserveIP true; // 连接成功后是否保留 DHCP 分配的 IP避免因 IP 变化导致服务中断 config.portalTimeout 300; // Captive Portal 自动关闭超时秒 config.retainPortal true; // Portal 关闭后是否保留 SoftAP便于后续快速重配 config.hostName mydevice; // 设置设备主机名用于 mDNS 解析如 mydevice.local ac.config(config); // 应用配置关键配置项深度解析preserveIP true此选项对工业物联网设备至关重要。当设备作为 Web 服务器或 MQTT Broker 时IP 地址的变动会导致客户端连接中断。启用此选项后AutoConnect 会将 DHCP 获取的 IP 地址缓存并在下次连接时通过WiFi.config(ip, gateway, subnet)强制使用该 IP从而实现“伪静态 IP”。portalTimeout与retainPortal二者组合可实现灵活的配网策略。例如设置portalTimeout120且retainPortalfalse表示 Portal 仅在 2 分钟内有效超时后 SoftAP 自动关闭防止设备长期暴露在不安全的 AP 模式下。2.3 扩展类AutoConnectAux与自定义 Web 页面AutoConnectAux是 AutoConnect 最强大的扩展机制它允许开发者将任意 HTML 表单作为菜单项集成到 AutoConnect 系统中并与 C 代码进行双向数据绑定。2.3.1 创建与注册自定义页面// 定义一个名为 ledControl 的页面 AutoConnectAux ledPage(/led, LED Control); // 使用 HTML 字符串适用于简单页面 ledPage.load(Rrawliteral( h2LED Control Panel/h2 labelinput typecheckbox nameledState Turn LED ON/labelbr labelBrightness: input typerange namebrightness min0 max255 value128/labelbr button typesubmitApply/button )rawliteral); // 或者使用 JSON 描述符推荐结构清晰易于维护 const char* ledJson Rjson({ ledState: {type: CHECKBOX, value: true}, brightness: {type: RANGE, min: 0, max: 255, value: 128} })json; ledPage.loadElement(ledJson); // 将页面注册到 AutoConnect 菜单 ac.add(ledPage);loadElement()接受 JSON 字符串其结构严格对应AutoConnectElement的类型系统。每个键如ledState将成为表单元素的name属性也是后续在 C 中获取值的键名。2.3.2 在handleClient()中处理表单提交void loop() { ac.handleClient(); // 此调用会自动处理所有 AutoConnect 页面的请求 // 处理自定义页面的提交数据 if (ledPage.loaded()) { // 获取表单值 String ledStateStr ledPage.getElement(ledState)-value; bool ledState (ledStateStr true); int brightness ledPage.getElement(brightness)-value.toInt(); // 执行业务逻辑 digitalWrite(LED_PIN, ledState ? HIGH : LOW); analogWrite(LED_PIN, brightness); // 重定向回页面显示操作结果 ledPage.redirect(/led?success1); } }ledPage.loaded()是一个关键的工程化设计。它返回true当且仅当当前 HTTP 请求是针对该AutoConnectAux页面的POST提交。这使得开发者可以将业务逻辑与 Web 请求处理完全解耦无需在handleClient()内部进行复杂的 URI 解析和方法判断。2.3.3 JSON 描述符的工程优势将 UI 描述与业务逻辑分离带来了显著的工程优势前端/后端分离UI 设计师可独立修改 JSON 文件无需触碰 C 代码。资源优化JSON 可存储在PROGMEMFlash中避免占用宝贵的 RAM。动态加载可从 SPIFFS 或 SD 卡读取 JSON实现 UI 的远程更新。// 从 SPIFFS 加载 JSON File jsonFile SPIFFS.open(/led.json, r); if (jsonFile) { String jsonContent jsonFile.readString(); ledPage.loadElement(jsonContent.c_str()); jsonFile.close(); }3. 存储与凭据管理EEPROM 与 Preferences 的深度实践AutoConnect 的凭据存储是其“零配置”特性的物理基础。理解其存储机制是进行产品量产和固件升级的关键。3.1 存储介质与 API 抽象AutoConnect 对存储层进行了良好的抽象屏蔽了 ESP8266 与 ESP32 的差异平台默认存储介质对应 Arduino API存储容量限制AutoConnect 封装ESP8266EEPROMEEPROM.put(),EEPROM.get()512 字节默认AutoConnectCredential类统一序列化/反序列化ESP32Preferencespreferences.putString(),preferences.getString()仅受 Flash 分区大小限制AutoConnectCredential类统一序列化/反序列化AutoConnectCredential是凭据的核心数据结构其定义如下简化版struct AutoConnectCredential { char ssid[33]; // SSID最大32字符1终止符 char password[65]; // PSK最大64字符1终止符 uint8_t channel; // AP 信道0 表示自动 uint8_t rssi; // 信号强度dBm uint8_t flags; // 标志位如是否为 Open AP IPAddress ip; // 静态 IP若配置 IPAddress gateway; // 网关 IPAddress subnet; // 子网掩码 };所有字段均被精心设计为固定长度确保序列化后的二进制数据大小可预测便于在有限的 EEPROM 空间内进行高效管理。3.2 凭据操作的完整生命周期3.2.1 保存凭据save()当用户在/ac页面提交新的 SSID/PSK 后AutoConnect 会调用AutoConnectCredential::save()。该函数执行以下步骤校验检查 SSID 长度1-32 字符、PSK 长度对于 WPA2建议 8-63 字符。加密可选若启用了AUTOCONNECT_ENCRYPT_CREDENTIAL宏则使用 AES-128 对凭据进行加密。写入将结构体数据put()到 EEPROM 或putString()到 Preferences 的指定 Key如ac_credential_0。索引更新更新内部索引表记录该凭据的存储位置和元数据。3.2.2 加载凭据load()ac.begin()或ac.getCredentials()会触发凭据加载遍历索引读取所有可能的凭据 Keyac_credential_0到ac_credential_N。完整性校验检查每个凭据的 CRC 校验和若启用过滤掉损坏或无效的数据。反序列化将二进制数据get()或getString()后memcpy到AutoConnectCredential实例中。排序根据 RSSI 或时间戳对凭据列表进行排序确保最佳连接项排在前面。3.2.3 工程实践凭据备份与迁移在产品迭代中常需将旧版固件的凭据迁移到新版。AutoConnect 提供了工具支持ESP32 凭据迁移v1.0.0 版本起ESP32 不再使用 EEPROM而是使用 Preferences。库提供了专门的迁移草图examples/ESP32/CredentialMigrate该草图会读取旧 EEPROM 分区中的凭据并将其写入新的 Preferences 分区。凭据备份/恢复v1.4.0 引入了backup()和restore()API允许开发者将凭据导出为 Base64 编码的字符串存储在云端或本地文件中实现跨设备的配置同步。// 备份所有凭据 String backupData ac.backup(); // 恢复凭据从字符串 ac.restore(backupData);4. OTA 更新集成从概念到生产就绪AutoConnect 内置的 OTA 功能 (AutoConnectOTA) 是其区别于其他配网库的核心竞争力之一。它不是一个简单的Update封装而是一个具备完整用户体验的固件更新子系统。4.1AutoConnectOTA的工作原理AutoConnectOTA的设计遵循“最小权限、最大反馈”原则最小权限它只监听/updateURI不干涉其他任何 Web 路由。上传的.bin文件被直接写入 Flash 的 OTA 分区不经过 RAM 缓存极大降低了内存压力。最大反馈提供详细的进度条、状态消息Verifying...,Writing to flash...,Restarting...和错误代码ERR_001: Invalid partition。其核心流程如下用户在 AutoConnect 菜单中点击 “Update Firmware”。浏览器加载/update页面该页面包含一个form enctypemultipart/form-data。用户选择.bin文件并提交AutoConnectOTA的handleUpload()被触发。handleUpload()调用Update.begin(UPDATE_SIZE_UNKNOWN)然后循环调用Update.write()将接收到的 chunk 数据写入 Flash。写入完成后调用Update.end()并返回重定向指令触发设备重启。4.2 生产环境 OTA 配置要点要使 OTA 在生产环境中稳定可靠必须进行以下关键配置4.2.1 Flash 分区规划ESP32ESP32 的 OTA 分区大小是 OTA 成功的前提。默认的default_1MB分区方案中OTA 分区仅为 448KB对于复杂固件往往不够。必须在 Arduino IDE 中调整菜单路径Tools Partition Scheme Huge APP (3MB No OTA)或自定义分区在partitions.csv中明确定义nvs, data, nvs, 0x9000, 0x6000, otadata, data, ota, 0xf000, 0x2000, app0, app, ota_0, 0x10000, 0x1C0000, app1, app, ota_1, 0x1D0000, 0x1C0000, spiffs, data, spiffs, 0x390000, 0x70000,4.2.2 OTA 状态回调v1.3.0AutoConnectOTA提供了onProgress()和onError()回调使开发者能将 OTA 状态与硬件状态联动AutoConnectOTA ota(ac); ota.onProgress([](uint32_t progress, uint32_t total) { // 更新 OLED 屏幕上的进度条 oled.drawProgressBar(0, 0, 128, 10, progress * 100 / total); // 控制 LED 指示灯 ledSetBrightness(progress * 255 / total); }); ota.onError([](int error) { // 错误代码 1-5 对应不同失败原因 switch (error) { case 1: Serial.println(Invalid partition); break; case 2: Serial.println(Not enough space); break; default: Serial.printf(OTA Error: %d\n, error); } });4.2.3 安全加固HTTP 认证通过AutoConnectConfig::httpAuth启用 Basic Auth防止未授权的固件上传。签名验证虽然 AutoConnect 本身不提供签名但可在onProgress回调中在Update.write()之前对整个固件镜像进行 SHA256 校验确保来源可信。5. 高级工程实践与常见问题规避5.1 内存优化AutoConnectCore的使用对于资源极度受限的项目如使用 1MB Flash 的 ESP8266AutoConnect 的完整版可能超出内存预算。v1.4.0 引入的AutoConnectCore是一个精简版本它移除了AutoConnectAux、AutoConnectOTA等高级功能仅保留最核心的 Wi-Fi 配置与凭据管理可将二进制大小减少 30% 以上。// 使用 AutoConnectCore 替代 AutoConnect #include AutoConnectCore.h AutoConnectCore ac;5.2 与 FreeRTOS 的协同在 ESP32 上若项目使用 FreeRTOSac.handleClient()应在专用任务中运行以避免阻塞高优先级任务void webServerTask(void* pvParameters) { for(;;) { ac.handleClient(); vTaskDelay(1); // 释放 CPU 时间片 } } void setup() { xTaskCreatePinnedToCore( webServerTask, /* Task function. */ webServer, /* String with name of task. */ 8192, /* Stack size in words. */ NULL, /* Parameter passed into the task. */ 1, /* Priority of the task. */ NULL, /* Task handle. */ ARDUINO_RUNNING_CORE ); }5.3 常见陷阱与规避方案问题现象根本原因解决方案编译报错no member named printToArduinoJson v5 与 v6 的 API 不兼容在platformio.ini中添加lib_deps ArduinoJson^6.19.4或定义#define AUTOCONNECT_NOUSE_JSON禁用 JSON 功能OTA 上传后设备无法启动新固件的分区大小超过了 OTA 分区容量严格检查platformio.ini中的board_build.partitions确保app1分区足够大在platformio.ini中添加build_flags -DARDUINOJSON_ENABLE_ARDUINO_STRING1Captive Portal 在 iOS 15 上不弹出苹果系统对 DNS 重定向的策略变更升级 AutoConnect 至 v1.4.2库已内置修复将 SoftAP IP 改为172.217.28.1并优化了 DNS 响应头ac.begin()后串口无输出设备“卡死”WiFi.begin()在无 AP 时会阻塞长达 30 秒在setup()中在ac.begin()前先调用WiFi.mode(WIFI_OFF)或在AutoConnectConfig中设置immediateStart true5.4 硬件兼容性与实测平台AutoConnect 经过广泛的硬件平台测试其稳定性已在多个商业产品中得到验证。以下是官方支持并经实测的典型平台ESP8266NodeMCU 1.0 (ESP-12E), Wemos D1 Mini, Olimex MOD-WIFI-ESP8266, Heltec WiFi Kit 8。ESP32ESP32DevKitC, Wemos LOLIN32, Heltec WiFi Kit 32, M5Stack Core, TinyPICO。在这些平台上AutoConnect 的典型内存占用为RAM (Heap)约 12-18 KB取决于启用的功能和页面数量。Flash完整版约 180-220 KBAutoConnectCore约 120-140 KB。对于一个典型的传感器节点固件含 MQTT、HTTPS 客户端启用 AutoConnect 后总 Flash 占用通常在 800-1000 KB 范围内完全适配主流的 4MB Flash 模块。6. 结语构建可交付的嵌入式 Wi-Fi 体验AutoConnect 的价值远不止于一个“让设备连上 Wi-Fi”的库。它是一套经过千锤百炼的、面向嵌入式产品交付的 Wi-Fi 体验工程规范。它将“配网”这一原本需要大量胶水代码、状态机和 UI 开发的复杂任务封装成ac.begin()和ac.handleClient()两个原子操作。它提供的whileConnecting钩子解决了无数项目中因WiFi.begin()阻塞而导致的看门狗复位问题它内置的 OTA让固件升级从一个需要专业烧录器的“工厂行为”变成了用户在手机上点几下的“日常操作”。对于一名嵌入式工程师而言掌握 AutoConnect意味着你拥有了将一个“电子模块”转变为一个“智能设备”的关键能力。它让你能将精力聚焦于传感器数据处理、通信协议解析、低功耗算法等核心价值上而非在 Wi-Fi 连接的泥潭中反复挣扎。当你在下一个项目中面对客户提出的“这个设备怎么连我家的 Wi-Fi”的问题时你不再需要解释复杂的 AT 指令或跳线帽设置而只需微笑着说“打开手机 Wi-Fi找到它的热点点一下输个密码就好了。”——这就是 AutoConnect 所赋予的、最朴实也最强大的工程力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2456117.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…