基于ESP-IDF4.1

  1. 1 #include "freertos/FreeRTOS.h"
  2. 2 #include "freertos/task.h"
  3. 3 #include "esp_system.h"
  4. 4 #include "esp_event.h"
  5. 5 #include "esp_log.h"
  6. 6 #include "esp_ota_ops.h"
  7. 7 #include "esp_http_client.h"
  8. 8 #include "esp_https_ota.h"
  9. 9 #include "protocol_examples_common.h"
  10. 10 #include "string.h"
  11. 11
  12. 12 #include "nvs.h"
  13. 13 #include "nvs_flash.h"
  14. 14 #include "protocol_examples_common.h"
  15. 15
  16. 16 #if CONFIG_EXAMPLE_CONNECT_WIFI
  17. 17 #include "esp_wifi.h"
  18. 18 #endif
  19. 19
  20. 20 static const char *TAG = "simple_ota_example";
  21. 21 extern const uint8_t server_cert_pem_start[] asm("_binary_ca_cert_pem_start");
  22. 22 extern const uint8_t server_cert_pem_end[] asm("_binary_ca_cert_pem_end");
  23. 23
  24. 24 #define OTA_URL_SIZE 256
  25. 25
  26. 26 //http事件处理程序
  27. 27 esp_err_t _http_event_handler(esp_http_client_event_t *evt)
  28. 28 {
  29. 29 switch (evt->event_id) {
  30. 30 case HTTP_EVENT_ERROR:
  31. 31 ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
  32. 32 break;
  33. 33 case HTTP_EVENT_ON_CONNECTED:
  34. 34 ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED");
  35. 35 break;
  36. 36 case HTTP_EVENT_HEADER_SENT:
  37. 37 ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT");
  38. 38 break;
  39. 39 case HTTP_EVENT_ON_HEADER:
  40. 40 ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
  41. 41 break;
  42. 42 case HTTP_EVENT_ON_DATA:
  43. 43 ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
  44. 44 break;
  45. 45 case HTTP_EVENT_ON_FINISH:
  46. 46 ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH");
  47. 47 break;
  48. 48 case HTTP_EVENT_DISCONNECTED:
  49. 49 ESP_LOGD(TAG, "HTTP_EVENT_DISCONNECTED");
  50. 50 break;
  51. 51 }
  52. 52 return ESP_OK;
  53. 53 }
  54. 54
  55. 55 //OTA任务
  56. 56 void simple_ota_example_task(void *pvParameter)
  57. 57 {
  58. 58 ESP_LOGI(TAG, "Starting OTA example");
  59. 59
  60. 60 esp_http_client_config_t config = {
  61. 61 .url = CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL,
  62. 62 .cert_pem = (char *)server_cert_pem_start,
  63. 63 .event_handler = _http_event_handler,
  64. 64 };
  65. 65
  66. 66 #ifdef CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL_FROM_STDIN
  67. 67 char url_buf[OTA_URL_SIZE];
  68. 68 if (strcmp(config.url, "FROM_STDIN") == 0) {
  69. 69 example_configure_stdin_stdout();
  70. 70 fgets(url_buf, OTA_URL_SIZE, stdin);
  71. 71 int len = strlen(url_buf);
  72. 72 url_buf[len - 1] = '\0';
  73. 73 config.url = url_buf;
  74. 74 } else {
  75. 75 ESP_LOGE(TAG, "Configuration mismatch: wrong firmware upgrade image url");
  76. 76 abort();
  77. 77 }
  78. 78 #endif
  79. 79
  80. 80 #ifdef CONFIG_EXAMPLE_SKIP_COMMON_NAME_CHECK
  81. 81 config.skip_cert_common_name_check = true;
  82. 82 #endif
  83. 83
  84. 84 esp_err_t ret = esp_https_ota(&config);
  85. 85 if (ret == ESP_OK) {
  86. 86 esp_restart();
  87. 87 } else {
  88. 88 ESP_LOGE(TAG, "Firmware upgrade failed");
  89. 89 }
  90. 90 while (1) {
  91. 91 vTaskDelay(1000 / portTICK_PERIOD_MS);
  92. 92 }
  93. 93 }
  94. 94
  95. 95 void app_main(void)
  96. 96 {
  97. 97 // 初始化非易失性存储
  98. 98 esp_err_t err = nvs_flash_init();
  99. 99 if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  100. 100 //1.OTA应用程序分区表的NVS分区大小比非OTA分区表小。这种大小不匹配可能导致NVS初始化失败.
  101. 101 //2.NVS分区包含新格式的数据,此版本的代码无法识别。如果发生这种情况,我们将擦除NVS分区并再次初始化NVS.
  102. 102 ESP_ERROR_CHECK(nvs_flash_erase());
  103. 103 err = nvs_flash_init();
  104. 104 }
  105. 105 ESP_ERROR_CHECK(err);
  106. 106
  107. 107 ESP_ERROR_CHECK(esp_netif_init());
  108. 108 ESP_ERROR_CHECK(esp_event_loop_create_default());
  109. 109
  110. 110 //连接网络
  111. 111 ESP_ERROR_CHECK(example_connect());
  112. 112
  113. 113 #if CONFIG_EXAMPLE_CONNECT_WIFI
  114. 114 //确保禁用低功耗模式,这样可以提供最佳的吞吐量,从而为整个OTA操作节省时间
  115. 115 esp_wifi_set_ps(WIFI_PS_NONE);
  116. 116 #endif
  117. 117
  118. 118 xTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL);
  119. 119 }

原文:https://gitee.com/EspressifSystems/esp-idf/tree/master/examples/system/ota/simple_ota_example

ESP32-简单OTA升级的更多相关文章

  1. 乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级

    目录 一.前言: 二.回顾下OTA的流程: 三.lwip网络框架的知识的使用: 四.如何处理服务器返回的数据? 五.扇区的擦除和烧写? 六.如何调用? 七.好好享用吧! 八.下载: 九.工程截图: 代 ...

  2. 实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件

    代码地址如下:http://www.demodashi.com/demo/12994.html 一.前言: 写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug ...

  3. OTA升级中关于update.zip包的一些总结【转】

    本文转载自:http://429564140.iteye.com/blog/2337165 update.zip包整理 一. update.zip包的目录结构           |----boot. ...

  4. Android OTA 升级之三:生成recovery.img

    Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...

  5. android 标准OTA升级流程

    标准的OTA升级流程包括一下几个步骤: 1.Android设备首先会与OTA服务器进行交互,如果有更新会推送给客户.推送的信息常常会包含OTA更新包的下载地址和一些版本信息. 2.Update程序会将 ...

  6. ESP8266远程OTA升级

    https://blog.csdn.net/xh870189248/article/details/80095139 https://www.wandianshenme.com/play/arduin ...

  7. ota升级动画修改

    在网上可以搜到很多相关的文章,但是很多文章都是复制粘贴而来的,为了方便后面工作学习,本文会把其中最关键的几个步骤列出来. 首先根据ota升级界面的文字可以确认相关的图片资源的目录在哪里,可以网上搜一下 ...

  8. OTA升级

    除了云端平台这部分,还要有通讯协议层面.云端和汽车端之间指令的接口和协议的制定,不同车厂会有不同诉求.艾拉比既可以支持车厂私有化定制协议的要求,也可以提供基于OMA标准的协议. 第一,它既是云端的工具 ...

  9. Android Recovery OTA升级(一)—— make otapackage

    文件夹 文件夹 概述 make otapackage BUILT_TARGET_FILES_PACKAGE ota_from_target_files WriteFullOTAPackage Sign ...

  10. OTA升级详解(一)

    不积跬步,无以至千里: 不积小流,无以成江海. 出自荀子<劝学篇> 1.概念解释 OTA是何物? 英文解释为 Over The Air,既空中下载的意思,具体指远程无线方式,OTA 技术可 ...

随机推荐

  1. Zabbix 5.0:磁盘读写监控

    Blog:博客园 个人 自动发现磁盘 配置键值 注意:此键值仅支持Linux平台. 此发现键值返回两个宏 : {#DEVNAME} :设备名 {#DEVTYPE} :设备类型 例如: [ { &quo ...

  2. sublime使用与配置

    目录 Download Markdown转浏览器显示 1. 简单版本 2. 有MD全格式版本 Install Package Control 删除文本空行 1. Ctrl + H 2. Find \s ...

  3. OFRecord 图片文件制数据集

    OFRecord 图片文件制数据集 在 OFRecord 数据格式 和 加载与准备 OFRecord 数据集 中,分别学习了 OFRecord 数据格式,以及如何将其它数据集转为 OFRecord 数 ...

  4. 旷视MegEngine网络搭建

    旷视MegEngine网络搭建 在 基本概念 中,介绍了计算图.张量和算子,神经网络可以看成一个计算图.在 MegEngine 中,按照计算图的拓扑结构,将张量和算子连接起来,即可完成对网络的搭建.M ...

  5. 如何使用TensorCores优化卷积

    如何使用TensorCores优化卷积 本文将演示如何在TVM中使用TensorCores编写高性能的卷积计划.假设卷积的输入有大量数据.首先介绍如何在GPU上优化卷积. TensorCore简介 每 ...

  6. 基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化

    基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化 Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Auto ...

  7. 解决redis集群版本不一致导致RDB同步失败的问题

    某天,运维反馈某两个机房的出口流量和入口流量过大,并且持续了好一段时间. 再仔细排查后发现是 redis 集群的几台服流量问题,于是开始查日志. 在日志中发现出现大量的 Can't handle RD ...

  8. ubuntu初识

    简单的Linux系统理解 Ubuntu ctrl+alt 可以令虚拟机释放鼠标,回到主系统中. 如果ubuntu有问题,如何重装? -------直接删除目录.虚拟机内的操作不会影响到宿主机. 1.挂 ...

  9. 【无线通信篇01 | Zstack协议栈】CC2530 Zigbee Zstack协议栈组网项目及详细讲解篇

    演示视频:https://www.bilibili.com/video/BV1Ew411o7Fp 物联网无线通信技术,ZigBee无线传感网络 CC2530最大的特点就是一个拥有无线收发器(RF)的单 ...

  10. Linux集群环境下NTP服务器时间同步

    NTP介绍 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC(Universal Time ...