SPIFFS 文件系统
本节使用Arduino IDE 来开发,因为需要用到ESP8266FS插件,在VScode 上暂时还没有研究出来怎么用
代码如下
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>
ESP8266WebServer server(80); //新建一个Web服务器
String ssid = "BYJY"; //需要链接的wifi热点名称
String password = "13153139496"; //需要连接的wifi的热点密码
/*
*根据文件后缀获取httl协议的返回内容类型
*/
String getContentType(String filename)
{
if (server.hasArg("download"))
return "application/octet-stream";
else if (filename.endsWith(".htm"))
return "text/html";
else 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(".gif"))
return "image/gif";
else if (filename.endsWith(".jpg"))
return "image/jpg";
else if (filename.endsWith(".ico"))
return "image/x-ico";
else if (filename.endsWith(".xml"))
return "text/xml";
else if (filename.endsWith(".pdf"))
return "application/x-pdf";
else if (filename.endsWith(".zip"))
return "application/x-zip";
else if (filename.endsWith(".gz"))
return "application/x-gzip";
return "text/plain";
}
/* NotFound处理
*用于处理没有注册的请求地址
* 一般是处理一些页面请求
* */
void handleNotFound()
{
String path = server.uri();
Serial.printf("load url:");
Serial.println(path);
String contentType = getContentType(path);
String pathWithGz = path + ".gz";
if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path))
{
if (SPIFFS.exists(pathWithGz))
path += ".gz";
File file = SPIFFS.open(path, "r");
size_t sent = server.streamFile(file, contentType);
file.close();
return;
}
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++)
{
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
/*返回信息给浏览器(状态码, Content-type, 内容)
*这里是访问当前设备IP直接返回一个String
* */
void handleMain()
{
Serial.printf("handleMain");
File file = SPIFFS.open("/index.html", "r");
size_t sent = server.streamFile(file, "text/html");
file.close();
return;
}
/*引脚更改处理
*访问地址为http://192.168.xxx.xxx/pin?a=xxx的时候根据a的值来进行相应的处理
* */
void handlePin()
{
if (server.hasArg("a")) //检查请求中是否包含a的参数
{
String action = server.arg("a"); //获取a参数的值
if (action == "on")
{
digitalWrite(2, LOW);
server.send(200, "text/html", "Pin 2 has turn on");
return;
}
else if (action == "off")
{
digitalWrite(2, HIGH);
server.send(200, "text/html", "Pin 2 has turn off");
return;
}
else
{
server.send(200, "", "");
return;
}
}
}
void setup()
{
//初始化
pinMode(2, OUTPUT);
Serial.begin(115200);
SPIFFS.begin();
int connectCount = 0;
WiFi.begin(ssid.c_str(), password.c_str());
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
if (connectCount > 30)
{
Serial.println("Connect fail!");
break;
}
connectCount++;
}
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
connectCount = 0;
}
server.on("/", HTTP_GET, handleMain);
server.on("/pin", HTTP_GET, handlePin);
server.onNotFound(handleNotFound);
server.begin();
}
void loop()
{
server.handleClient();
}
以上代码根据不同的请求来调用不同的文件,开一自己分析一下,咱不做讲解
重点是ESP8266FS的配置和使用
从https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.5.0/ESP8266FS-0.5.0.zip地址下载插件(填坑:用选用0.5.0版本,0.3.0版本在使用过程中找不到esptool,0.4.0版本在使用过程中提示无效的参数"--end"),下载后放到Arduino的tool目录下,完整路径是F:\Program Files (x86)\Arduino\tools\ESP8266FS\tool\esp8266fs.jar,当然F:\Program Files (x86)\Arduino\是我的Arduino安装目录,要根据自己的安装目录来修改.放置好文件后重启Arduino IDE, 在工具菜单下多出一个菜单
将需要的网页文件(网盘链接)复制到ino文件的同目录下,
点击上面新添加的菜单即可下载文件,下载完成重启
点击按钮可以看到开发板上的灯按照指令亮灭