对于ESP8266文件系统上传文件,个人通常采用Arduino中安装esp8266fs插件的方法:
通过Arduino IDE向闪存文件系统上传文件_arduino怎么创建项目文件夹_Baal Austin的博客-CSDN博客
但每次修改文件后再上传都需要打开Arduino使用这个插件,感觉过程比较繁琐,于是想实现自己将文件打包为固件后再上传这一功能。
根据ESP-IDF 编程指南可以知道有spiffsgen.py和mkspiffs两种工具可以生成 SPIFFS 映像(用我通俗的理解叫打包为固件的文件数据)。
gSPIFFS 文件系统 - ESP32-S2 - — ESP-IDF 编程指南 v4.2 文档
接下来需要分析使用Arduino上传这个过程中调用了什么,以及在调用时传递了哪些参数。我选择使用Process Monitor来进行分析。
[搬运]进程监视器(Process Monitor)3.85完整汉化版 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
首先启动Arduino。
启动Process Monitor(启动后会自动开始捕获)。
使用Arduino的esp8266fs插件上传文件。
上传完成后停止Process Monitor捕获 。
捕获的内容很多,需要筛选重点。将Process Monitor工具栏中的同心圆图标拖拽至Arduino界面。
此时会过滤掉与Arduino无关的内容。
一次过滤完成。
我关注的是进程之间的调用与传递的参数,所以只保留与进程有关的选项。
二次过滤完后很明显的发现Arduino是通过调用mkspiffs来生成的 SPIFFS 映像。
下载mkspiffs并学习其命令参数。
https://github.com/igrr/mkspiffs
查看Process Monitor详细信息后获得了Arduino调用mkspiffs时的传递参数。
简单整理一下得到了该条命令:mkspiffs.exe -c 上传的文件目录 -p 256 -b 4096 -s 45056 生成固件.bin
粘贴进去稍微修改一下写成批处理并放置在mkspiffs所在的同级目录中。
批处理:%~dp0mkspiffs -c %~dp0data -b 4096 -p 256 -s 45056 %~dp0spiffs_%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%--%time:~9,2%.bin
执行批处理后对比发现与Arduino生成的映像不一致?
于是将Arduino调用的mkspiffs提取出来使用(对比了一下发现Arduino调用的mkspiffs比我下载的mkspiffs时间更新一些,可能是我下载的版本有问题吧,就不纠结这个了)。
重新对比发现完全一致,打包部分至此结束。
上传部分使用的是esptool,写为批处理。
为了兼容Arduino的esp8266fs插件,也是在此批处理目录下创建一个名为data的文件夹,将要打包上传的文件放入data中即可。
[自动]生成文件系统数据固件并上传批处理:
set time_flag=%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%--%time:~9,2%
%~dp0mkspiffs -c %~dp0data -b 4096 -p 256 -s 0xB000 %~dp0spiffs_%time_flag%.bin
%~dp0esptool.exe --chip esp8266 --baud 115200 write_flash -z 0x1F0000 %~dp0spiffs_%time_flag%.bin
pause
[自动]生成文件系统数据固件并上传批处理执行效果:
经测试可以成功打包并完成文件上传且可以正常读取文件。
至此,完成脱离Arduino向ESP8266文件系统(SPIFFS)上传打包为固件的文件数据(SPIFFS 映像)的功能。