之前大家用arduino1.x版本开发ESP32或者ESP8266,上传文件都非常简单下载一个插件,在ino文件旁边创建一个data文件夹把各种文件一股脑丢进去,传完程序之后点一下上传文件就到文件系统里面了。
包括之前画板我都一直以为ESP32-C3也支持这个工具。就算arduino2.0没有这个插件也没关系大不了开两个IDE开发。
今天踩了坑才知道我想太多了,无论那个版本的arduino都不支持ESP32-C3上传文件系统的data。
然后通过以下方案解决研发调试阶段的文件上传,完成部署之后甚至比之前更方便了。
电脑固定IP
通过windows的iis开启服务器功能。
控制面板 搜索 服务 打开程序和功能查看已安装的更新
启用或关闭windows功能
把iis服务都开了,FTP也可以不开。
点击开始 然后搜索iis
文件书最下面点浏览就可以调到根目录了
这就是根目录
打开ip默认是这个主页,这不重要我们可以打开我们的文件就可以了。
#include <WiFi.h>
#include <HTTPClient.h>
#include "FS.h"
#include "LittleFS.h"
// 替换为你的 WiFi 网络名称和密码
const char* ssid = "123";
const char* password = "12345678";
void setup() {
Serial.begin(115200);
// delay(2000); // 延迟,以便于观察启动日志
// 连接 WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("连接WiFi.......");
}
// 初始化 LittleFS
while (!LittleFS.begin()) {
Serial.println("LittleFS 打开失败了!!!");
if (LittleFS.format())
Serial.println("LittleFS 格式化完成。");
}
Serial.println("LittleFS 文件系统正常。");
Serial.println("wifi链路连接成功");
String urlList[] = {
"http://192.168.0.250/file1.txt",
"http://192.168.0.250/主页.html",
// 更多 URL ...
};
if (!LittleFS.exists("/完成下载.txt")) {
// 遍历 URL 列表
bool errFlag = 0;
for (const auto& url : urlList) {
errFlag;
// 从 URL 中提取域名和文件名
int domainEndIndex = url.indexOf('/', 7); // HTTP 协议后的第一个斜杠是域名结束的位置
String domain = url.substring(0, domainEndIndex);
String filename = url.substring(domainEndIndex + 1);
// 创建 HTTP 客户端并开始下载文件
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) {
// 文件内容保存在 HTTP 服务器响应体中
String payload = http.getString();
// 打开文件准备写入
File file = LittleFS.open("/" + filename, "w");
if (!file) {
Serial.println("打开文件失败");
http.end();
errFlag = 1;
continue;
}
// 将内容写入文件
file.print(payload);
file.close();
Serial.println("文件下载完成: " + filename);
} else {
Serial.println("HTTP 获取失败: " + String(httpCode));
errFlag = 1;
}
http.end(); // 关闭 HTTP 连接
}
if (1 == errFlag)
Serial.println("获取过程中有问题不生成:完成任务。下次开机继续下载。");
else {
Serial.println("获取过程木有问题,生成:完成下载。下次开机不用下载。");
File file = LittleFS.open("/完成下载.txt", "w");
file.close();
}
} else
Serial.println("之前已经完成下载,本次开机无须进入下载过程。");
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(12, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100); // wait for a second
digitalWrite(12, LOW); // turn the LED off by making the voltage LOW
delay(100); // wait for a second
}