查看: 2349|回复: 4

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

[复制链接]
  • TA的每日心情
    开心
    2019-6-20 08:51
  • 签到天数: 699 天

    [LV.9]以坛为家II

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

    帖子导航帖
    博哥零基础教你玩转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-6-20 08:51
  • 签到天数: 699 天

    [LV.9]以坛为家II

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

    [LV.2]偶尔看看I

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

    本版积分规则

    热门推荐

    开贴讲讲NRF24L01P,让你彻底搞懂它的工作原理,持续更...
    开贴讲讲NRF24L01P,让你
    *****************************************
    小白求助arduino源码如何使用
    小白求助arduino源码如何
    淘宝买了个六足机器人的源码 但是一打开就蒙了 完全看不懂啊,以前没接触过过arduino
    设计了一款智能加湿器,出现了一些控制上的问题
    设计了一款智能加湿器,出
    最近在学习blinker,就想着把手头的加湿器改装成智能加湿器,用了一块WiFiduino、一个
    有偿解答!!求大神带《指纹解锁杯》项目
    有偿解答!!求大神带《指
    想做一个职位解锁的杯子,通过指纹模块控制继电器锁头,从而控制杯子的锁死和开放的装
    【Arduino】37种传感器模块系列实验(29)---实时时钟模块
    【Arduino】37种传感器模
    37款传感器模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表