You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ESP32的Web服务器代码中导入现成HTML页面?

实现ESP32 Captive Portal导入完整静态网站的方法

核心思路

使用ESP32内置的LittleFS文件系统(替代旧版SPIFFS)存储完整网站文件(HTML、CSS、JS、图片等),通过WebServer读取文件并返回给客户端,彻底避免在代码中硬编码HTML字符串。

步骤详解

1. 配置Arduino IDE支持LittleFS上传

  • 打开Arduino IDE,进入文件 > 首选项,确保"附加开发板管理器网址"已添加ESP32官方地址:https://dl.espressif.com/dl/package_esp32_index.json
  • 安装ESP32开发板后,在工具菜单选择对应ESP32型号,再设置工具 > 闪存大小为包含足够文件系统空间的分区(比如4MB (3MB No OTA/1MB SPIFFS))
  • 确保安装LittleFS上传工具:通过库管理器搜索ESP32 LittleFS Uploader安装,安装后工具菜单会出现ESP32 Sketch Data Upload选项

2. 准备网站文件

  • 在你的Arduino项目文件夹下创建data子文件夹
  • 将完整网站的所有文件(包括index.html、CSS、JS、图片等)复制到data文件夹,保留原目录结构(比如css/style.css、js/app.js)

3. 修改Captive Portal代码

替换原硬编码HTML的逻辑,改为从LittleFS读取文件并处理所有静态资源请求:

#include <WiFi.h>
#include <DNSServer.h>
#include <WebServer.h>
#include <LittleFS.h>

const byte DNS_PORT = 53;
IPAddress apIP(172, 217, 28, 1);
DNSServer dnsServer;
WebServer webServer(80);

// 读取LittleFS文件并返回给客户端
void handleFileRead(String path) {
  // 根路径默认返回index.html
  if (path.endsWith("/")) {
    path += "index.html";
  }
  // 获取文件对应的MIME类型
  String contentType = getContentType(path);
  // 检查文件是否存在
  if (LittleFS.exists(path)) {
    File file = LittleFS.open(path, "r");
    webServer.streamFile(file, contentType);
    file.close();
    return;
  }
  // 不存在的路径重定向到首页,符合captive portal逻辑
  webServer.sendHeader("Location", "/", true);
  webServer.send(302, "text/plain", "");
}

// 根据文件后缀匹配MIME类型
String getContentType(String filename) {
  if (filename.endsWith(".html")) return "text/html";
  else if (filename.endsWith(".css")) return "text/css";
  else if (filename.endsWith(".js")) return "application/javascript";
  else if (filename.endsWith(".png")) return "image/png";
  else if (filename.endsWith(".jpg")) return "image/jpeg";
  else if (filename.endsWith(".gif")) return "image/gif";
  else if (filename.endsWith(".ico")) return "image/x-icon";
  return "text/plain";
}

void setup() {
  Serial.begin(115200);
  
  // 初始化LittleFS
  if (!LittleFS.begin()) {
    Serial.println("LittleFS初始化失败!");
    return;
  }

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP("Vodafone");

  // DNS服务器:所有请求解析到AP的IP
  dnsServer.start(DNS_PORT, "*", apIP);

  // 处理所有请求,读取对应文件
  webServer.onNotFound([]() {
    handleFileRead(webServer.uri());
  });

  webServer.begin();
  Serial.println("Captive Portal启动完成");
}

void loop() {
  dnsServer.processNextRequest();
  webServer.handleClient();
}

4. 上传网站文件到ESP32

  • 确保ESP32连接电脑,串口端口选择正确
  • 在Arduino IDE中点击工具 > ESP32 Sketch Data Upload,等待文件上传完成(上传时ESP32会自动进入烧录模式)

关键注意事项

  • 文件大小限制:ESP32文件系统空间由分区方案决定,不要超过分配的空间
  • MIME类型覆盖:如果网站用到特殊文件类型,需在getContentType函数中添加对应映射
  • 路径一致性:data文件夹内的目录结构要和代码中读取的路径完全对应
  • Captive Portal逻辑:代码对不存在的路径重定向到首页,保证所有请求都指向门户页面

内容的提问来源于stack exchange,提问作者FaltaDEiNfORmAção

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:35:28