91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32通過(guò)OTA無(wú)線局域網(wǎng)遠(yuǎn)程升級(jí)下載程序

jf_88434166 ? 來(lái)源:jf_88434166 ? 作者:jf_88434166 ? 2025-07-22 13:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概要

ESP32 的 OTA(Over-The-Air)升級(jí)功能允許通過(guò)無(wú)線網(wǎng)絡(luò)Wi-Fi遠(yuǎn)程更新設(shè)備固件程序,無(wú)需物理連接(如 USB/UART)。比如ESP32設(shè)備在機(jī)殼內(nèi)部不好拆卸,人離設(shè)備比較遠(yuǎn),不好接線的環(huán)境可用到OTA方式給ESP32設(shè)備下載程序。為實(shí)現(xiàn)此功能每次更新程序的時(shí)候都要在代碼里面加入OTA的相關(guān)代碼。

遠(yuǎn)程O(píng)TA.jpg

創(chuàng)建ESP32-OTA無(wú)線局域網(wǎng)網(wǎng)頁(yè)版遠(yuǎn)程升級(jí)入口

打開(kāi)Arduino IDE中自帶ESP32—OTAWebUpdater示例
在這里插入圖片描述

#include < WiFi.h >
#include < WiFiClient.h >
#include < WebServer.h >
#include < ESPmDNS.h >
#include < Update.h >

const char* host = "esp32";
const char* ssid = "YXDZ1";
const char* password = "YXDZ#2023#1";

WebServer server(80);

/*
 * Login page
 */

const char* loginIndex =
 "< form name='loginForm' >"
    "< table width='20%' bgcolor='A09F9F' align='center' >"
        "< tr >"
            "< td colspan=2 >"
                "< center >< font size=4 >ESP32 Login Page< /font >< /center >"
                "
"
            "< /td >"
            "
"
            "
"
        "< /tr >"
        "< tr >"
             "< td >Username:< /td >"
             "< td >< input type='text' size=25 name='userid' >
< /td >"
        "< /tr >"
        "
"
        "
"
        "< tr >"
            "< td >Password:< /td >"
            "< td >< input type='Password' size=25 name='pwd' >
< /td >"
            "
"
            "
"
        "< /tr >"
        "< tr >"
            "< td >< input type='submit' onclick='check(this.form)' value='Login' >< /td >"
        "< /tr >"
    "< /table >"
"< /form >"
"< script >"
    "function check(form)"
    "{"
    "if(form.userid.value=='ESP32-OTA' && form.pwd.value=='ESP32-OTA')"
    "{"
    "window.open('/serverIndex')"
    "}"
    "else"
    "{"
    " alert('Error Password or Username')/*displays error message*/"
    "}"
    "}"
"< /script >";

/*
 * Server Index Page
 */

const char* serverIndex =
"< script src='http://www.makelele.cn/images/chaijie_default.png' >< /script >"
"< form method='POST' action='#' enctype='multipart/form-data' id='upload_form' >"
   "< input type='file' name='update' >"
        "< input type='submit' value='Update' >"
    "< /form >"
 "progress: 0%"
 "< script >"
  "$('form').submit(function(e){"
  "e.preventDefault();"
  "var form = $('#upload_form')[0];"
  "var data = new FormData(form);"
  " $.ajax({"
  "url: '/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 >";

/*
 * setup function
 */
void setup(void) {
  Serial.begin(115200);

  // Connect to WiFi network
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  /*use mdns for host name resolution*/
  if (!MDNS.begin(host)) { //http://esp32.local
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");
  /*return index page which is stored in serverIndex */
  server.on("/", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", loginIndex);
  });
  server.on("/serverIndex", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", serverIndex);
  });
  /*handling uploading firmware file */
  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: %sn", upload.filename.c_str());
      if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_WRITE) {
      /* flashing firmware to ESP*/
      if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_END) {
      if (Update.end(true)) { //true to set the size to the current progress
        Serial.printf("Update Success: %unRebooting...n", upload.totalSize);
      } else {
        Update.printError(Serial);
      }
    }
  });
  server.begin();
}

void loop(void) {
  server.handleClient();
  delay(1);
}

并對(duì)其中的代碼做如下更改:
給ESP32開(kāi)發(fā)板連接到自己電腦所在的局域網(wǎng)的路由器WIFI上,填上WIFI名稱(chēng)ssis和密碼password

const char* host = "esp32";
const char* ssid = "YXDZ1";
const char* password = "YXDZ#2023#1";

host為ESP32作為Web服務(wù)器時(shí),將ESP32以易記的主機(jī)名(如esp32.local)廣播到局域網(wǎng),其他設(shè)備可直接通過(guò)該名稱(chēng)訪問(wèn),用戶(hù)可通過(guò)http://esp32.local直接訪問(wèn),無(wú)需記憶IP地址

const char* host = "esp32";

  /*use mdns for host name resolution*/
  if (!MDNS.begin(host)) { //http://esp32.local
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }

更改好OTA無(wú)線局域網(wǎng)網(wǎng)頁(yè)版入口的用戶(hù)名和密碼,這里都更改為ESP32-OTA

"if(form.userid.value=='ESP32-OTA' && form.pwd.value=='ESP32-OTA')"

通過(guò)有線方式連接電腦和ESP32開(kāi)發(fā)板,并把代碼編譯通過(guò)先通過(guò)有線方式下載到ESP32開(kāi)發(fā)板,讓開(kāi)發(fā)板創(chuàng)建無(wú)線OTA遠(yuǎn)程升級(jí)網(wǎng)頁(yè)版入口
打開(kāi)串口助手,按下ESP32開(kāi)發(fā)板復(fù)位,會(huì)顯示出所連接的局域網(wǎng)的IP地址,mDNS域名訪問(wèn)創(chuàng)建成功。
在這里插入圖片描述
在瀏覽器輸入IP地址或創(chuàng)建的http://esp32.local域名即可跳轉(zhuǎn)到OTA遠(yuǎn)程升級(jí)網(wǎng)頁(yè)版入口,輸入創(chuàng)建好的用戶(hù)名和密碼并登錄
在這里插入圖片描述
此時(shí)再跳轉(zhuǎn)到程序下載界面,選擇編譯好的程序文件并上傳到開(kāi)發(fā)板內(nèi)
在這里插入圖片描述

創(chuàng)建一個(gè)ESP32開(kāi)發(fā)板進(jìn)行OTA升級(jí)應(yīng)用程序示例

若要每次都要對(duì)ESP32開(kāi)發(fā)板進(jìn)行OTA升級(jí),新的應(yīng)用程序中都要加入上述OTA無(wú)線局域網(wǎng)網(wǎng)頁(yè)版遠(yuǎn)程升級(jí)入口的相關(guān)代碼。下面為一個(gè)ESP32開(kāi)發(fā)板GPIO2引腳上的閃燈程序的代碼,并加入了OTA的相關(guān)代碼,然后對(duì)OTA部分的代碼進(jìn)行上述一樣的更改。

#include < WiFi.h >
#include < WiFiClient.h >
#include < WebServer.h >
#include < ESPmDNS.h >
#include < Update.h >

const char* host = "esp32";
const char* ssid = "YXDZ1";
const char* password = "YXDZ#2023#1";

//variabls to blink without delay:
const int led = 2;
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;           // interval at which to blink (milliseconds)
int ledState = LOW;             // ledState used to set the LED

WebServer server(80);

/*
 * Login page
 */

const char* loginIndex = 
 "< form name='loginForm' >"
    "< table width='20%' bgcolor='A09F9F' align='center' >"
        "< tr >"
            "< td colspan=2 >"
                "< center >< font size=4 >ESP32 Login Page< /font >< /center >"
                "
"
            "< /td >"
            "
"
            "
"
        "< /tr >"
        "< td >Username:< /td >"
        "< td >< input type='text' size=25 name='userid' >
< /td >"
        "< /tr >"
        "
"
        "
"
        "< tr >"
            "< td >Password:< /td >"
            "< td >< input type='Password' size=25 name='pwd' >
< /td >"
            "
"
            "
"
        "< /tr >"
        "< tr >"
            "< td >< input type='submit' onclick='check(this.form)' value='Login' >< /td >"
        "< /tr >"
    "< /table >"
"< /form >"
"< script >"
    "function check(form)"
    "{"
    "if(form.userid.value=='ESP32-OTA' && form.pwd.value=='ESP32-OTA')"
    "{"
    "window.open('/serverIndex')"
    "}"
    "else"
    "{"
    " alert('Error Password or Username')/*displays error message*/"
    "}"
    "}"
"< /script >";
 
/*
 * Server Index Page
 */
 
const char* serverIndex = 
"< script src='http://www.makelele.cn/images/chaijie_default.png' >< /script >"
"< form method='POST' action='#' enctype='multipart/form-data' id='upload_form' >"
   "< input type='file' name='update' >"
        "< input type='submit' value='Update' >"
    "< /form >"
 "progress: 0%"
 "< script >"
  "$('form').submit(function(e){"
  "e.preventDefault();"
  "var form = $('#upload_form')[0];"
  "var data = new FormData(form);"
  " $.ajax({"
  "url: '/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 >";

/*
 * setup function
 */
void setup(void) {
  pinMode(led, OUTPUT);
  
  Serial.begin(115200);

  // Connect to WiFi network
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  /*use mdns for host name resolution*/
  if (!MDNS.begin(host)) { //http://esp32.local
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");
  /*return index page which is stored in serverIndex */
  server.on("/", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", loginIndex);
  });
  server.on("/serverIndex", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", serverIndex);
  });
  /*handling uploading firmware file */
  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: %sn", upload.filename.c_str());
      if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_WRITE) {
      /* flashing firmware to ESP*/
      if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_END) {
      if (Update.end(true)) { //true to set the size to the current progress
        Serial.printf("Update Success: %unRebooting...n", upload.totalSize);
      } else {
        Update.printError(Serial);
      }
    }
  });
  server.begin();
}

void loop(void) {
  server.handleClient();
  delay(1);

  //loop to blink without delay
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    ledState = not(ledState);

    // set the LED with the ledState of the variable:
    digitalWrite(led, ledState);
  }
}

ESP32開(kāi)發(fā)板OTA升級(jí)下載應(yīng)用程序

編譯并導(dǎo)出可供OTA升級(jí)下載的二進(jìn)制bin應(yīng)用程序文件
在這里插入圖片描述
在項(xiàng)目文件夾下的build文件夾里可看到可供下載的bin應(yīng)用程序文件
在這里插入圖片描述
進(jìn)入OTA無(wú)線局域網(wǎng)網(wǎng)頁(yè)版遠(yuǎn)程升級(jí)入口,打開(kāi)應(yīng)用程序bin文件,并對(duì)ESP32開(kāi)發(fā)板進(jìn)行遠(yuǎn)程下載程序

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 無(wú)線局域網(wǎng)

    關(guān)注

    1

    文章

    248

    瀏覽量

    31203
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3846

    瀏覽量

    85260
  • OTA
    OTA
    +關(guān)注

    關(guān)注

    7

    文章

    628

    瀏覽量

    38314
  • ESP32
    +關(guān)注

    關(guān)注

    26

    文章

    1197

    瀏覽量

    21797
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    GD32單片機(jī)STM32遠(yuǎn)程下載手機(jī)程序升級(jí)固件下載局域網(wǎng)網(wǎng)頁(yè)升級(jí)工具

    GD32、STM32單片機(jī),是我們最常見(jiàn)的一種MCU。通常我們?cè)谑褂肧TM32單片機(jī)都會(huì)遇到程序在線升級(jí)下載的問(wèn)題。使用該方法可以完成手機(jī)網(wǎng)頁(yè)在線程序
    的頭像 發(fā)表于 11-09 12:31 ?3477次閱讀
    GD32單片機(jī)STM32<b class='flag-5'>遠(yuǎn)程</b><b class='flag-5'>下載</b>手機(jī)<b class='flag-5'>程序</b><b class='flag-5'>升級(jí)</b>固件<b class='flag-5'>下載</b><b class='flag-5'>局域網(wǎng)</b>網(wǎng)頁(yè)<b class='flag-5'>升級(jí)</b>工具

    淺析思科無(wú)線局域網(wǎng)

    思科無(wú)線局域網(wǎng)(WLAN)基礎(chǔ)。  無(wú)線局域網(wǎng)(WLAN)  11.1 WLAN基礎(chǔ)  WLAN(Wireless Local Area Network,
    發(fā)表于 07-01 07:04

    嵌人式系統(tǒng)的無(wú)線局域網(wǎng)接入怎么實(shí)現(xiàn)?

    設(shè)備驅(qū)動(dòng)的深入理解和分析,成功地移植在Atmel 9261 ARM處理器上。實(shí)現(xiàn)了嵌人式系統(tǒng)的無(wú)線局域網(wǎng)接入。利用該平臺(tái),可以進(jìn)一步設(shè)計(jì)完善醫(yī)用伽馬相機(jī)和小型SPECT設(shè)備的手持?jǐn)?shù)據(jù)采集系統(tǒng),使得控制人員能夠遠(yuǎn)離數(shù)據(jù)采集現(xiàn)場(chǎng),而通過(guò)遠(yuǎn)程
    發(fā)表于 03-06 06:27

    樂(lè)鑫ESP32空中下載(OTA)解決方案實(shí)操

    前言 OTA(Over-the-AirTechnology)即空中下載技術(shù),是通過(guò)移動(dòng)通信的空中接口實(shí)現(xiàn)對(duì)移動(dòng)終端設(shè)備及SIM卡數(shù)據(jù)進(jìn)行遠(yuǎn)程管理的技術(shù)。
    發(fā)表于 06-30 10:39

    OTA的具體應(yīng)用場(chǎng)景及遠(yuǎn)程升級(jí)遠(yuǎn)程的含義具體是什么?

    對(duì)OTA遠(yuǎn)程升級(jí)一直有一個(gè)疑問(wèn),希望各位道友解答一下。不勝感激疑問(wèn)1通過(guò)看官方的OTA升級(jí)的文檔
    發(fā)表于 11-14 14:21

    如何用esp32組建局域網(wǎng)?

    大家好,我想用esp32組建一個(gè)局域網(wǎng),請(qǐng)大家?guī)臀覅⒖家幌?,要求如?一個(gè)局域網(wǎng)內(nèi)數(shù)量不超過(guò)100臺(tái)。一臺(tái)主機(jī),可以同其他的設(shè)備通訊,其余均為從機(jī),只能和主機(jī)通訊,從機(jī)之間不能直接通訊。通訊的有效
    發(fā)表于 03-09 08:02

    無(wú)線局域網(wǎng)(WLAN)是什么?

    據(jù)傳輸。   WLAN 的工作原理   無(wú)線局域網(wǎng)的工作原理是通過(guò)發(fā)送和接收無(wú)線電信號(hào)來(lái)完成數(shù)據(jù)傳輸。接入點(diǎn)將有線網(wǎng)絡(luò)連接到無(wú)線網(wǎng)絡(luò),允許
    發(fā)表于 05-17 17:11

    GD32單片機(jī)STM32遠(yuǎn)程下載手機(jī)程序升級(jí)固件下載局域網(wǎng)網(wǎng)頁(yè)升級(jí)工具

    ,即可瀏覽到上傳的文件。點(diǎn)擊文件后面對(duì)應(yīng)的Flash按鈕即可完成STM32單片機(jī)的在線升級(jí)。 該服務(wù)器還支持FTP方式遠(yuǎn)程下載固件的功能,能夠完成局域網(wǎng)、互聯(lián)網(wǎng)的
    發(fā)表于 11-10 15:03

    無(wú)線局域網(wǎng)簡(jiǎn)介

    無(wú)線局域網(wǎng)無(wú)線局域網(wǎng)絡(luò)(Wireless Local Area Networks; WLAN)是相當(dāng)便利的數(shù)據(jù)傳輸系統(tǒng),它利用射頻(Radio Frequency; RF)的技術(shù),
    發(fā)表于 11-24 03:21 ?2769次閱讀

    淺談無(wú)線局域網(wǎng)的優(yōu)點(diǎn)

    無(wú)線局域網(wǎng),其英文縮寫(xiě)為WLAN。無(wú)線局域網(wǎng)無(wú)線通信技術(shù)與網(wǎng)絡(luò)技術(shù)相結(jié)合的產(chǎn)物。從專(zhuān)業(yè)角度講,無(wú)線
    發(fā)表于 11-14 15:51 ?3531次閱讀

    解答無(wú)線局域網(wǎng)該如何設(shè)置

    近些年來(lái),網(wǎng)絡(luò)技術(shù)發(fā)展日新月異,隨著無(wú)線技術(shù)的不斷發(fā)展,現(xiàn)在我們生活當(dāng)中的網(wǎng)絡(luò),以及從過(guò)去的局域網(wǎng)發(fā)展成現(xiàn)在的無(wú)線局域網(wǎng),無(wú)線
    發(fā)表于 11-14 19:17 ?4319次閱讀

    無(wú)線局域網(wǎng)的優(yōu)點(diǎn)有哪些

    無(wú)線局域網(wǎng)是計(jì)算機(jī)網(wǎng)絡(luò)與無(wú)線通信技術(shù)相結(jié)合的產(chǎn)物,無(wú)線局域網(wǎng)的基礎(chǔ)還是傳統(tǒng)的有線局域網(wǎng),是有線
    的頭像 發(fā)表于 01-10 08:56 ?1.1w次閱讀

    ESP32通信amp;局域網(wǎng)刺破

    ESP32局域網(wǎng)中通訊非常簡(jiǎn)單,按照模塊的AT指令集發(fā)送指令即可。常規(guī)情況下,需要局域網(wǎng)內(nèi)部的IP與局域網(wǎng)外界通訊,需要穿透局域網(wǎng),此時(shí)需
    的頭像 發(fā)表于 02-13 13:38 ?2846次閱讀

    wlan是無(wú)線網(wǎng)還是局域網(wǎng) wlan包括哪些無(wú)線局域網(wǎng)協(xié)議

    WLAN是無(wú)線局域網(wǎng)(Wireless Local Area Network)的縮寫(xiě),意味著它是一種在有限范圍內(nèi)使用無(wú)線技術(shù)進(jìn)行數(shù)據(jù)傳輸?shù)?b class='flag-5'>局域網(wǎng)。相比有線
    發(fā)表于 06-14 17:18 ?4397次閱讀

    ESP32ESP32通過(guò)Internet進(jìn)行通信

    電子發(fā)燒友網(wǎng)站提供《ESP32ESP32通過(guò)Internet進(jìn)行通信.zip》資料免費(fèi)下載
    發(fā)表于 06-15 09:58 ?5次下載
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b><b class='flag-5'>通過(guò)</b>Internet進(jìn)行通信