Arduino ESP32 WebServer 从microSD卡读取文件

ESP32-CAM

1.可插入SD卡;

开启STA模式 连接Wife 

#include <WiFi.h>   // 引入库

void connectWiFi() {
    WiFi.mode(WIFI_STA);                        //开启网络
    WiFi.begin(ssid, password);
    Serial.print(" 正在连接");
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
    Serial.print(" WIFI连接成功");
}

wifi连接断开后重连

// WIFE 重连 双核并行
xTaskCreatePinnedToCore(taskReconnectWiFi, "loopReconnectWiFi", 4096, NULL, 1, NULL, 1);
// WIFI 重新尝试连接
void taskReconnectWiFi(void *pvParameters) {
  while (1) {
    // 任务1的代码
    vTaskDelay(5000 / portTICK_PERIOD_MS);      // 延时5秒执行
    if (WiFi.status() != WL_CONNECTED) {
      WiFi.begin(ssid, password);
      Serial.println("try re-conn....");
      is_have_wife = 0;
    } else {
      if (is_have_wife == 0) {
        Serial.println("WIFI重连成功");
        sendDeviceIP();  // 上报设备,ip
        is_have_wife = 1;
      }
    }
  }
}

Webserve 实现 本地服务

void setup() {

    // webserve 双核并行
    xTaskCreatePinnedToCore(taskWebserver, "loopTaskWebserver", 10000, NULL, 1, NULL, 0);

    // webserve 接口
    server.on("/deviceInfo", getDeviceInfo);            // 设备信息
    server.onNotFound([]() {
        server.send(500, "text/html;charset=utf-8", "没有找到");
    });
    server.begin();   // server 开启
    Serial.println("HTTP server 开启");
}
// loop webserve
void taskWebserver(void *pvParameters) {
    while (1) {
        server.handleClient();              // 处理Web客户端的请
    }
}

SD_MMC 文件存储,读取,下载

初始化SD卡

void setup() {
  // 初始 SD 卡
  if (!SD_MMC.begin()) {
    Serial.println("没有找到 存储卡");
    return;
  }
    
  // 判断 sd卡 内 data_set 目录是否存在
  if (!SD_MMC.exists("/data_set")) {
    Serial.println("没有文件夹进行创建");
    if (!SD_MMC.mkdir("/data_set")) {
      Serial.println("创建失败");
    }
  }

}

下载

// 下载文件
void sendFile() {
  // 跨域
  server.sendHeader("Access-Control-Allow-Origin", "*"); // 允许任何域
  server.sendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); // 允许的方法
  server.sendHeader("Access-Control-Allow-Headers", "Content-Type"); // 允许的头部
  // 传入参数
  String fileName;
  if (server.arg("name") != "") {
    fileName = server.arg("name");
  } else {
    server.send(500, "text/plain", "参数有误");
    return;
  }
  File file = SD_MMC.open("/data_set/" + fileName); // 替换为你的文件路径
  uint8_t buffer[1024];
  if (file) {
    server.sendHeader("Content-Disposition", "attachment; filename=" + fileName);
    server.setContentLength(file.size());
    server.send(200, "text/plain", ""); // 设置正确的MIME类型
    WiFiClient client = server.client();
    if (client.connected()) {
      while (file.available()) {
        if (!client.connected()) break;
        size_t len = file.read(buffer, sizeof(buffer));
        // size_t len = client.write(file.read(buffer, sizeof(buffer))); // BUFFER_SIZE 根据实际需求设置缓冲区大小
        client.write(buffer, len);
        if (len == 0) {
          break;
        }
      }
    }
    file.close();
  } else {
    server.send(404, "text/plain", "File not found");
  }
  server.client().stop(); // 停止当前客户端的连接
}

推荐学习文档

1 arduino学习 https://www.w3cschool.cn/arduino/arduino_program_structure.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值