ESP8266 OTA(无线远程升级)热更新

这篇具有很好参考价值的文章主要介绍了ESP8266 OTA(无线远程升级)热更新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ESP8266或者ESP32 有一个问题,就是在上传程序在开发板中里面的程序联网IP是固定;
1、如果你的MQTT服务器换 ip、端口、域名等情况那么开发板将无法连接MQTT服务。
esp8266 ota,arm开发,单片机,嵌入式硬件
2、如果业务需求有变更需要在开发板原有的基础增加一些功能,而这些开发板已经上线部署在各的自动售卖机,那如果按照传统方法,是不是要跑遍每个智能物联网设备,拿根数据线连接电脑重新上传烧录程序???
所以这时候就需要进行OTA热更新,类似于手机自动更新系统功能,自动获取版本,并且下载安装包在主板里,然后系统升级成功。

具体步骤流程
1、需要把 编译后更新包,挂在服务器上,目的是能够下载
比如我把下面的代码热更新到开发板里

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <MD5Builder.h>

// GPIO 5 D1
#define LED 5
#define JDQ D0  //继电器

// WiFi
const char *ssid = "yang1";          // Enter your WiFi name
const char *password = "872332847";  // Enter WiFi password

// MQTT Broker
const char *mqtt_broker = "172.20.10.2";
const char *topic = "esp8266";
const char *mqtt_username = "admin";
const char *mqtt_password = "admints";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  // Set software serial baud to 115200;
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  pinMode(JDQ, OUTPUT);
  digitalWrite(JDQ, HIGH);
  // connecting to a WiFi network
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");
  //connecting to a mqtt broker
  client.setServer(mqtt_broker, mqtt_port);
  client.setCallback(callback);
  while (!client.connected()) {
    String client_id = "esp8266-client-";
    client_id += String(WiFi.macAddress());
    Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
      Serial.println("Public emqx mqtt broker connected");
    } else {
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(1000);
    }
  }
  // publish and subscribe
  client.publish(topic, "hello emqx");
  client.subscribe(topic);
}

void callback(char *topic, byte *payload, unsigned int length) {
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
  Serial.print("Message:");
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  // convert *byte to string
  }
  Serial.print(message);

  // 解析JSON数据
  DynamicJsonDocument jsondoc(1024);
  deserializeJson(jsondoc, message);
  JsonObject obj = jsondoc.as<JsonObject>();
  String type = obj["type"];
  String value = obj["msg"];
  //LED
  if (type == "LED") {
    if (value == "ON") {
      digitalWrite(LED, LOW);
      digitalWrite(LED_BUILTIN, LOW);
    }
    if (value == "OFF") {
      digitalWrite(LED, HIGH);
      digitalWrite(LED_BUILTIN, HIGH);
    }
  }
  //继电器
  if (type == "JDQ") {
    if (value == "ON") {
      digitalWrite(JDQ, LOW);
    }
    if (value == "OFF") {
      digitalWrite(JDQ, HIGH);
    }
  }
  //digitalWrite(LED, LOW);

  /*
  if (value == "on") {
    digitalWrite(LED, LOW);
    digitalWrite(LED_BUILTIN, LOW);
  }  // LED on
  if (value == "off") {
    digitalWrite(LED, HIGH);
    digitalWrite(LED_BUILTIN, HIGH);
  }  // LED off
  */

  Serial.println();
  Serial.println("-----------------------");
}

void loop() {
  client.loop();
}

把以上代码编译成二进制文件
esp8266 ota,arm开发,单片机,嵌入式硬件esp8266 ota,arm开发,单片机,嵌入式硬件esp8266 ota,arm开发,单片机,嵌入式硬件以上编译成二进制文件,接下来我们挂在服务器上面,能够下载就行
下面以最简单的方式,方便演示直接挂在iis 默认文件下面
esp8266 ota,arm开发,单片机,嵌入式硬件esp8266 ota,arm开发,单片机,嵌入式硬件看一下是否能下载
esp8266 ota,arm开发,单片机,嵌入式硬件

2、需要使用 #include <ESP8266httpUpdate.h> 热更新库
3、上传程序
String upUrl = "http://172.20.10.2/ad/sketch.bin"; //更新包地址 也就是刚刚部署在iis上面的bin文件

#include <ESP8266WiFi.h>
#include <ESP8266httpUpdate.h>

/******需要修改的地方****************/

#define wifi_name       "yang1"       //WIFI名称,区分大小写,不要写错
#define wifi_password   "872332847"   //WIFI密码
                                      //固件链接,在巴法云控制台复制、粘贴到这里即可
String upUrl = "http://172.20.10.2/ad/sketch.bin";  //更新包地址

/**********************************/

/*
 * 主函数
 */

void setup() {
  Serial.begin(115200);                     //波特率115200
  WiFi.begin(wifi_name, wifi_password);     //连接wifi
  while (WiFi.status() != WL_CONNECTED) {   //等待连接wifi
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  updateBin();                              //开始升级
}

/**
 * 循环函数
 */
void loop() {

}

//当升级开始时,打印日志
void update_started() {
  Serial.println("CALLBACK:  HTTP update process started");
}

//当升级结束时,打印日志
void update_finished() {
  Serial.println("CALLBACK:  HTTP update process finished");
}

//当升级中,打印日志
void update_progress(int cur, int total) {
  Serial.printf("CALLBACK:  HTTP update process at %d of %d bytes...\n", cur, total);
}

//当升级失败时,打印日志
void update_error(int err) {
  Serial.printf("CALLBACK:  HTTP update fatal error code %d\n", err);
}

/**
 * 固件升级函数
 * 在需要升级的地方,加上这个函数即可,例如setup中加的updateBin(); 
 * 原理:通过http请求获取远程固件,实现升级
 */
void updateBin(){
  Serial.println("start update");    
  WiFiClient UpdateClient;
  
  ESPhttpUpdate.onStart(update_started);//当升级开始时
  ESPhttpUpdate.onEnd(update_finished); //当升级结束时
  ESPhttpUpdate.onProgress(update_progress); //当升级中
  ESPhttpUpdate.onError(update_error); //当升级失败时
  
   
  t_httpUpdate_return ret = ESPhttpUpdate.update(UpdateClient, upUrl);
  Serial.println(ret);
  Serial.println("测试2");  
  switch(ret) {
    case HTTP_UPDATE_FAILED:      //当升级失败
        Serial.println("[update] Update failed.");
        break;
    case HTTP_UPDATE_NO_UPDATES:  //当无升级
        Serial.println("[update] Update no Update.");
        break;
    case HTTP_UPDATE_OK:         //当升级成功
        Serial.println("[update] Update ok.");
        break;
  }
}

连接开发板上传程序
esp8266 ota,arm开发,单片机,嵌入式硬件这时候开发板上面的程序就会自动更新到我们刚刚部署编译成二进制bin文件文章来源地址https://www.toymoban.com/news/detail-645611.html

到了这里,关于ESP8266 OTA(无线远程升级)热更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32 OTA升级

    目录 一、ESP32 OTA升级原理 1. ESP32固件编译 2. 固件的远程传输 二、基于ESP32HTTPUpdate库的OTA升级 1. 硬件准备 2. 软件实现 三、注意事项 1. 升级文件大小限制 2. WiFi稳定性 3. 固件版本号 结语         OTA(Over-The-Air)升级,是指通过无线网络对设备进行在线的升级。通俗的说,就

    2024年02月16日
    浏览(45)
  • ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

    OTA:Over-the-Air Technology,字面意思理解为:空中下载技术。 OTA 在线升级:通过OTA的方式实现产品软件更新的一种方式。 简单说来,就是通过 无线方式 对esp32进行固件更新,而不是通过传 统的连接数据线的方式 更新固件。 写本篇文章的目的就是想向大家介绍一种ESP32 OTA更新

    2024年02月02日
    浏览(41)
  • ESP32-Web-Server编程综合项目1-结合 Web Server 实现 WiFi 配网和网页 OTA 更新

    前述的内容多是一个个小功能的演示,本章节讲述一些实际项目中使用到的综合项目。 首先要讲述的案例是通过ESP32 上的 Web Server 实现对 ESP32 的 WiFi 配网和网页 OTA 更新功能。 项目的主要功能有: 通过菜单控制多网页的切换 在多网页中分别实现 WiFi 配网、控制设备重启、通

    2024年01月22日
    浏览(49)
  • STM32 OTA远程升级

    前言:OTA全称是over the air,主要应用于物联网设备作为更新代码使用,其原理在不同芯片上相通,应用较为广泛。 一、OTA硬件组成 ​ 对于OTA硬件来讲,常用的硬件组成是无线芯片+MCU,常用的无线模块有WIFI、4G、LORA甚至是蓝牙等具有无线传输功能的设备,MCU则是例如51,STM3

    2024年02月11日
    浏览(44)
  • STM32--ESP8266物联网WIFI模块(贝壳物联)--远程无线控制点灯

    本文适用于STM32F103C8T6等MCU,其他MCU可以移植,完整资源见文末链接 一、简介 随着移动物联网的发展,各场景下对于物联控制、数据上传、远程控制的诉求也越来越多,基于此乐鑫科技推出了便宜好用性价比极高的wifi物联模块——ESP8266,话不多少我们先来看看这个神奇的模

    2024年02月08日
    浏览(60)
  • 物联网时代的OTA技术:远程更新的新风潮【文末送书-11】

    当今数字化时代,Over-the-Air(OTA)技术正日益成为各种设备的关键要素。这项技术通过无线网络传输数据,为设备提供远程更新、配置和管理的能力,从而推动了设备维护的灵活性和便捷性。 OTA技术在固件更新方面发挥着重要作用。以智能手机为例,用户无需通过繁琐的物理

    2024年02月04日
    浏览(29)
  • ESP8266初次如何实现无线通信(基于电脑与ESP8266)

    本次软件是需要串口调试助手,网络调试助手,KEIL5                             下面图标依次排列 本次硬件是需要一个ESP8266模块,一个stm32f103c8t6芯片,一个USB转TTL模块 ESP8266是一个微小的且集成的国产WIFI模块,它有很多种型号,但是使用

    2023年04月20日
    浏览(31)
  • ESP32网络开发实例-搭建ESP32固件远程升级服务器

    我们在前面的文章中,已经实现了OTA方式升级固件的两种方式:在Arduino IDE 中升级和Web浏览器中升级。这两种方式都不能满足设备自动升级的需求。在本文中,将详细介绍如何搭建一个ESP32固件远程升级服务器。通过远程升级服务器,ESP32设备可以根据固件版本号进行自动升级

    2024年01月23日
    浏览(50)
  • 双分区OTA升级

    双分区(双区)OTA(Over-the-Air)升级是嵌入式系统中常用的一种固件升级方式。此种方式下,设备的存储空间被分为两个分区:一个活动(active)分区和一个备用(standby)分区。 活动分区:这个分区包含当前正在运行的固件。 备用分区:这个分区用于存放新下载的固件。在

    2024年02月10日
    浏览(31)
  • OTA升级学习笔记

    记录下近期学习的OTA升级相关内容 OTA(Over-the-Air Technology)简单来说就是一种无线升级的技术 整编完成后使用make otapackage会生成target_files压缩包(包含完整的image数据)和可用于升级的ota update压缩包。如果不想在编译的时候生成升级包,可以将TARGET_SKIP_OTA_PACKAGE置成false(编

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包