nodemcu学习记录8

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文件的同目录下,

点击上面新添加的菜单即可下载文件,下载完成重启

点击按钮可以看到开发板上的灯按照指令亮灭

发布了15 篇原创文章 · 获赞 0 · 访问量 228

猜你喜欢

转载自blog.csdn.net/cloudstep/article/details/104177263