ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

这篇具有很好参考价值的文章主要介绍了ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

1、OTA技术 简介

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

2、本章介绍

写本篇文章的目的就是想向大家介绍一种ESP32 OTA更新固件的方法——通过HTTPS进行更新,本篇文章是在vscode+platform环境下进行,下载方法参考这篇文章。
ESP32 PlatformIO IDE 安装教程

3、HTTPS OTA更新流程

3.1、HTTP OTA更新流程

要知道HTTPS OTA更新流程之前先要知道HTTP OTA更新流程。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

①.将ESP32连接到AP。例如手机热点
②.在PC上将要更新的固件进行build。
③.将.bin文件上传服务器。
④.ESP32自动下载。

3.2、HTTPS OTA更新流程

HTTPS和HTTP唯一的区别就是HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,所以要通过HTTPS进行OTA更新就需要获得网站的证书。

4、HTTPS OTA具体实现

4.1、编写要更新的固件

为了确保更新的固件能正常运行,并且能看到更新后的效果所以我们写一个闪灯的程序。(先编译烧录到ESP32中看效果)

我的配置(LED):

[env:esp32cam]
platform = espressif32
board = esp32cam
framework = arduino
monitor_speed = 115200
lib_deps = yoursunny/esp32cam@^0.0.20221229

ESP32闪灯程序
效果:LED灯一亮一灭间隔为1s。

#include <Arduino.h>

// Set LED_BUILTIN if it is not defined by Arduino framework
#define LED_BUILTIN 4 // 白色LED对应针脚

void setup()
{
// initialize LED digital pin as an output.
pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
// turn the LED on (HIGH is the voltage level)
digitalWrite(LED_BUILTIN, HIGH);
// wait for a second
delay(1000);
// turn the LED off by making the voltage LOW
digitalWrite(LED_BUILTIN, LOW);
// wait for a second
delay(1000);
}

4.2、在Amazon S3存储桶上储存要更新的固件。(firmware.bin)

亚马逊云科技分国际区和中国区,我试过在中国区即使将权限设置为所有人访问也不能读取文件,原因是在中国区要使用S3先联系AWS售后支持进行ICP备案。所以我把固件放在国际区的S3上。

具体实现:

1、登录AWS国际区账号。

2、在搜索栏搜索S3,进入创建S3存储桶。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

3、创建AWS S3的详细设置。

3.1、S3存储桶名称,AWS区域。

注意命名规则,和存储桶名称必须全局唯一
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

3.2、设置对象所有权。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

3.3、存储桶公共访问权设置。

不勾选阻止所有公开访问,勾选我了解选项不然不能创建。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

3.4、存储桶版本控制设置。

禁用存储桶版本控制
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

3.5、默认加密设置。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

3.6、创建存储桶。

4、设置AWS S3权限。

4.1、点击创建的S3存储桶。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

4.2、进入创建的存储桶后点击权限
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

4.3、往下翻找到访问控制列表(ACL),点击编辑,设置访问控制列表。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

4.4、找到所有人(公有访问权限),点击列出。点击我了解,不然不能保存更改。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

4.5、点击保存更改

5.1、保存完之后退出到AWS S3可以看到创建的存储桶的访问变为公开
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

6、上传闪灯程序的.bin文档。

6.1、切换到我们写的闪灯程序,点击烧录,生成.bin文档。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

6.2、进入我们创建的存储桶,点击上传

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

6.3、上传.bin文档。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

6.3.1、.bin文档访问控制列表设置。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

6.3.2、点击上传

7、文档上传成功可以在存储桶中看到。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

8、检验是否任何人都能下载文档。

8.1、点击上传的文档。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

8.2、复制对象 URL

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

8.3、打开浏览器的无痕浏览,将复制的URL输入进去。

8.4、弹出下载框就说明S3存储桶设置正确。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

4.2、获取Amazon S3网站证书

可以使用openssl来获取网站证书。
openssl是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。

1、打开openssl
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

2、输入指令查看AWS S3证书。

我的指令是:

注意替换后面的URL改为自己的URL

openssl s_client -showcerts -connect www.esp32-ota-test2.s3.amazonaws.com:443

3、查看获得的证书。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

我获得的证书一共有三个,但是第一和第三个我试过没用,只能用第二个。大家可以试试其他两个证书。

4.3、编写HTTPS OTA更新固件程序

上述要准备的东西都准备好后就可以开始编写更新固件的程序了。

1、新建一个platform项目。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

2、输入项目名称,开发板,和项目的位置。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

3、点击创建,打开刚刚创建的项目。

将下面的代码粘贴到main.cpp文件中。

注意在新建的项目中的platform.ini文件中增加一行,为了在监控中不出现乱码

monitor_speed = 115200

注意替换代码中的ssid,password和url。

// This sketch provide the functionality of OTA Firmware Upgrade
#include "WiFi.h"
#include "HttpsOTAUpdate.h"
#include "esp_ota_ops.h"

// This sketch shows how to implement HTTPS firmware update Over The Air.
// Please provide your WiFi credentials, https URL to the firmware image and the server certificate.

static const char *ssid     = "your-ssid";  // your network SSID (name of wifi network)
static const char *password = "your-password"; // your network password

static const char *url = "https://example.com/firmware.bin"; //state url of your firmware image


static const char *server_certificate = "-----BEGIN CERTIFICATE-----\n" \
xxxxxxxxxxxxxxxxxxxxxxxxxx
"-----END CERTIFICATE-----";

static HttpsOTAStatus_t otastatus;

void HttpEvent(HttpEvent_t *event)
{
    switch(event->event_id) {
        case HTTP_EVENT_ERROR:
            Serial.println("Http Event Error");
            break;
        case HTTP_EVENT_ON_CONNECTED:
            Serial.println("Http Event On Connected");
            break;
        case HTTP_EVENT_HEADER_SENT:
            Serial.println("Http Event Header Sent");
            break;
        case HTTP_EVENT_ON_HEADER:
            Serial.printf("Http Event On Header, key=%s, value=%s\n", event->header_key, event->header_value);
            break;
        case HTTP_EVENT_ON_DATA:
            break;
        case HTTP_EVENT_ON_FINISH:
            Serial.println("Http Event On Finish");
            break;
        case HTTP_EVENT_DISCONNECTED:
            Serial.println("Http Event Disconnected");
            break;
    }
}

void setup(){

    Serial.begin(115200);
    Serial.print("Attempting to connect to SSID: ");
    WiFi.begin(ssid, password);

    // attempt to connect to Wifi network:
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(1000);
    }

    Serial.print("Connected to ");
    Serial.println(ssid);
    
    HttpsOTA.onHttpEvent(HttpEvent);
    Serial.println("Starting OTA");
    HttpsOTA.begin(url, server_certificate);
    
    Serial.println("Please Wait it takes some time ...");
}

void loop(){
    otastatus = HttpsOTA.status();
    if(otastatus == HTTPS_OTA_SUCCESS) { 
        Serial.println("Firmware written successfully. To reboot device, call API ESP.restart() or PUSH restart button on device");
        ESP.restart();
    } else if(otastatus == HTTPS_OTA_FAIL) { 
        Serial.println("Firmware Upgrade Fail");
    }
    delay(1000);
}

4、在项目文件中添加partition.csv文件。

文件中内容为:

# Name	Type	SubType	Offset		Size	Flags
nvs,    data,   nvs,    0x9000,     0x5000
otadata,data,   ota,    0xe000,     0x2000
app0,   app,    ota_0,  0x10000,    0x140000
app1,   app,    ota_1,  0x150000,   0x140000
spiffs, data,   spiffs, 0x290000,   0x170000

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

5、在platform.ini文件中添加下列代码。

board_build.partitions = partition.csv

目的是设置esp32-cam的分区表。
6、编译main.cpp文件。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

编译成功后的画面

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

7、烧录main.cpp文件。

确保esp32-cam连接到电脑并且处于下载模式。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

烧录成功后的画面。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

4.4、编写好程序,编译完成,烧录到ESP32中按下rebot键开始OTA更新。

1、打开手机热点。

2、摘下esp32-cam的跳线帽,使其处于运行调试模式。

3、打开Serial Monitor查看esp32-cam运行情况按下esp32-cam上的rebot按钮。

arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

4、esp32-cam进行ota更新。

Serial.Monitor信息
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

至此成功实现esp32-cam的ota更新。

5.问题

我在实现这个过程中遇到过不少问题我在文章中写下做个记录。

5.1 问题一:证书不对

如果获取的证书不对,运行结果直接显示错误,所以证书一定要正确。

5.2 问题二:能下载固件,但是还是更新失败

我返回的错误代码:ESP_ERR_OTA_PARTITION_CONFLICT
原因是:分区保持着正确的运行固件,不能更新到这个这个地方。

其他错误代码请看 错误代码

要解决这个问题我们就要知道ESP32是怎么分区的。
ESP32-Flash分区,基于PlatfromIO-Arduino

我们在项目中添加partition.csv的文件在里面添加一个分区ota_1就能解决问题。
arduino esp32s3 ota,esp32,嵌入式硬件,iot,https,aws

# Name	Type	SubType	Offset		Size	Flags
nvs,    data,   nvs,    0x9000,     0x5000
otadata,data,   ota,    0xe000,     0x2000
app0,   app,    ota_0,  0x10000,    0x140000
app1,   app,    ota_1,  0x150000,   0x140000
spiffs, data,   spiffs, 0x290000,   0x170000

参考资料
[ESP32]点亮LED灯:
https://blog.csdn.net/weixin_52636248/article/details/125350613

使用VScode开发ESP32,PlatformIO开发ESP32:
https://blog.csdn.net/qlexcel/article/details/121527415

esp32学习-手把手搭建idf开发环境:
https://blog.csdn.net/zppsky_123/article/details/122605515

ESP32-Flash分区,基于PlatfromIO-Arduino:
https://blog.csdn.net/liahfdsaf/article/details/119010732

ESP32之 ESP-IDF 教学(十三)—— 分区表:
https://blog.csdn.net/m0_50064262/article/details/122279800

esp32 Flash分区与OTA功能简析:
https://blog.csdn.net/abc517789065/article/details/79891568

固件更新程序:
https://github.com/espressif/arduino-esp32/tree/master/libraries/Update/examples/HTTPS_OTA_Update
返回的错误代码:
https://www.cnblogs.com/shengxiaose/p/16499012.html文章来源地址https://www.toymoban.com/news/detail-784344.html

到了这里,关于ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【ESP8266 快速入门】示例5:Arduino环境实现OTA无线升级固件功能WebServer网页服务器方式

    使用【ESP8266】Arduino环境实现OTA无线升级固件功能,由LED闪烁程序通过OTA升级为PWM呼吸灯程序。 OTA听起来挺牛的一个功能,其全称为(Over-The-Air),直译为空中传送。就是通过无线方式实现固件升级。 对于实际封装好的项目,ESP8266已经包装好了,不方便使用数据线来下载程

    2024年02月03日
    浏览(47)
  • ESP8266 OTA(无线远程升级)热更新

    ESP8266或者ESP32 有一个问题,就是在上传程序在开发板中里面的程序联网IP是固定; 1、如果你的MQTT服务器换 ip、端口、域名等情况那么开发板将无法连接MQTT服务。 2、如果业务需求有变更需要在开发板原有的基础增加一些功能,而这些开发板已经上线部署在各的自动售卖机,

    2024年02月13日
    浏览(41)
  • ESP32 OTA升级

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

    2024年02月16日
    浏览(46)
  • 使用巴法云实现微信消息推送(Arduino,ESP32,HTTPClient HTTPS GET、POST)——文章最后有点补充更新

    首先,这篇不是广告,是我在玩ESP32过程中的一则笔记。 我在玩ESP32的过程中,想把一些信息推送到手机上去。说起来有很多种方式,把ESP32接入到各种云平台上去,然后都可以实现向手机推送消息。 但是我想最好能实现微信消息推送,毕竟微信大家用得比较多,容易接收。

    2024年01月19日
    浏览(141)
  • ESP32cam系列教程003:ESP32cam实现远程 HTTP_OTA 自动升级

    本教程是 ESP32cam 的系列教程之三,使用 Arduino IDE 对 ESP32cam 开发板进行开发。 本教程代码同样使用与其他 ESP32 开发板。 OTA 即空中下载技术(Over-the-Air Technology),其可以安全方便地升级设备的固件或软件。远程升级还可以大大降低成本,节省资源,它已成为物联网设备和产

    2024年02月14日
    浏览(46)
  • stm32 esp8266 ota升级-qt bin文件处理工具

    stm32 esp8266 ota系列文章: stm32 esp8266 ota-快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级-tcp模拟http stm32 esp8266 ota升级-hex合并-烧录-bin生成 stm32 esp8266 ota升级-qt bin文件处理工具 stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面方式 stm32 esp8266 ota升级-自建mqtt和文件服务器全

    2024年02月05日
    浏览(82)
  • 使用stm32进行ota升级

    主要方案: 1、硬件方案:只使用mcu内部flash,没有外置flash。 2、数据传输协议:ymodem,如果不了解ymodem值得去了解下。 3、bootloader和app存放方案:将mcu内部flash分为两块内存,分别存放bootloader和app。 4、ota流程:使用uart进行数据更新,并运行新的程序。 实施: 1、下载“S

    2024年02月13日
    浏览(37)
  • ESP32网络开发实例-搭建ESP32固件远程升级服务器

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

    2024年01月23日
    浏览(53)
  • esp32-s3板子刷固件

    esp32-s3板子可用于micropython编程,需要刷入语言固件库 硬件:esp32-s3板子(需要购买) 固件:GENERIC_S3-20220618-v1.19.1.bin文件 软件:flash_download_tool 下载地址:https://micropython.org/download/GENERIC_S3/ 选用最新的(.bin)文件下载,如下: 下载地址:https://www.espressif.com.cn/zh-hans/support/d

    2024年02月16日
    浏览(45)
  • esp8266(MQTT固件)通过at指令连接阿里云平台

    实验: esp8266 连接阿里云。 准备工作: esp8266 wifi模组 固件烧录工具 串口调试助手 阿里云账号及物联网设备申请 某宝随便买个,多的是: usb连接到电脑上之后,可以识别到串口,说明有固件。 由于新买的模组,芯片内的固件可能并不是我们想要的,此时可自行官网下载固

    2024年01月19日
    浏览(62)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包