keer_zu 发表于 2025-5-30 16:07

ESP32的WIFI OTA

在 ESP32 Arduino 环境中生成烧写文件并通过 WiFi 进行 OTA(Over-The-Air)升级的步骤如下:

---

### 一、生成烧写文件(.bin 文件)

1. **编译项目**
   在 Arduino IDE 中打开项目,点击 **✓(验证/编译)** 按钮完成编译。
2. **获取 .bin 文件路径**
   * 编译成功后,查看 IDE 底部的 **黑色输出窗口**。
   * 找到类似以下路径(不同系统路径格式略有差异):

   ```
   /tmp/arduino_build_123456/YourSketchName.ino.bin
   ```

   * **关键文件**:
       * `YourSketchName.ino.bin`(主程序固件)
       * `YourSketchName.ino.bootloader.bin`(引导程序)
       * `YourSketchName.ino.partitions.bin`(分区表)
3. **手动导出 .bin 文件(可选)**
   * 菜单栏 → **项目** → **导出已编译的二进制文件**。
   * 文件将生成在项目目录下的 `build` 子文件夹中。

---

### 二、通过 WiFi 进行 OTA 升级(需提前部署 OTA 代码)

#### 步骤 1:在 ESP32 代码中集成 OTA 功能

```
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "Your_WiFi_SSID";
const char* password = "Your_WiFi_Password";

void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
}
Serial.println("Connected! IP: " + WiFi.localIP());

// 配置 OTA
ArduinoOTA
    .onStart([]() {
      Serial.println("OTA Update Start");
    })
    .onEnd([]() {
      Serial.println("\nOTA Update Complete!");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });

ArduinoOTA.begin(); // 启动 OTA 服务
Serial.println("OTA Ready");
}

void loop() {
ArduinoOTA.handle(); // 处理 OTA 请求
}
```

#### 步骤 2:首次烧录 OTA 代码

1. 通过 USB 将上述代码烧录到 ESP32(使用 Arduino IDE 的常规上传方式)。
2. 串口监视器中记录 ESP32 的 IP 地址(如 `192.168.1.100`)。

#### 步骤 3:通过 PC/手机进行 OTA 升级

##### 方法 1:使用 Arduino IDE(推荐)

1. 菜单栏 → **工具** → **端口** → 选择 **ESP32 的 IP 地址**(如 `esp32-abcdef at 192.168.1.100`)。
2. 点击 **→(上传)** 按钮,IDE 将自动通过 WiFi 上传固件。

##### 方法 2:使用网页浏览器

1. 访问 `http://<ESP32_IP>/update`(如 `http://192.168.1.100/update`)。
2. 选择生成的 `.bin` 文件并上传。

##### 方法 3:使用命令行工具(curl)

```
curl -F "update=@/path/to/YourSketchName.ino.bin" http://<ESP32_IP>/update
```

##### 方法 4:使用手机 APP

* Android 应用:**ESP32 OTA Updater**、**IoT OTA Updater**。
* 输入 ESP32 的 IP 地址,选择 `.bin` 文件进行更新。

---

### 三、关键注意事项

1. **首次烧录**
   OTA 功能必须通过 USB 首次烧录,后续才能无线更新。
2. **分区表要求**
   确保分区表包含 `ota_0` 和 `ota_1` 分区(默认 `Default 4MB with spiffs` 已支持)。
3. **固件大小限制**
   `.bin` 文件大小不能超过 OTA 分区容量(通常约 1.5MB)。若超限:

   * 优化代码或减少库依赖。
   * 选择更大的分区方案(如 `Huge APP`)。
4. **网络稳定性**
   OTA 过程中需保持 WiFi 连接稳定,断电会导致设备变砖。
5. **安全增强**

   ```
   ArduinoOTA.setPassword("admin"); // 设置 OTA 密码
   ArduinoOTA.setPort(8266);      // 更改默认端口(3232)
   ```

---

### 四、故障排查

* **无法连接 OTA**:检查防火墙是否阻止端口(默认 3232)。
* **上传失败**:确认 `.bin` 文件匹配当前芯片型号(ESP32/ESP32-S2 等)。
* **进度卡住**:重启 ESP32 并重试,或检查 WiFi 信号强度。

通过上述步骤,可高效实现 ESP32 的无线固件更新。
页: [1]
查看完整版本: ESP32的WIFI OTA