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更新流程。
①.将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存储桶。
3、创建AWS S3的详细设置。
3.1、S3存储桶名称,AWS区域。
注意命名规则,和存储桶名称必须全局唯一。
3.2、设置对象所有权。
3.3、存储桶公共访问权设置。
不勾选阻止所有公开访问,勾选我了解选项不然不能创建。
3.4、存储桶版本控制设置。
禁用存储桶版本控制
3.5、默认加密设置。
3.6、创建存储桶。
4、设置AWS S3权限。
4.1、点击创建的S3存储桶。
4.2、进入创建的存储桶后点击权限。
4.3、往下翻找到访问控制列表(ACL),点击编辑,设置访问控制列表。
4.4、找到所有人(公有访问权限),点击列出。点击我了解,不然不能保存更改。
4.5、点击保存更改。
5.1、保存完之后退出到AWS S3可以看到创建的存储桶的访问变为公开。
6、上传闪灯程序的.bin文档。
6.1、切换到我们写的闪灯程序,点击烧录,生成.bin文档。
6.2、进入我们创建的存储桶,点击上传。
6.3、上传.bin文档。
6.3.1、.bin文档访问控制列表设置。
6.3.2、点击上传。
7、文档上传成功可以在存储桶中看到。
8、检验是否任何人都能下载文档。
8.1、点击上传的文档。
8.2、复制对象 URL。
8.3、打开浏览器的无痕浏览,将复制的URL输入进去。
8.4、弹出下载框就说明S3存储桶设置正确。
4.2、获取Amazon S3网站证书
可以使用openssl来获取网站证书。
openssl是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
1、打开openssl
2、输入指令查看AWS S3证书。
我的指令是:
注意替换后面的URL改为自己的URL
openssl s_client -showcerts -connect www.esp32-ota-test2.s3.amazonaws.com:443
3、查看获得的证书。
我获得的证书一共有三个,但是第一和第三个我试过没用,只能用第二个。大家可以试试其他两个证书。
4.3、编写HTTPS OTA更新固件程序
上述要准备的东西都准备好后就可以开始编写更新固件的程序了。
1、新建一个platform项目。
2、输入项目名称,开发板,和项目的位置。
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
5、在platform.ini文件中添加下列代码。
board_build.partitions = partition.csv
目的是设置esp32-cam的分区表。
6、编译main.cpp文件。
编译成功后的画面
7、烧录main.cpp文件。
确保esp32-cam连接到电脑并且处于下载模式。
烧录成功后的画面。
4.4、编写好程序,编译完成,烧录到ESP32中按下rebot键开始OTA更新。
1、打开手机热点。
2、摘下esp32-cam的跳线帽,使其处于运行调试模式。
3、打开Serial Monitor查看esp32-cam运行情况按下esp32-cam上的rebot按钮。
4、esp32-cam进行ota更新。
Serial.Monitor信息
至此成功实现esp32-cam的ota更新。
5.问题
我在实现这个过程中遇到过不少问题我在文章中写下做个记录。
5.1 问题一:证书不对
如果获取的证书不对,运行结果直接显示错误,所以证书一定要正确。
5.2 问题二:能下载固件,但是还是更新失败
我返回的错误代码:ESP_ERR_OTA_PARTITION_CONFLICT
原因是:分区保持着正确的运行固件,不能更新到这个这个地方。
其他错误代码请看 错误代码。
要解决这个问题我们就要知道ESP32是怎么分区的。
ESP32-Flash分区,基于PlatfromIO-Arduino
我们在项目中添加partition.csv的文件在里面添加一个分区ota_1就能解决问题。
# 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://www.toymoban.com/news/detail-784344.html
固件更新程序:
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模板网!