查看: 2847|回复: 4

[教程] 博哥零基础教你玩转ESP8266(十八) ESP8266 Filesystem

[复制链接]
  • TA的每日心情
    开心
    2019-8-14 08:23
  • 签到天数: 740 天

    [LV.9]以坛为家II

    发表于 2018-9-7 11:06 | 显示全部楼层 |阅读模式
    本帖最后由 单片机菜鸟 于 2019-7-4 09:40 编辑

    个人免费交流群:ESP物联网开发之旅 622368884


    帖子导航帖

    博哥零基础教你玩转ESP8266(一) 重识ESP8266
    博哥零基础教你玩转ESP8266(二) 认识一下Arduino core for ESP8266
    博哥零基础教你玩转ESP8266(三) 详解ESP8266 工作模式
    博哥零基础教你玩转ESP8266(四) 认识一下ESP8266WiFi库
    博哥零基础教你玩转ESP8266(五) ESP8266开发硬件搭建
    博哥零基础教你玩转ESP8266(六) STA连接 —— 我想连上你
    博哥零基础教你玩转ESP8266(七) Soft AP —— 谁想连上我
    博哥零基础教你玩转ESP8266(八) Scan —— 扫描周边网络
    博哥零基础教你玩转ESP8266(九) STA + Soft-AP联合出品
    博哥零基础教你玩转ESP8266(十) SmartConfig —配置网路
    博哥零基础教你玩转ESP8266(十一) Tcp client
    博哥零基础教你玩转ESP8266(十二) Tcp Server
    博哥零基础教你玩转ESP8266(十三) ESP8266WiFiGeneric库
    博哥零基础教你玩转ESP8266(十四) ESP8266HTTPClient 连接世界
    博哥零基础教你玩转ESP8266(十五) ESP8266WebServer 服务端
    qq群:491507716    博哥私人号:2421818708


    一、前言

        在前面的webserver例程中,大家可以发现,楼主都是直接拼装html返回内容。
        那么这里有几个弊端:
        1.ESP8266代码量大
          一般来说,为了开发方便,web server网页除了本身的html内容之外还可能引入了jQuery包,图片等相关资源。如果把这些内容也直接写入到ESP8266代码中,会导致ESP8266整体代码变大,设置可能超过flash的大小;
        2.业务职责分离不明确
          一般来说,在一个团队中,有人负责开发ESP8266的业务代码,有人负责开发Web Server网页内容,有人负责硬件部分。如果把html的内容直接写入到ESP8266代码中,就会导致业务职责混乱,并且如果要修改html内容的时候还得一个个改掉arduino的文件,也有可能改错标识符之类的。理想情况应该是,只需要更新web server的html文件就好,原来的esp8266 arduino逻辑不用更新;


        基于以上两点,引入本章节需要讲的ESP8266 文件系统(SPI Flash FileSystem)。
        本帖子讲采用ESP8266的FS.h文件系统,将网页和相关资源(如:图片、html、css、javaScript)存入到flash的SPIFFS区域。

    二、FLASH存储分配

        在讲文件系统之前,我们来看看在Arduino环境下ESP8266的flash存储分配,请看下图:

        flash.png
        具体可以分为几部分:
        1.代码区
          又名程序存储区,其中又区分为当前代码区(current Sketch),更新代码区(OTA update),不过这里是下面一篇的重点内容,先忽略。
        2.文件系统
          这个就是我们这节重点讲解的SPI Flash File System,简称SPIFFS闪存文件系统。
          即使文件系统与程序存储在同一个闪存芯片上,烧入新的代码也不会修改文件系统内容。这允许使用文件系统来存储Web服务器的代码数据、配置文件或内容。而这个SPIFFS文件系统的大小可以通过烧写环境来配置,目前一般有1M,2M,3M等等。      为了使用文件系统,需要把下面的头文件包含在代码中。
          
        3.EEPROM
          这个就是平常的可擦可编程ROM,后面章节也会讲,先忽略。
        4.WiFi Config
          这个区域就是我们设置WiFi模块配置的时候存储的数据。

    三、SPIFFS文件系统

        3.1 文件系统限制
        ESP8266的文件系统实现必须满足芯片的限制,其中最重要是有限的RAM。SPIFFS之所以被ESP8266选择作为文件系统,是因为它是为小型系统专门设计的,同时是以一些简化和限制为代价的。
        首先,SPIFFS不支持目录,它只存储一个“扁平化”的文件列表。但是与传统的文件系统相反,斜杠字符“/”在文件名中是允许的,因此处理目录列表的函数(例如,openDir("/website"))基本上只是过滤文件名,并保留以前缀(/website/)开始的那些文件。    然后,对于文件名,总共有32个字符限制。一个“\0”字符被保留用于c字符串终止符,因此留给我们31个可用字符长度。
        综合起来,这意味着建议保持短文件名,不要使用深嵌套的目录,因为每个文件的完整路径(包括目录、“/”字符、基本名称、点和扩展名)最多只能是31个字符长度。例如,/website/images/bird_thumbnail.jpg 达到了34个字符长度,如果使用它,将导致一些问题。
        警告:这个限制很容易达到,如果忽略,问题可能会被忽略,因为在编译和运行时不会出现错误信息。

        3.2 上传文件    要存入SPIFFS区域的文件,都得事先放在代码目录里的“data”目录(请自行新增“data”目录)。
        例如,存在一个项目工程叫做espStaticWeb,其文件结构如下:
       

        负责将文件上传到SPIFFS的工具叫做ESP8266FS。ESP8266FS是一个集成到Arduino IDE中的工具,它将一个菜单项添加到工具菜单,用于将skench data目录的内容上传到ESP8266 Flash文件系统中。
        这个工具需要另外安装,整个上传文件步骤如下:
        1.下载 ESP8266FS工具
            2.将下载到的文件解压到Arduino IDE安装路径下的tools文件夹(如果不存在这个文件夹,请自行增加)
          
         3.重启Arduino IDE
         4.打开一个Sketch工程(新建或者打开最近的工程),去到Sketch工程目录下创建一个data目录(不存在该目录),然后把你需要放到文件系统的文件copy到这里
         5.确保你选择了正确的板子、com口,关闭掉串口监视器
         6.选择 工具--> ESP8266 Sketch Data Upload
         
             然后就会开始上传文件到ESP8266 flash文件系统。
         
              当IDE显示“SPIFFS Image Uploaded”,代表上传完毕。

    四、SPIFFS使用介绍

       我们把文件上传到SPIFFS之后,肯定是希望能用到它们,那么就得了解一下SPIFFS文件系统常用的操作方法。
       以下是楼主总结的百度脑图:    SPIFFS库.png
         方法分为3大类:
       1.SPIFFS专用方法
       2.Dir对象专用方法
       3.File对象专用方法


       4.1 SPIFFS专用方法
       SPIFFS.begin()
       挂载SPIFFS文件系统的方法。它必须在其他任何FS API被调用之前先调用。如果文件系统挂载成功,返回true,否则返回false。
       SPIFFS.format()
       格式化文件系统。可以在执行begin()之前或者之后调用。如果格式化成功则返回true。
       SPIFFS.open(路径,模式)
       打开文件。路径必须是以斜线开头的绝对路径(如:/dir/filename.txt)。模式参数是个用字符串指定的存取模式,其值为“r”、“w”、“a”、“r+”、“w+”和“a+”之中的一个。
        file mode.png
       此方法返回一个File对象。如果要检查文件是否打开成功,请使用以下代码:

    kittenblock中小学创客名师推荐的图形化编程软件

    File f = SPIFFS.open("/f.txt", "w");
    if (!f) {
        Serial.println("file open failed");
    }

       SPIFFS.exists(path)
       如果指定的路径存在,则返回true,否则返回false。
       SPIFFS.openDir(path)
       打开绝对路径文件夹,返回一个Dir对象。
       SPIFFS.remove(path)
       删除绝对路径的文件,如果删除成功则返回true,否则返回false。
       SPIFFS.rename(原始路径文件名,新路径文件名)
       重新命名文件,路径必须是绝对路径,如果重新命名成功则返回true,否则返回false。
       SPIFFS.info(文件系统对象)
       获取文件系统的信息,存储在FSInfo对象上,该对象的结构如下:
        fsinfo.png
       其中,totalBytes是整个文件系统的大小,userBytes是文件系统所有文件占用的大小,blockSize是SPIFFS块大小,pageSize是SPIFFS逻辑页数大小,maxOpenFiles是能够同时打开的文件最大个数,maxPathLength是文件名最大长度(包括一个字节的字符串结束符)。


       4.2.Dir对象专用方法
       Dir对象的作用主要是遍历文件夹里的所有文件,它提供了三个方法:next(下一个文件)、fileName(读取文件名)和openFile(打开文件),它们的用法如以下范例:
       

    kittenblock中小学创客名师推荐的图形化编程软件

    Dir dir = SPIFFS.openDir("/data");//打开"/data"目录
    while (dir.next()) {//只要还有文件
        Serial.print(dir.fileName());//显示文件名
        File f = dir.openFile("r");//以只读方式打开文件
        Serial.println(f.size());//显示文件大小
    }
       源码解析:只要还有文件,dir.next()就会返回true,这个方法必须在fileName()和openFile()方法之前调用。openFile()方法接收一个打开文件模式的参数,这个参数的含义和SPIFFS.open()方法相同。

       4.3.File对象专用方法

       SPIFFS.open()和dir.openFile()方法都会返回File对象。File对象支持Stream的所有方法,因此可以使用readBytes、findUntil、parseInt、printIn以及其他stream方法。以下是File对象特有的一些方法:
       file.seek(位置偏移量,模式)
       这个方法就像c语言里面的fseek()方法,根据模式参数值,它将在目前的文件中移动:
       --如果模式值是SeekSet,则从文件开头移动指定的偏移量。
       --如果模式值是SeekCur,则从目前的文件位置移动指定的偏移量。
       --如果模式值是SeekEnd,则从文件结尾处移动指定的偏移量。
       如果移动成功,则返回true,否则返回false。
       file.position()
       返回目前在文件中的位置,单位是byte。
       file.size()
       返回文件大小,单位是byte。
       file.name()
       返回文件名字。
       file.close()
       关闭文件。执行这个方法之后,就不能在该文件上执行其他操作。

    五、SPIFFS操作实例
    有待写。。。。




    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2019-8-14 08:23
  • 签到天数: 740 天

    [LV.9]以坛为家II

     楼主| 发表于 2018-9-14 17:14 | 显示全部楼层
    更新帖子内容
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2019-7-17 11:25
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2019-6-13 16:05 | 显示全部楼层
    大神,十四章节404了,能不能再发出来。不胜感激
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    arduino首次编译通过第二次编译必报错
    arduino首次编译通过第二
    如题: 刚打开ide 首次编译 上传都没问题 不管你改不改代码 直接进行 编译 或者上传
    【Arduino】108种传感器系列实验(06)---声音传感器模块
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    旧版本ide中 ino文件名不能以数字开头,不能有中文?
    旧版本ide中 ino文件名不
    最近下载了站长编著的ARDUINO程序设计基础一书的配套例程。发现用arduino ide打开 里
    用Blinker获取天气信息并用ArduinoJson6分析数据(arduino D1)
    用Blinker获取天气信息并
    在Blinker最新版本的库中我们看到它用了ArduinoJson6,图中的两个类是ArduinoJson6的类
    一波三折,分享我的esp32编译环境搭建arduino
    一波三折,分享我的esp32
    买了个esp-wroom32开发板,想用熟悉的arduino敲代码。 但是上网查遍了所有办法,要么
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表