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

ESP8266 AP模式 网页配网 arduino ide

ESP8266的AP配网,可以自行配置网络,一个简单的demo,文档最后有所有的代码,已经测试通过.

查看SPIFFS文件管理系统中的文件 账号密码是否存在,如不存在进入AP配网,如存在进入wifi连接模式

// 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据,尝试连接Wi-Fi...");String ssid = loadWiFiSSID();String pass = loadWiFiPassword();WiFi.begin(ssid.c_str(), pass.c_str());unsigned long startAttemptTime = millis();// 等待最多15秒来连接Wi-Fiwhile (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < wifiConnectTimeout) {delay(100);Serial.print(".");}if (WiFi.status() == WL_CONNECTED) {Serial.println("Wi-Fi连接成功!");Serial.print("IP地址: ");Serial.println(WiFi.localIP());} else {Serial.println("Wi-Fi连接失败,进入AP模式...");startAPMode();}} else {Serial.println("未找到Wi-Fi凭据,进入AP模式...");startAPMode();}// 设置Web服务器路由server.on("/", HTTP_GET, handleRoot);server.on("/save", HTTP_POST, handleSaveWiFi);// 启动Web服务器server.begin();
}

启用AP模式

// 启动AP模式,供用户配置Wi-Fi
void startAPMode() {WiFi.softAP(ap_ssid, ap_password);Serial.print("AP模式启动,IP地址:");Serial.println(WiFi.softAPIP());
}

AP配网的网页端代码(这个是直接写入,没有采用SPIFFS管理)

// 网页表单HTML
const char* htmlForm = R"rawliteral(<html><head><title>Wi-Fi 配置</title></head><body><h2>请输入Wi-Fi配置</h2><form action="/save" method="POST"><label for="ssid">SSID:</label><br><input type="text" id="ssid" name="ssid" required><br><br><label for="pass">密码:</label><br><input type="password" id="pass" name="pass" required><br><br><input type="submit" value="保存配置"></form></body></html>
)rawliteral";

总代码(先进入AP配网,将wifi密码输入上去后进入wifi模式,可连接自己的wifi)

// 检查是否有保存的Wi-Fi凭据
bool isWiFiConfigured() {File ssidFile = SPIFFS.open(WIFI_SSID_FILE, "r");File passFile = SPIFFS.open(WIFI_PASS_FILE, "r");return ssidFile && passFile;  // 如果两个文件都存在,返回true
}
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>const char* ap_ssid = "ESP8266-Config";
const char* ap_password = "";
const unsigned long wifiConnectTimeout = 20000;  // 20秒超时ESP8266WebServer server(80);#define WIFI_SSID_FILE "/wifi_ssid.txt"
#define WIFI_PASS_FILE "/wifi_pass.txt"// 网页表单HTML
const char* htmlForm = R"rawliteral(<html><head><title>Wi-Fi 配置</title></head><body><h2>请输入Wi-Fi配置</h2><form action="/save" method="POST"><label for="ssid">SSID:</label><br><input type="text" id="ssid" name="ssid" required><br><br><label for="pass">密码:</label><br><input type="password" id="pass" name="pass" required><br><br><input type="submit" value="保存配置"></form></body></html>
)rawliteral";void setup() {Serial.begin(115200);delay(1000); // 等待串口初始化// 初始化SPIFFS文件系统if (!SPIFFS.begin()) {Serial.println("文件系统初始化失败!");return;}// 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据,尝试连接Wi-Fi...");String ssid = loadWiFiSSID();String pass = loadWiFiPassword();WiFi.begin(ssid.c_str(), pass.c_str());unsigned long startAttemptTime = millis();// 等待最多15秒来连接Wi-Fiwhile (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < wifiConnectTimeout) {delay(100);Serial.print(".");}if (WiFi.status() == WL_CONNECTED) {Serial.println("Wi-Fi连接成功!");Serial.print("IP地址: ");Serial.println(WiFi.localIP());} else {Serial.println("Wi-Fi连接失败,进入AP模式...");startAPMode();}} else {Serial.println("未找到Wi-Fi凭据,进入AP模式...");startAPMode();}// 设置Web服务器路由server.on("/", HTTP_GET, handleRoot);server.on("/save", HTTP_POST, handleSaveWiFi);// 启动Web服务器server.begin();
}void loop() {server.handleClient();
}// 启动AP模式,供用户配置Wi-Fi
void startAPMode() {WiFi.softAP(ap_ssid, ap_password);Serial.print("AP模式启动,IP地址:");Serial.println(WiFi.softAPIP());
}// 显示Wi-Fi配置页面
void handleRoot() {server.send(200, "text/html", htmlForm);
}// 保存Wi-Fi配置
void handleSaveWiFi() {String ssid = server.arg("ssid");String pass = server.arg("pass");// 保存Wi-Fi配置到SPIFFSsaveWiFiCredentials(ssid.c_str(), pass.c_str());// 返回保存成功的页面String response = "<html><body><h2>Wi-Fi配置已保存!</h2>";Serial.println("Wi-Fi配置已保存!");response += "<p>SSID: " + ssid + "</p>";response += "<p>密码: " + pass + "</p>";response += "</body></html>";server.send(200, "text/html", response);// 保存后重启设备以连接Wi-FiESP.restart();
}// 保存Wi-Fi凭据到SPIFFS
void saveWiFiCredentials(const char* ssid, const char* pass) {File ssidFile = SPIFFS.open(WIFI_SSID_FILE, "w");File passFile = SPIFFS.open(WIFI_PASS_FILE, "w");if (ssidFile) {ssidFile.print(ssid);ssidFile.close();} else {Serial.println("保存SSID失败");}if (passFile) {passFile.print(pass);passFile.close();} else {Serial.println("保存密码失败");}
}// 加载保存的Wi-Fi SSID
String loadWiFiSSID() {File ssidFile = SPIFFS.open(WIFI_SSID_FILE, "r");if (!ssidFile) {Serial.println("无法读取SSID");return "";}String ssid = ssidFile.readString();Serial.print("SSID: ");Serial.println(ssid);ssidFile.close();return ssid;
}// 加载保存的Wi-Fi密码
String loadWiFiPassword() {File passFile = SPIFFS.open(WIFI_PASS_FILE, "r");if (!passFile) {Serial.println("无法读取密码");return "";}String pass = passFile.readString();Serial.print("Password: ");Serial.println(pass);passFile.close();return pass;
}// 检查是否有保存的Wi-Fi凭据
bool isWiFiConfigured() {File ssidFile = SPIFFS.open(WIFI_SSID_FILE, "r");File passFile = SPIFFS.open(WIFI_PASS_FILE, "r");return ssidFile && passFile;  // 如果两个文件都存在,返回true
}

相关文章:

ESP8266 AP模式 网页配网 arduino ide

ESP8266的AP配网,可以自行配置网络,一个简单的demo,文档最后有所有的代码,已经测试通过. 查看SPIFFS文件管理系统中的文件 账号密码是否存在,如不存在进入AP配网,如存在进入wifi连接模式 // 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据&#…...

OpenCV基础:获取子矩阵的几种方式

目录 相关阅读 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高级索引 方法三&#xff1a;使用条件筛选 方法四&#xff1a;使用 numpy 的 take 函数 相关阅读 OpenCV基础&#xff1a;矩阵的创建、检索与赋值-CSDN博客 OpenCV基础&#xff1a;图像运算-CSDN博客…...

C++ 之多线程相关总结

C 之多线程相关总结 1.多线程相关基础知识 1.1 线程的创建和管理 1. std::thread 类&#xff1a; 用于创建和管理线程。通过将可调用对象&#xff08;如函数、函数对象、lambda 表达式&#xff09;作为参数传递给 std::thread 的构造函数&#xff0c;可以创建一个新的线程。…...

EF Core全局查询筛选器

目录 概述 用法 添加全局查询筛选器 禁用全局查询筛选器 概述 全局查询筛选器&#xff1a;EF Core 会自动将这个查询筛选器应用于涉及这个实体类型的所有 LINQ 查询。 场景&#xff1a;软删除、多租户。 什么是软删除&#xff1f; 逻辑删除&#xff0c;并不是真正地从数…...

【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)

本文项目编号 T 141 &#xff0c;文末自助获取源码 \color{red}{T141&#xff0c;文末自助获取源码} T141&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Objective-C语言的数据库交互

Objective-C语言的数据库交互 引言 在现代应用程序开发过程中&#xff0c;数据库在数据存储和管理方面起着至关重要的作用。对于iOS应用开发者而言&#xff0c;掌握如何在Objective-C中与数据库交互显得尤为重要。本文将全面探讨Objective-C的数据库交互&#xff0c;包括SQLi…...

基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践

在现代 Web 开发中&#xff0c;前后端分离的架构已经成为主流。本文将分享如何使用 Spring Boot 和 Vue.js构建一个全栈购物平台&#xff0c;涵盖从后端 API 开发到前端页面实现的完整流程。 1. 技术栈介绍 后端技术栈 JDK 1.8&#xff1a;稳定且广泛使用的 Java 版本。 Spring…...

笔记(数据运营方向)

以下是一些在工作过程中的小笔记&#xff0c;写的比较杂乱&#xff0c;后续再进行分类~ 1、掌握sql窗口函数 窗口函数又名开窗函数&#xff0c;属于分析函数的一种。用于解决复杂报表统计需求的功能强大的函数。窗口函数用于计算基于组的某种聚合值&#xff0c;它和聚合函数的…...

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行&#xff0c;这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟&#xff0c;但很多特性还得qt6才行&#xff0c;这里用qt5.14.2主要是考虑到服…...

[cg] glDrawBuffers MRT的应用

glDrawBuffers 是 OpenGL 中的一个函数&#xff0c;用于指定渲染结果输出到哪些颜色缓冲区。它通常在多渲染目标&#xff08;MRT, Multiple Render Targets&#xff09;中使用&#xff0c;允许一个渲染操作同时将结果输出到多个颜色缓冲区&#xff0c;而不是默认情况下的单个颜…...

IO模型与NIO基础二

抽象基类之二 FilterInputStream FilterInputStream 的作用是用来“封装其它的输入流&#xff0c;并为它们提供额外的功能”。 它的常用的子类有BufferedInputStream和DataInputStream。 (1) BufferedInputStream的作用就是为“输入流提供缓冲功能&#xff0c;以及mark()和res…...

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用&#xff1a;单例模式的核心是保证一个类只有一个实例&#xff0c;并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全&#xff0c;调用效率高 &#xff0c;但是不能延迟加载懒汉式线程安全&#xff0c;调用效率不高&#xff0c;能延迟加载双重检…...

T-SQL语言的数据库交互

T-SQL语言的数据库交互 引言 随着信息技术的不断发展&#xff0c;数据库在各个行业中扮演着越来越重要的角色。数据库的有效管理和优化对于企业的数据安全、效率提升和决策支持至关重要。T-SQL&#xff08;Transact-SQL&#xff09;作为微软SQL Server的重要扩展语言&#xf…...

【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)

inode 和 block 的映射 该博文中有详细解释&#xff1a;【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题&#xff1a; 问题一&#xff1a; 我们访问文件&#xff0c;都是用的文件名&#xff0c;没用过 inode 号啊&#xff1f; 之前总是说可以通过一个…...

慧集通(DataLinkX)iPaaS集成平台-业务建模之域

通过左侧导航菜单〖业务建模〗→〖域〗&#xff0c;进入该界面&#xff1b;在该界面可以查看到系统中已存在的域列表。 新建域 在慧集通平台中进入【业务建模】的【域】页面&#xff0c;点击【新建】按钮进入新建页面&#xff1b;输入编码&#xff0c;名称、模块以及对应数据类…...

【机器学习实战】kaggle 欺诈检测---使用生成对抗网络(GAN)解决欺诈数据中正负样本极度不平衡问题

【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题https://blog.csdn.net/2302_79308082/article/details/145177242 本篇文章是基于上次文章中提到的对抗生成网络&#xff0c;通过对抗生成网络生成少数类样本&#xff0c;平衡欺诈数据中正类样本极…...

android wifi framework与wpa_supplicant的交互

android frmework直接与wpa_supplicant进行交互&#xff0c;使用aidl或者hidl 二、事件 framework注册事件的地方&#xff1a; packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…...

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成&#xff08;F1&#xff09; FLASH读写过程&#xff08;F1&#xff09; 闪存的读取 闪存的写入 内部FLASH构成&#xff08;F4 / F7 / H7&#xff09; FLASH读写过程&#xff08;F4 / F7 / H7&#xff09; 闪存的读取 闪存的写入 …...

使用C语言实现栈的插入、删除和排序操作

栈是一种后进先出(LIFO, Last In First Out)的数据结构,这意味着最后插入的元素最先被删除。在C语言中,我们可以通过数组或链表来实现栈。本文将使用数组来实现一个简单的栈,并提供插入(push)、删除(pop)以及排序(这里采用一种简单的排序方法,例如冒泡排序)的操作示…...

C语言程序环境和预处理详解

本章重点&#xff1a; 程序的翻译环境 程序的执行环境 详解&#xff1a;C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 程序的翻译环境和执行环…...

基于MAX78000的离线鸟类声音识别:边缘AI从数据到部署全流程解析

1. 项目概述&#xff1a;当边缘AI“听懂”鸟鸣在野外生态监测或自家后院观鸟时&#xff0c;你是否有过这样的经历&#xff1a;听到一阵清脆或婉转的鸟鸣&#xff0c;却完全不知道是哪位“歌唱家”在表演&#xff1f;传统的鸟类识别依赖专家经验和图鉴比对&#xff0c;不仅门槛高…...

GIS工程应用记录(AI辅助编程)

问题的问题&#xff1a;语境坍缩“从各个角度提出问题&#xff0c;AI做出对应积极答复和修改&#xff0c;结果没有什么变化。”这&#xff0c;就是元问题最核心的症状。你尝试了所有你已知的“高级”协作手段&#xff0c;但就像重拳打在棉花上&#xff0c;AI永远在积极回应&…...

如何通过Joy-Con Toolkit实现专业级Switch手柄控制与硬件逆向工程

如何通过Joy-Con Toolkit实现专业级Switch手柄控制与硬件逆向工程 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 在游戏开发、硬件调试和嵌入式系统研究中&#xff0c;与游戏手柄等专业输入设备进行深度交互一直…...

终极AMD Ryzen调试指南:为什么你需要SMUDebugTool这个免费神器?

终极AMD Ryzen调试指南&#xff1a;为什么你需要SMUDebugTool这个免费神器&#xff1f; 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. …...

告别繁琐审核!实测AI Agent如何重塑复杂非结构化票据与合同处理流程?

摘要&#xff1a;在企业数字化转型步入深水区的2026年&#xff0c;处理复杂非结构化票据与合同已成为横亘在财务、法务部门面前的“最后一公里”难题。传统RPA因UI变动易崩溃、主流智能体因缺乏API适配而无法落地&#xff0c;导致大量业务仍依赖低效的人工操作。本文由「企服AI…...

Midjourney辉光效果失效诊断手册(含12个隐性触发条件与4类GPU显存陷阱)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Midjourney辉光效果失效诊断手册&#xff08;含12个隐性触发条件与4类GPU显存陷阱&#xff09; 辉光效果&#xff08;Glow Effect&#xff09;在 Midjourney v6 的 --style raw 模式下常被用于强化主体边缘光…...

ABS+神经网络:端到端宇宙学参数推断新范式解析

1. 项目概述&#xff1a;当ABS遇上神经网络&#xff0c;一个端到端宇宙学参数推断新范式的诞生 在宇宙学研究的核心地带&#xff0c;有一项任务既令人着迷又充满挑战&#xff1a;如何从宇宙微波背景&#xff08;CMB&#xff09;这张宇宙婴儿时期的“照片”中&#xff0c;精准地…...

当“画笔”变成“画笔”,世界便不再扁平:上海科技大学师玉娇团队 BevSplat 论文深度解读

用高斯画笔为地面图像“补上高度”&#xff0c;让卫星图片与街景的配对不再尴尬 想象一下这幅情境&#xff1a;一辆自动驾驶汽车在密集的城市楼群中行驶。GPS 信号被摩天大楼遮挡得断断续续&#xff0c;车辆根本无法准确知道自己的位置。于是&#xff0c;它需要一种备用方案&am…...

从原理到防御:手把手教你用Python模拟ZipCrypto加密,理解密码为何能被‘撞开’

从零构建ZipCrypto加密模拟器&#xff1a;Python实战与密码安全深度解析 当你用鼠标双击那个带锁的ZIP图标&#xff0c;输入密码后看到文件顺利解压时&#xff0c;是否好奇过背后的魔法&#xff1f;现代加密算法就像数字世界的机械钟表——精密的齿轮咬合运转&#xff0c;而我们…...

Taotoken控制台的用量分析与账单追溯功能使用初体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken控制台的用量分析与账单追溯功能使用初体验 作为一名项目管理员&#xff0c;我日常工作中很重要的一部分就是跟踪团队的技…...