目前正在 ESP32-EVB(非常棒的开发板,强烈推荐)上开发一个 Web 服务器项目,使用 SPIFF 分区来存储站点的静态资源,包括样式表、脚本等。我正在使用Arduino ESP32 核心的基本 WebServer.h 库,到目前为止一直运行良好,但它的简单性开始变得烦人。对于客户端发出的每个请求,必须初始化服务器以将特定请求与特定处理函数联系起来。这些领带需要在
setup()
中制作。
webServer.on("/", handleRoot);
webServer.on("/style.css", handleCSS);
webServer.on("/credits.html", handleCredits);
这里有一个非常类似的简单示例供参考。 如果您想实现强制门户,这种特殊性实际上非常有用,从任何类型的设备(iOS、Windows、Android)连接到端点时都需要独特的请求处理等),但当你想建立一个成熟的静态网站时就不行了,这需要几十个文件。
简而言之,除了设置服务器为浏览器请求的每个静态文件调用处理程序之外,还必须有更好的方法来处理文件请求。理想情况下,我想我可以解析 GET 请求,获取其要求的文件名,然后将其作为字符串传递给单个处理程序,该处理程序将从 SPIFF 分区提供该服务,但我找不到任何执行此操作的文档或示例。离开这里我能去哪里?
void handleRoot() {
char content[400];
snprintf(content, 400, readFile(SPIFFS, "/index.html"));
webServer.send(200, "text/html", content);
}
void handleWindows() {
webServer.send(200, "text/plain", "Microsoft NCSI");
webServer.send(200, "text/plain", "Hello from your badge!");
}
void handleAndroid() {
webServer.send(204, "text/plain", "");
}
void setup() {
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
WiFi.softAP("Captive Portal Endpoint");
dnsServer.start(DNS_PORT, "*", apIP);
if (!startSPIFFS)
Serial.println("SPIFFS beef'd it.");
webServer.on("/", handleRoot);
/* ######################### Detection Portal Init ######################### */
// Apple
webServer.on("/hotspot-detect.html", handleRoot);
webServer.on("/success.html", handleRoot);
// Android/ChromeOS
webServer.on("/generate_204", handleRoot);
//Microsoft
webServer.on("/fwlink", handleRoot);
webServer.on("/ncsi.txt", handleWindows);
webServer.onNotFound([]() {
webServer.send(200, "text/html", responseHTML);
});
webServer.begin();
}
void loop() {
dnsServer.processNextRequest();
webServer.handleClient();
}
经过更多挖掘后找到了解决方案。事实证明,Web 服务器上的设置之一是
.serveStatic()
,它的作用正如其听起来的那样。设置为 true 后,站点就可以直接请求它需要的任何其他静态文件。保持这个以防其他人需要看到这个(还有为什么是-1,老兄?)。