当前位置: 首页 > article >正文

零知派——ESP32-S3 AI 小智 使用 Preferences NVS 实现Web配网持久化

✔零知派零知开源是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台在硬件上提供超高性价比STM32系列开发板、物联网控制板。取消了Bootloader程序烧录让开发重心从 “配置环境” 转移到 “创意实现”极大降低了技术门槛。零知开源编程软件内置上千个覆盖多场景的示例代码支持项目源码一键下载项目文章在线浏览。零知派(零知开源)平台通过软硬件协同创新让你的创意快速转化为实物来动手试试吧目录一、为什么需要网页配网二、整体架构从 AP 启动到配置保存三、AP 热点与 DNS Captive Portal3.1 启动 AP 热点3.2 DNS Captive Portal 实现四、Web 服务器与 API 设计4.1 建立 Web 服务器4.2 配网页面 HTML4.3 WiFi 扫描接口4.4 接收凭据并异步连接4.5 状态查询接口五、配置持久化Preferences 库的使用六、主循环中的配网处理七、按键触发重新配网八、完整流程图项目概述本方案利用零知派ESP32-S3内置的NVS非易失性存储与Preferences库实现WiFi配置的持久化保存。首次通过网页配网成功后SSID和密码被自动写入Flash分区断电不丢失。设备每次重启时优先从Flash读取已保存的凭证调用WiFi.begin()自动重连。若网络环境变化导致连接失败系统自动回退到网页配网模式。项目难点及解决方案问题描述AP/STA模式的无缝切换 与 非阻塞事件处理解决方案关闭AP前确保STA已成功连接采用轮询 WiFi 状态取代while() 等待 WiFi 连接的阻塞式等待。一、为什么需要网页配网常见方案对比方案优点缺点硬编码 SSID/密码简单直接无法适应不同网络毫无通用性SmartConfig微信配网无需连接 AP兼容性差部分路由器不支持成功率低依赖微信生态蓝牙配网稳定需要蓝牙硬件App 开发成本高网页配网跨平台任何手机/电脑浏览器无需安装 App实现简单用户需手动切换 WiFi 连接设备 AP网页配网的核心流程设备上电后如果没有有效 WiFi 配置自动进入 AP 模式并启动一个 Web 服务器。用户用手机连接设备的热点在浏览器中打开配置页面通常会自动弹出选择 WiFi 并输入密码设备收到后尝试连接成功后保存配置并重启。二、整体架构从 AP 启动到配置保存配网模块涉及以下几个关键组件AP 热点设备作为接入点供用户连接。DNS Captive Portal自动劫持 DNS将任意域名解析到设备 IP实现配网页面自动弹出。Web Server提供 HTML 页面和 REST API。异步连接 状态轮询WiFi 连接不阻塞 Web 服务前端实时获取状态。PreferencesNVS持久化存储 WiFi 凭据。按键重置长按按键清除配置重新进入配网模式。三、AP 热点与 DNS Captive Portal3.1 启动 AP 热点ESP32 可以同时工作在 STA连接路由器和 AP自身作为热点模式。配网阶段我们使用APSTA模式但 AP 是核心WiFi.mode(WIFI_AP_STA); WiFi.softAP(kApSsid, kApPassword); // SSID: XiaoZhi-AI, 密码: 12345678 Serial.printf(AP IP address: %s\n, WiFi.softAPIP().toString().c_str()); // 通常是 192.168.4.1密码不能为空至少 8 位否则部分手机无法连接。设置简单易记的密码即可。3.2 DNS Captive Portal 实现Captive Portal强制门户技术能让用户连接热点后自动弹出认证/配置页面而不需要手动输入 IP。原理是启动一个 DNS 服务器将所有域名解析到设备的 AP IP。g_dnsServer new DNSServer(); g_dnsServer-start(53, *, WiFi.softAPIP()); // 监听 53 端口所有域名都解析到 AP IP然后在主循环中不断处理 DNS 请求g_dnsServer-processNextRequest();配合 Web 服务器的根路径/返回配网 HTML用户打开任意浏览器或点击弹窗就会显示配置界面。四、Web 服务器与 API 设计4.1 建立 Web 服务器使用WebServer库监听 80 端口g_webServer new WebServer(80); g_webServer-on(/, HandleRoot); // 配网主页 g_webServer-on(/connect, HTTP_POST, HandleConnect); // 提交 WiFi 凭据 g_webServer-on(/status, HandleStatus); // 查询连接状态 g_webServer-on(/scan, HandleScan); // 扫描周围 WiFi 列表 g_webServer-on(/clear, HandleClear); // 清除已保存配置 g_webServer-onNotFound(HandleRoot); // 其他路径重定向到根 g_webServer-begin();4.2 配网页面 HTML页面内容被转换为 C 字符串数组存储在webconfig_html.h中编译时烧录到 Flash。页面包含WiFi 列表下拉框通过 Ajax 调用/scan填充密码输入框连接按钮状态提示区这样无需外置文件系统所有资源内嵌。4.3 WiFi 扫描接口为了提高用户体验让用户无需手动输入 SSID实现了 WiFi 扫描功能。注意WiFi.scanNetworks()是同步阻塞的可能耗时 1~3 秒。为了避免影响 Web 响应我们做了以下设计使用g_scanning标志防止并发扫描虽然 WebServer 单线程但防止定时器或多次点击。扫描前确保 WiFi 模式为WIFI_AP_STAAP 不能关闭。返回 JSON 数组包含ssid、rssi、encrypted、encryptionType字段。关键代码片段int n WiFi.scanNetworks(); String json [; for (int i 0; i n i 20; i) { json {\ssid\:\ EscapeJsonString(WiFi.SSID(i)) \,; json \rssi\: String(WiFi.RSSI(i)) ,; json \encrypted\: String(WiFi.encryptionType(i) ! WIFI_AUTH_OPEN) }; if (i n-1) json ,; } json ]; g_webServer-send(200, application/json, json); WiFi.scanDelete(); // 释放内存其中EscapeJsonString()处理 SSID 中的双引号、反斜杠等特殊字符防止 JSON 格式错误。4.4 接收凭据并异步连接connect接口收到ssid和password后不能阻塞等待连接成功否则浏览器会超时。因此采用立即返回 后台连接 前端轮询的策略。void HandleConnect() { g_pendingSsid ssid; g_pendingPassword password; WiFi.begin(ssid.c_str(), password.c_str()); g_connecting true; g_connectSuccess false; g_connectStartTime millis(); g_webServer-send(200, application/json, {\success\: true}); }4.5 状态查询接口前端每隔 1 秒请求status根据返回值更新界面if (!g_connecting !g_connectSuccess) status idle; else if (g_connectSuccess) status connected; else if (g_connecting) { if (millis() - g_connectStartTime 20000) { // 超时 20 秒 status failed; g_connecting false; WiFi.disconnect(); } else { wl_status_t wifiStatus WiFi.status(); if (wifiStatus WL_CONNECTED) { status connected; g_connectSuccess true; g_connecting false; SaveWifiConfig(g_pendingSsid, g_pendingPassword); } else if (wifiStatus WL_CONNECT_FAILED || wifiStatus WL_NO_SSID_AVAIL) { status failed; g_connecting false; } else { status connecting; } } }当状态变为 connected 时前端可以跳转到成功页面设备稍后自动重启。五、配置持久化Preferences 库的使用ESP32 提供Preferences库用于在 NVSNon-Volatile Storage中存储键值对非常适合保存 WiFi 凭据#include Preferences.h Preferences g_preferences; const char* kNamespace wifi_config; bool SaveWifiConfig(const String ssid, const String password) { g_preferences.begin(kNamespace, false); g_preferences.putString(ssid, ssid); g_preferences.putString(password, password); g_preferences.end(); return true; } bool LoadWifiConfig(String ssid, String password) { g_preferences.begin(kNamespace, true); ssid g_preferences.getString(ssid, ); password g_preferences.getString(password, ); g_preferences.end(); return ssid.length() 0; }注意begin()的第二个参数为false表示可写为true表示只读。保存配置后即使断电也不会丢失六、主循环中的配网处理在setup()中调用ConfigureWifi()函数其逻辑尝试加载并连接保存的 WiFiConnectToSavedWifi()。如果成功直接返回进入正常应用流程。如果失败或没有保存配置调用StartWebConfig()进入配网模式。在配网模式中主循环不断调用HandleWebConfig()处理 DNS 和 Web 请求同时检查异步连接状态。一旦连接成功延迟重启下次启动就会加载新配置HandleWebConfig()的非阻塞实现void HandleWebConfig() { if (g_isWebConfigMode g_dnsServer g_webServer) { g_dnsServer-processNextRequest(); g_webServer-handleClient(); if (g_connectSuccess) { static unsigned long lastRestartTime 0; if (lastRestartTime 0) { lastRestartTime millis(); } else if (millis() - lastRestartTime 5000) { ESP.restart(); } } } }七、按键触发重新配网ESP_ERROR_CHECK(iot_button_register_cb( g_button_boot_handle, // Boot 按键句柄 BUTTON_PRESS_DOWN, // 按键事件按下 nullptr, [](void*, void* data) { // 回调函数 printf(boot button pressed\n); ClearWifiConfig(); //清除配置后重启 delay(100); ESP.restart(); }, nullptr)); iot_button_unregister_cb(g_button_boot_handle, BUTTON_PRESS_DOWN, nullptr); //连接成功后注销重新配网功能在连接WiFi成功前按下Boot按键可以强制重新配网且在连接成功后注销该功能不会跟后续的语音打断功能冲突八、完整流程图

相关文章:

零知派——ESP32-S3 AI 小智 使用 Preferences NVS 实现Web配网持久化

✔零知派(零知开源)是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台,在硬件上提供超高性价比STM32系列开发板、物联网控制板。取消了Bootloader程序烧录,让开发重心从 “配置环境” 转移到 “创意实现”,极大…...

VSCode低代码插件性能临界点测试:当表单字段超127个时,这4个插件率先崩溃(附压测脚本)

https://intelliparadigm.com 第一章:VSCode低代码插件性能临界点测试:当表单字段超127个时,这4个插件率先崩溃(附压测脚本) 低代码开发正深度融入 VSCode 生态,但多数插件在高复杂度表单场景下缺乏压力验…...

基于Falcon-7B构建私人对话机器人的实践指南

1. 从零搭建私人对话机器人的技术解析作为一名长期从事自然语言处理开发的工程师,我经常被问到如何在家用设备上部署类似ChatGPT的对话系统。虽然完整复现ChatGPT需要专业级算力,但通过开源模型和巧妙设计,我们完全可以构建一个功能完备的私人…...

揭秘C++ MCP网关核心设计:从epoll+无锁队列到内存池预分配,3大吞吐翻倍关键技术全公开

第一章:C MCP网关架构全景与性能目标定义C MCP(Microservice Control Plane)网关是面向高吞吐、低延迟微服务通信场景设计的核心基础设施组件,其核心职责涵盖协议转换、路由决策、熔断限流、可观测性注入及安全策略执行。该网关并…...

LuatOS扩展库API——【libfota2】远程升级

LuatOS 是面向物联网设备的轻量级嵌入式 Lua 脚本运行框架 / 实时系统,基于 Lua 5.3 深度优化,用于 4G‑Cat.1、MCU 等物联网终端。LuatOS 开发特点是基于 Lua 脚本、协程多任务设计,当前LuatOS共有70多个核心库,20多个扩展库&…...

Docker 27边缘容器编排实战:从零部署到万级IoT节点稳定运行的7个硬核配置诀窍

第一章:Docker 27边缘容器编排的演进逻辑与核心挑战边缘计算场景下,容器编排正从中心化调度向轻量、自治、低延迟协同范式迁移。Docker 27并非官方版本号(Docker CE 最新稳定版为 24.x),但作为技术演进的抽象符号&…...

ubuntu的基本使用

一.ubuntu的基本操作ctrlaltt:启动终端ctrlshift:终端字体变大ctrl-:终端字体变小ctrlshiftc/v:终端复制/粘贴文本cat/etc/issue:查看操作系统的版本tab键:自动补齐上下键:历史命令二.linux常用的shell命令1. linuxubuntu:~$:命令提示符解释&…...

C++编写MCP网关如何扛住50万TPS并发且零RCE漏洞?:基于ASan+Control-Flow Integrity+硬件辅助加密的工业级方案

第一章:C编写高吞吐量MCP网关安全性最佳方案总览构建高吞吐量MCP(Message Control Protocol)网关时,安全性不能以性能为代价妥协。现代金融、IoT与实时通信场景要求网关在百万级TPS下仍能抵御重放攻击、会话劫持、协议混淆及内存越…...

BiliDownload终极指南:一站式B站视频下载解决方案

BiliDownload终极指南:一站式B站视频下载解决方案 【免费下载链接】BiliDownload B站视频下载工具 项目地址: https://gitcode.com/gh_mirrors/bil/BiliDownload 你是否曾经遇到过这样的困扰?看到B站上精彩的教学视频、有趣的Vlog或者珍贵的纪录片…...

海明码和异或运算

一、海明码二、异或运算...

5分钟搞定视频字幕提取:免费本地工具终极指南

5分钟搞定视频字幕提取:免费本地工具终极指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内容提取。A…...

[AI] [Linux] 教我编一个启用rust的riscv kernel用于qemu启动

本文是博主在博客写作中的一次全新尝试,本次尝试通过输入给Claude Sonnet 4.6的prompt来自动生成一篇技术性博客。Prompt为: linux 7.0 kernel在 /home/projects/linux/linux,教我编一个启用rust的riscv kernel用于qemu启动Output如下(未作任…...

PPT图片视频音频提取神器,PPT模板不求人,建议使用

聊一聊看别人做的PPT总是那么好看。到自己做的时候,总是搭配不好,怎么搭配都感觉不好看。今天,给大家介绍一款神器,可以直接提取他人PPT里面的视频、图片、音频信息。收集他人PPT里面的素材,方便自己使用。非常简单&am…...

MySQL 索引介绍

本文章讲解 Hash、二叉树、平衡二叉树、B-Tree、BTree 索引的逻辑情况 查找都是索引操作,当数据量较大时,索引的大小可能有几个 G,甚至更多,为了减少索引在内存的占用,数据库索引是存储在磁盘上的,将索引以…...

Qwen-Image-Edit-F2P镜像免配置价值:省去diffusers/transformers手动安装

Qwen-Image-Edit-F2P镜像免配置价值:省去diffusers/transformers手动安装 想玩转AI图像生成和编辑,但被复杂的模型部署、环境配置劝退?这大概是很多开发者和AI爱好者的共同烦恼。手动安装diffusers、transformers库,处理各种依赖…...

如何用AI打造原创OC角色?2026从角色设定到动态生成的全链路创作指南

在原创角色OC创作中,AI已成为核心动力,打破“想法难落地、技术门槛高”的困境。想打造有灵魂、还原度高的角色,关键在于顺畅完成“概念设定→视觉落地→动态赋能→精细打磨”。V2Fun.art凭借全流程整合、低门槛操作和高适配性,成为…...

nli-MiniLM2-L6-H768快速上手:金融研报摘要主题分类(科技/宏观/行业)

nli-MiniLM2-L6-H768快速上手:金融研报摘要主题分类(科技/宏观/行业) 1. 工具简介 nli-MiniLM2-L6-H768是一款基于cross-encoder/nli-MiniLM2-L6-H768轻量级NLI模型开发的本地零样本文本分类工具。它专为解决传统文本分类需要大量标注数据和…...

颠覆传统巡检模式:AI技术如何重塑安全生产新格局

作为"我ai去巡检"小程序的技术研发团队,我们亲眼见证了人工智能如何从实验室概念转变为守护安全生产的核心力量。今天,我们将深入剖析AI技术在安全生产领域的前沿应用,揭秘我们如何攻克技术难题,打造这款重新定义行业标…...

Spring Security配置了AccessDeniedHandler却无效?别急,先检查你的全局异常处理器

Spring Security异常处理冲突排查指南:当AccessDeniedHandler遇上全局异常处理器 最近在重构一个老项目的权限模块时,遇到了一个看似简单却让人抓狂的问题:明明按照文档配置了AccessDeniedHandler,但权限不足时依然直接抛出Access…...

踩坑实录:NFS挂载环境下脚本执行权限问题(Operation not permitted)的深度排查与解决

在企业级部署中,NFS(网络文件系统)常被用来共享存储资源,方便多节点统一访问数据与安装包。但这种“便捷共享”的环境,也常常隐藏着各种权限陷阱。最近在KingbaseES数据库安装部署中,我就踩了一个典型的NFS…...

微软office365怎么安装?(保姆级流程)

1、微软office官网(www.office.com)--登录(报名后老师给的账号)2、登录后的界面3、应用--安装应用程序--Microsoft 365应用版4、下载office软件安装程序到桌面(或者你能找到的地方)5、找到安装程序并双击安…...

LFM2.5-VL-1.6B惊艳效果展示:OCR文档理解+结构化信息提取真实案例

LFM2.5-VL-1.6B惊艳效果展示:OCR文档理解结构化信息提取真实案例 1. 模型概述 LFM2.5-VL-1.6B是由Liquid AI推出的轻量级多模态大模型,专为端侧和边缘设备优化设计。这个1.6B参数的视觉语言模型(1.2B语言400M视觉)在保持轻量化的…...

ECS LIVA Mini Box QC710 ARM迷你主机评测与购买指南

1. ECS LIVA Mini Box QC710 迷你主机深度解析 最近在Stack Social平台上发现一款正在清仓促销的迷你主机——ECS LIVA Mini Box QC710,原价219美元现在仅售99.99美元。这款基于高通骁龙7c平台的迷你电脑在2021年推出时定位为开发者套件,如今价格腰斩后是…...

桥梁健康监测系统如何选?海陵区城市生命线项目中标单位为您解读

桥梁作为城市交通网络的关键节点,其结构安全状态直接关系到市民出行安全和城市运转效率。近年来,国内外多起桥梁安全事故为我们敲响了警钟,桥梁健康监测系统已成为城市生命线安全工程中不可或缺的重要组成部分。江苏星文科技有限公司作为海陵…...

数据库三大范式:从概念到实战,一篇文章彻底搞懂

为什么你的表设计总出问题?为什么数据冗余、更新异常、插入异常、删除异常频频发生?很可能是范式没用好。今天我们用最通俗的语言,把这三大范式讲清楚、讲透彻。数据库设计是一门艺术,而范式就是这门艺术的“基本法”。掌握三大范…...

基于安卓的农村劳动力信息匹配系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓平台的农村劳动力信息匹配系统以解决当前农村劳动力市场中存在的信息不对称与供需错配问题。随着我国城镇化进程的持续推进以及…...

Flux2-Klein-9B-True-V2多场景落地:政府宣传海报/公益广告图生成实践

Flux2-Klein-9B-True-V2多场景落地:政府宣传海报/公益广告图生成实践 1. 项目概述 Flux2-Klein-9B-True-V2是基于官方FLUX.2 [klein] 9B改进的文生图/图生图模型,专为高质量图像生成与编辑任务优化。该模型在保持原始模型强大生成能力的基础上&#xf…...

灵机一物AI原生电商小程序、PC端(已上线)-从 Vibe Coding 到 Wish Coding:AI 编程范式跃迁与蚂蚁灵光技术解读

摘要本文对比 Vibe Coding 与 Wish Coding 技术路径,解析蚂蚁灵光闪应用升级要点、灵光圈协作机制,探讨 Coding Agent 从开发者工具走向全民消费级产品的行业趋势。1. Vibe Coding 定位与边界1.1 核心逻辑- 面向:专业开发者- 入口&#xff1a…...

Phi-3.5-mini-instruct入门必看:网页封装+参数详解+中文场景调优指南

Phi-3.5-mini-instruct入门必看:网页封装参数详解中文场景调优指南 1. 模型简介 Phi-3.5-mini-instruct是一款专为中文场景优化的轻量级文本生成模型,特别适合日常问答、内容创作和知识辅助等任务。相比大型语言模型,它在保持良好生成质量的…...

XSKY 与平凯星辰(TiDB)完成联合解决方案互认证,存储+数据库联合交付能力再获验证

近日,XSKY 星辰天合与平凯星辰(北京)科技有限公司正式完成联合解决方案互认证。本次认证覆盖 XSKY 旗下 XEBS V6(星飞极速版)、XHERE V6(星飞极速版)、XEDP V6 三款核心产品与平凯星辰的平凯数据…...