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

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-Fi
    while (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-Fi
    while (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配置到SPIFFS
  saveWiFiCredentials(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-Fi
  ESP.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
}


http://www.kler.cn/a/507583.html

相关文章:

  • 2019-Android-高级面试题总结-从java语言到AIDL使用与原理
  • 使用 Docker 部署 Java 项目(通俗易懂)
  • 配置AOSP下载环境
  • 【网络 MAC 学习专栏 -- 如何理解 PHY 的 Link Up】
  • C++通透讲解设计模式:依赖倒转(1)
  • 我要成为算法高手-DFS篇
  • vue3学习日记8 - 一级分类
  • Kivy App开发之UX控件Spinner选择框
  • qt信号槽复杂参数传递,以结构体为例
  • 递归40题!再见递归
  • React 中hooks之useReducer使用场景和方法总结
  • python学opencv|读取图像(三十六)(反)零值处理
  • springboot 利用html模版导出word
  • JavaScript笔记基础篇03——函数
  • HarmonyOS使用Grid网格实现计算器功能实现
  • AndroidStudio升级到2024.2.2项目AGP升级8.8.0版本记录
  • MyBatis(三)代理Dao方式的CRUD操作
  • uniapp 微信小程序 金额展示套餐
  • 【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
  • 算法(蓝桥杯)贪心算法5——删数问题的解题思路
  • Titans Learning to Memorize at Test Time
  • AI编程工具使用技巧——通义灵码
  • 《火焰烟雾检测开源神经网络模型:智能防火的科技护盾》
  • Python调用go语言编译的库
  • Math Reference Notes: 矩阵基础
  • Android adb 调试,不在手机上点击信任 “允许usb调试” 即可连接的方式(手机需root)