本文内容

1)使用hello_world例程,编译生成hello_world.bin文件,并且开启HTTP本地服务器。

2)使用simple_ota_example例程,通过HTTP服务器访问hello_world.bin,进行OTA升级。

一、首先完成集成开发环境搭建:

图文手把手教程(史上最强):windows下ESP32集成开发环境搭建和HelloWorld显示(乐鑫官方推荐方法-使用VSCode安装ESP-IDF插件)

二、创建hello_world例程,编译生成hello_world.bin文件。

1)创建示例项目hello_world:VSCODE中->"查看"->”命令面板“->输入:Show Examples projects->选择Use current ESP-IDF(E:\ESP32-IDF\esp\esp-idf)->弹出示例ESP-IDF Examples,选择get-started->hello_world->Create project using example hello_world->选择示例保存的路径。

例如:E:\ESP32-IDF\project-example,因ESP-IDF框架与示例是分离的,所以示例保存的路径可以随意,但需要注意:路径不能有中文和空格,否则报错。

创建完后,如下图所示。

2)一字不改,编译、下载到ESP32开发板。

 打开串口监控,显示信息如下图所示,这里说明这个,是因为后面OTA后,显示的信息要和这个一样,才证明OTA成功。

 展开build,可以看到生成了hello_world.bin文件。

三、hello_world例程中运行HTTP本地服务器。

1)编译链内Python 有一个内置的 HTTP 服务器,我们使用命令运行即可。

python -m http.server 8070

2)hello_world例程中运行HTTP本地服务器,输入上面的命令后按Enter,如下图所示。

 3)打开浏览器,输入地址,例如我自己的地址是:http://192.168.31.107:8070/

注意:地址的组成是IP地址+端口号(8070),IP地址是自己电脑的IPv4地址,每个人都不同。

 打开成功,VSCODE中会显示GET请求。

 4)进入build目录,可以看到hello_world.bin文件,点击可以正常下载。

 5)右键hello_world.bin,在弹出框中“复制链接地址”,后面的OTA会用到,例如我的是:http://192.168.31.107:8070/build/hello_world.bin

 注意:关闭hello_world例程,会将HTTP本地服务器也关闭,后续OTA升级需要重新打开。

四、创建simple_ota_example例程,并修改代码。

1)创建过程,按上面hello_world的来,这里不再详述。

 2)创建完后,如下图所示。

 3)一字不改,编译、下载到ESP32开发板。

首次下载,需要设置COM口,UART。

可以看到,代码什么也不修改,会提示wifi没有连接,如下图所示。

 4)增加wifi连接代码。

#include "freertos/event_groups.h"  //增加头文件
//wifi连上事件定义
static EventGroupHandle_t wifi_event_group;
const static int CONNECTED_BIT = BIT0;//wifi事件处理
static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
{switch (event->event_id) {case SYSTEM_EVENT_STA_START:esp_wifi_connect();break;case SYSTEM_EVENT_STA_GOT_IP:xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);break;case SYSTEM_EVENT_STA_DISCONNECTED:esp_wifi_connect();xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);break;default:break;}return ESP_OK;
}//wifi初始化
static void wifi_init(void)
{tcpip_adapter_init();wifi_event_group = xEventGroupCreate();ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL));wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));wifi_config_t wifi_config = {.sta = {.ssid = "Xiaomi_tao",    //路由器wifi帐号.password = "123456", //路由器wifi密码},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));ESP_LOGI(TAG, "start the WIFI SSID:[%s]", wifi_config.sta.ssid);ESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "Waiting for wifi");//等待wifi连上xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY);
}

5)修改OTA任务函数--simple_ota_example_task(),将url改为自己本机IP地址。

//http客户端配置esp_http_client_config_t config = {//.url = CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL,  //注释掉.url = "http://192.168.31.107:8070/build/hello_world.bin",//增加.cert_pem = (char *)server_cert_pem_start,.event_handler = _http_event_handler,.keep_alive_enable = true,
#ifdef CONFIG_EXAMPLE_FIRMWARE_UPGRADE_BIND_IF.if_name = &ifr,
#endif};

6)修改app_main()函数。

void app_main(void)
{// Initialize NVS.esp_err_t err = nvs_flash_init();if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {// 1.OTA app partition table has a smaller NVS partition size than the non-OTA// partition table. This size mismatch may cause NVS initialization to fail.// 2.NVS partition contains data in new format and cannot be recognized by this version of code.// If this happens, we erase NVS partition and initialize NVS again.ESP_ERROR_CHECK(nvs_flash_erase());err = nvs_flash_init();}ESP_ERROR_CHECK(err);get_sha256_of_partitions();ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());/* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.* Read "Establishing Wi-Fi or Ethernet Connection" section in* examples/protocols/README.md for more information about this function.*///ESP_ERROR_CHECK(example_connect());//注释掉原来的wifi_init();//增加wifi初始化#if CONFIG_EXAMPLE_CONNECT_WIFI/* Ensure to disable any WiFi power save mode, this allows best throughput* and hence timings for overall OTA operation.*/esp_wifi_set_ps(WIFI_PS_NONE);
#endif // CONFIG_EXAMPLE_CONNECT_WIFIxTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL);
}

7)打开SDK可视化配置,检查flash大小设定和“partition table”分区表设定。

左下角,点击SDK可视化配置按钮,进入配置。flash大小为4MB,Partition Table选择Factory app, two OTA definitions,分区表烧写偏移地址0x8000,如果默认是这样,则不用修改,直接关闭窗口即可。

分区表的说明见官方文档:分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档

 关于分区表所在IDF路径:E:\ESP32-IDF\esp\esp-idf\components\partition_table

 ESP32启动后,所打印的分区表。

8)重新编译、下载到ESP32开发板。

打开串口监控,可以看到wifi连接成功了,但是连接HTTP服务器失败,原因是hello_world项目被关闭了,所以运行的HTTP服务器也跟着关闭了。

五、设置VSCODE打开多个项目文件夹,并开启HTTP服务器。

1)VSCODE打开多个项目文件夹的设置方法。

文件->首选项->设置->窗口>>新建窗口->Open Folders In New Window,这里设置为on即可。

2)打开hello_world例程,开启HTTP本地服务器。

在simple_ota_example例程中,文件->打开文件夹->选择hello_world例程,这时可以看到两个例程各占一个窗口,这样在确保hello_world例程中开启HTTP本地服务器,可以同时串口监控OTA升级的过程。

 hello_world例程中开启HTTP本地服务器,终端中输入命令:python -m http.server 8070

六、simple_ota_example例程中串口监控OTA升级的过程。

simple_ota_example例程中,打开串口监控,打开时会复位ESP32,如下图所示。

至此,使用本地HTTP服务器,进行OTA升级的已全部完成,愉快的玩耍吧!

完整的例程代码下载:https://download.csdn.net/download/felix_tao/86268442

使用例程,报错怎么办,解决办法如下:

1)打开VSCODE报错,c_cpp_properties.json无法找到E:\\ESP32-IDF...

解决办法:点击.vscode->c_cpp_properties.json,修改盘符即可,例如将E盘改为D盘。

2)编译工程报错:

[0/1] Re-running CMake...
FAILED: build.ninja 
CreateProcess failed: The system cannot find the file specified.
ninja: error: rebuilding 'build.ninja': subcommand failed

解决方法:清除编译产生的所有文件,左下角->点击垃圾桶图标(ESP-IDF Full Clean)->清除后,接着重新编译即OK。

本文参考了以下博客,鸣谢!

2022.05 ESP32 空中升级 OTA_事在人wёi的博客-CSDN博客_esp32空中升级

第二十章 ESP32的空中升级(OTA)_开源一小步的博客-CSDN博客_esp32 ota

ESP32分区表图解_SimonLiu009的博客-CSDN博客_esp32分区详解

图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)相关推荐

  1. 图文手把手教程--ESP32 OTA空中升级(阿里云物联网平台)

    本文内容 1)使用ota_example_mqtt例程,通过阿里云物联网平台,进行OTA升级. 2)将例程编译成两个版本,版本1.0.0下载至ESP32开发板,版本2.0.0上传至阿里云物联网平台. ...

  2. 图文手把手教程--ESP32 MQTT连接腾讯云物联网平台及OTA固件升级

    本文内容 1)在腾讯云物联网开发平台,新建项目,并在项目下新建设备"light_001". 2)下载腾讯云SDK-esp-qcloud,使用例程led_light,通过" ...

  3. 图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)

    本文内容 1)使用MQTT_TCP例程,ESP32通过MQTT协议与MQTT本地服务器(EMQX)进行通信. 2)如何搭建EMQX MQTT本地服务器. 3)如何使用MQTT.fx客户端调试工具或MQ ...

  4. 图文手把手教程--ESP32 MQTT连接阿里云生活物联网平台

    本文内容 1)在阿里云生活物联网平台,创建自有品牌项目,并在项目下创建产品"智能灯001". 2)下载阿里云SDK-esp-aliyun,使用例程smart_light,通过&qu ...

  5. 图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)

    本文内容 1)使用smart_config例程,使用乐鑫ESPTouch APP或者微信公众号配网. 2)修改smart_config例程,使ESP32复位后,如果已配过网,则不再进行配网,而是直接连 ...

  6. ES32中OTA空中升级

    打开SDK可视化配置,检查flash大小设定和"partition table"分区表设定. 左下角,点击SDK可视化配置按钮,进入配置.flash大小为4MB,Partition ...

  7. c语言空中升级协议,esp32 http空中升级

    1. 先搭建一个HTTP服务器 先将hello_wordl例子拷贝到~/esp中,在hello_wordl/build中创建get文件夹,且将hello-world.bin 放进去. cp -r $I ...

  8. 58 ESP32 OTA升级(双OTA分区无factory APP)

    1 引言 产品功能实现后,就要对产品的维护进行考虑.产品出来后,卖了N台出去,如果突然发现自己一行代码写错了,怎么办,肯定不能去现场吧N台设备,免费出差旅游也累啊,所以一般需要有远程升级设备的功能,此 ...

  9. ESP32 OTA升级之HTTP OTA

    ESP32 OTA升级之 HTTP OTA 文章目录 ESP32 OTA升级之 HTTP OTA 1. 前言 2. 搭建http本地服务器 2. HTTP OTA 3. 补充学习 1. 前言 在所有电 ...

最新文章

  1. 《帝企鹅日记》观后感
  2. 使用 ale.js 制作一个小而美的表格编辑器(3)
  3. 监控利器nagios
  4. AB1601某些io口不支持较高频率信号的输入
  5. 转载爱哥自定义View系列--Paint详解
  6. 工业级交换机的5个常见的优点解析
  7. 关于单片机串口发送和接收的问题
  8. 第一章 Shiro简介——《跟我学Shiro》
  9. ABAP,Java, nodejs和go语言的web server编程 1
  10. ftk学习记(输入法篇)
  11. Java-Eclipse快捷键汇总
  12. [PATCH] UBUNTU: SAUCE: (no-up) apparmor: Sync to apparmor3 - RC1(v3.4.x kernel)
  13. 如何理解“KISS 原则”?
  14. VS(Microsoft Visual Studio)C语言一个解决方案内部创建多个项目
  15. Cent OS 下 VI 使用方法
  16. CDD文件——CANdelaStudio
  17. Matrices(矩阵)
  18. react 基础学习
  19. 推荐5 个 NeoVim GUI 编辑器
  20. 如何使用Bootstrap 5从jQuery切换到Vanilla JavaScript

热门文章

  1. 生长发育的时间窗口,5岁前学英语
  2. 百度地图设置卫星、矢量模式,球模型和瓦片模型加载
  3. php程序设计ppt,PHP程序设计基础知识.ppt
  4. 【转】CAN总线学习笔记(2)- CAN协议数据帧与遥控帧
  5. 【PaaS】成就若干个独角兽,炎黄盈动BPM PaaS重塑企业应用生态价值
  6. 数字游戏(1-43)---等差数列---o(n)
  7. CTA-OS-拨打电话
  8. 【FastAPI 03】FastAPI快速搭建一个博客系统
  9. word保存提示“由于文件许可错误,word无法完成保存”的解决办法
  10. C++ 中对浮点数的输出控制