Arduino OTA 将固件从服务器上传到 ESP32

Posted

技术标签:

【中文标题】Arduino OTA 将固件从服务器上传到 ESP32【英文标题】:Arduino OTA upload firmware from a server to ESP32 【发布时间】:2022-01-12 22:47:03 【问题描述】:

我创建了一个本地服务器,我需要上传一个 .bin 文件到本地服务器,然后 ESP32 必须将固件切换到该文件,我如何才能正确实现本地服务器和 esp 之间的通信?这是 ESP 代码中的 /update 端点:

void SetupServer() 

  server.on("/update", HTTP_POST, []() 
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
      ESP.restart();
  , []() 
    HTTPUpload & upload = server.upload();
    if (upload.status == UPLOAD_FILE_START) 
      Serial.printf("Update: %s\n", upload.filename.c_str());
      if (!Update.begin(UPDATE_SIZE_UNKNOWN)) 
        Update.printError(Serial);
      
     else if (upload.status == UPLOAD_FILE_WRITE) 
      if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) 
        Update.printError(Serial);
      
     else if (upload.status == UPLOAD_FILE_END) 
      if (Update.end(true)) 
        Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
       else 
        Update.printError(Serial);
      
    
  );

这是本地服务器的端点,我尝试在 ajax 中通过 url: 'http://192.168.4.1/update'(esp 端点) 与 ESP 通信,看起来它可以通信,但固件不会改变

<div class="container mt-5 mb-5 px-10 ">
    <div class="row">
        <div class="col-md-6 offset-md-3 text-center">
            <h2>Actualizar Firmware</h2><br>
            <form action="/update" method="POST" enctype="multipart/form-data" id='upload_form' role="form">
                <div class="form-group"> 
                    <input type="file" name="binfile" class="form-control" required><br>
                    <button type="submit" class="btn btn-secondary">Actualizar</button>
                </div><br>
                <div id='prg'>Progress: 0%</div>
            </form>
            % if message  %
                    <p class="alert alert-danger"> message </p>
            % endif %
        </div>
    </div>
</div>

<script>
$('form').submit(function(e)
    e.preventDefault();
    var form = $('#upload_form')[0];
    var data = new FormData(form);
    $.ajax(
    url: 'http://192.168.4.1/update',
    type: 'POST',
    data: data,
    contentType: false,
    processData:false,
    xhr: function() 
        var xhr = new window.XMLHttpRequest();
        xhr.upload.addEventListener('progress', function(evt) 
            if (evt.lengthComputable) 
                var per = evt.loaded / evt.total;
                $('#prg').html('progress: ' + Math.round(per*100) + '%');
            
        , false);
        return xhr;
    ,
    success:function(d, s) 
        console.log('success!')
    ,
    error: function (a, b, c) 

    
    )
)
</script>

【问题讨论】:

你的代码中有调试信息。它输出什么? ESP 会重启吗? @romkey a got this [WebServer.cpp:633] _handleRequest(): request handler not found, and not the esp doesn't restart esp32 应该是从服务器下载更新 bin 的客户端。查看 HTTPUpdate 库 【参考方案1】:

您是否要让 ESP32 从服务器下载新固件? 如果是这样,您将需要创建一个 wifi 客户端并将文件下载到 SPI 文件系统。 为此,您需要:WifiClient.hSPIFFS.h

下载完成后,将文件复制到固件位置。 为此,您需要:Update.h

就我而言,我将 .bin 文件存储在 github 上与我的代码相同的存储库中。要访问它,您需要一个 secure 客户端。我使用了:WifiClientSecure.h,它可以让您访问公共网站,甚至是那些需要用户名和密码的网站。

让这一切顺利进行确实是一项艰巨的任务,但最终还是值得的。如果您在起步阶段需要更多帮助,请告诉我。

【讨论】:

嗨@Michael Ward 所以,我需要获取文件的服务器是使用python创建的本地服务器,所以现在我正在尝试使用 HttpClient 获取二进制文件,我正在尝试与我在服务器中上传文件的端点建立连接connect():fd 54 上的套接字错误,errno:104,“对等方重置连接” 为什么要将它存储在 SPIFFS 中? HTTPUpdate 库做得更好 @MarkosAlonsoMoscosoOcampo, 127.0.0.1 是环回IP地址 @Juraj 你是对的。 HTTPUpdate 更容易。

以上是关于Arduino OTA 将固件从服务器上传到 ESP32的主要内容,如果未能解决你的问题,请参考以下文章

bin固件转成arduino的程序

IoT如何实现 ESP32 固件的 OTA 在线升级更新

固件空中升级(OTA)与固件二次引导的原理和设计

固件空中升级(OTA)与固件二次引导的原理和设计

涂鸦蓝牙SDK开发系列教程——6.固件升级

Arduino ESP32 通过 BLE 接收文件(用于 OTA 更新)