You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将服务器.bin文件存入ESP32的SPIFFS并实现自动编程?

ESP32 从服务器下载.bin到SPIFFS并自动编程解决方案

一、将下载的.bin文件存储到SPIFFS

1. 初始化SPIFFS

首先确保SPIFFS分区配置正确,再通过代码完成初始化:

#include "SPIFFS.h"

void initSPIFFS() {
  // true表示挂载失败时自动格式化SPIFFS
  if (!SPIFFS.begin(true)) {
    Serial.println("SPIFFS初始化失败");
    return;
  }
  Serial.println("SPIFFS初始化成功");
}

2. 从服务器下载.bin到SPIFFS

使用HTTPClient库实现流式下载,避免内存溢出:

#include <WiFi.h>
#include <HTTPClient.h>

bool downloadBinToSPIFFS(const char* serverUrl, const char* savePath) {
  if (!WiFi.isConnected()) {
    Serial.println("WiFi未连接,无法下载文件");
    return false;
  }

  HTTPClient http;
  if (!http.begin(serverUrl)) {
    Serial.println("HTTP连接服务器失败");
    return false;
  }

  int httpCode = http.GET();
  if (httpCode != HTTP_CODE_OK) {
    Serial.printf("下载请求失败,错误码:%d\n", httpCode);
    http.end();
    return false;
  }

  File binFile = SPIFFS.open(savePath, FILE_WRITE);
  if (!binFile) {
    Serial.println("无法打开SPIFFS文件进行写入");
    http.end();
    return false;
  }

  // 流式写入文件,适合大体积固件
  http.writeToStream(&binFile);
  
  binFile.close();
  http.end();
  Serial.println("固件已成功下载并保存到SPIFFS");
  return true;
}

调用示例:downloadBinToSPIFFS("http://your-server.com/esp32-firmware.bin", "/firmware.bin");

二、从SPIFFS中的.bin文件自动编程(无人工干预)

利用ESP32的OTA(空中升级)API,直接读取SPIFFS中的固件完成升级,无需手动操作:

1. 核心升级代码

#include "esp_ota_ops.h"
#include "esp_partition.h"

bool updateFromSPIFFS(const char* binPath) {
  File binFile = SPIFFS.open(binPath, FILE_READ);
  if (!binFile) {
    Serial.println("无法读取SPIFFS中的固件文件");
    return false;
  }

  // 获取当前运行的分区与待升级的OTA分区
  const esp_partition_t* runningPartition = esp_ota_get_running_partition();
  const esp_partition_t* updatePartition = esp_ota_get_next_update_partition(runningPartition);
  if (!updatePartition) {
    Serial.println("未找到可用的OTA分区");
    binFile.close();
    return false;
  }

  // 启动OTA升级流程
  esp_ota_handle_t otaHandle;
  esp_err_t err = esp_ota_begin(updatePartition, OTA_SIZE_UNKNOWN, &otaHandle);
  if (err != ESP_OK) {
    Serial.printf("OTA升级启动失败,错误码:%d\n", err);
    binFile.close();
    return false;
  }

  // 分块读取SPIFFS文件并写入OTA分区
  const size_t bufferSize = 1024;
  uint8_t buffer[bufferSize];
  size_t bytesRead;
  while ((bytesRead = binFile.read(buffer, bufferSize)) > 0) {
    err = esp_ota_write(otaHandle, buffer, bytesRead);
    if (err != ESP_OK) {
      Serial.printf("OTA写入失败,错误码:%d\n", err);
      binFile.close();
      esp_ota_abort(otaHandle);
      return false;
    }
  }

  // 完成升级并设置启动分区
  err = esp_ota_end(otaHandle);
  if (err != ESP_OK) {
    Serial.printf("OTA升级结束失败,错误码:%d\n", err);
    binFile.close();
    return false;
  }

  err = esp_ota_set_boot_partition(updatePartition);
  if (err != ESP_OK) {
    Serial.printf("设置启动分区失败,错误码:%d\n", err);
    binFile.close();
    return false;
  }

  binFile.close();
  Serial.println("升级完成,设备即将重启");
  esp_restart();
  return true;
}

2. 关键注意事项

  • 分区表配置:Arduino IDE中需在工具->分区方案选择含OTA分区的选项(如OTA(大APP,3MB SPIFFS));ESP-IDF环境需在partition_table.csv中配置OTA分区。
  • 固件兼容性:下载的.bin文件必须与当前ESP32硬件型号、芯片版本匹配,且编译时的分区表需与设备一致,否则升级后设备可能无法启动。
  • 稳定性保障:升级过程禁止断电,建议添加电源检测逻辑,确保设备供电稳定。

3. 完整流程调用示例

void setup() {
  Serial.begin(115200);
  
  // 连接WiFi
  WiFi.begin("你的WiFi名称", "你的WiFi密码");
  while (!WiFi.isConnected()) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功");

  // 初始化SPIFFS、下载固件、自动升级
  initSPIFFS();
  if (downloadBinToSPIFFS("http://your-server.com/esp32-firmware.bin", "/firmware.bin")) {
    updateFromSPIFFS("/firmware.bin");
  }
}

void loop() {
  // 空循环或添加其他业务逻辑
}

内容的提问来源于stack exchange,提问作者Majid Dareini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:35:41