分享

[开源重卷]ESP32配网 MQTT http OTA(两种分区),esp-idf v4.3.1

 myallmy 2022-10-14 发布于北京
00
重卷的意义

  • 配网后,进入用户任务,用户任务启动MQTT

  • MQTT订阅接收OTA开始命令

  • HTTP OTA,3分区,每个分区1340KB最常用的4MB Flash

  • HTTP OTA,2分区,每个分区1984KB,适合更大的项目

01
BOOT和分区表

Image

【这个界面是不是很熟悉,批量烧写ESP32的程序,每个程序都需要这三个bin】

  • 引导加载程序:bootloader

  • 分区设置:partitions_xxx.bin,图片是单分区不用于OTA,还有自定义和3分区常用于OTA

  • 应用程序:hello-world.bin,OTA就是更新这个bin,不改变boot和分区结构

一、引导加载程序(BOOT)

分区表前的区域都分配给了引导加载程序。

当偏移为0x8000 时,引导加载程序最大可为 0x7000字节(28K)。

如果自定义修改了引导加载程序,造成过大,可以有以下解决办法:

  • 修改引导加载程序的编译等级

  • 修改引导加载程序的log等级

  • 修改分区设置偏移 CONFIG_PARTITION_TABLE_OFFSET ,改成大于0x8000

二、创建自定义分区表

此项目没有使用默认的ota分区,使用的是自定义分区:2个或者3个App分区。

分区文件如下:

Image

使用idf.py menuconfig可以切换区分文件

Image

Image

OTA是在OTA0和OTA1分区循环升级,不会破坏出厂分区。

Image

分区文件内容如下:

Image

Image

02
其他介绍

03
软件流程

【先smartConfig配网,然后连MQTT服务器,手机触发OTA升级

Image

04
关键代码

固件升级包http路径,两个固件,可以循环升级



'http://www./esp32/esp32s2_ota1.bin'//版本1'http://www./esp32/esp32s2_ota2.bin'//版本2

OTA操作flash接口







 //开始OTA保存(先擦除),放在可用的OTA分区err = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle);//保存OTA数据包err = esp_ota_write( update_handle, (const void *)ota_write_data, data_read);//OTA保存结束err = esp_ota_end(update_handle);

MQTT初始化:域名、端口、账号、密码













static void mqtt_app_start(void){ esp_mqtt_client_config_t mqtt_cfg = { .host = 'www.', .port = 1883, .username = 'admin', .password = '123456',    }; esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client); esp_mqtt_client_start(client);}

HTTP操作接口











client = esp_http_client_init(&config);//打开err = esp_http_client_open(client, 0);//循环读取http数据int data_read = esp_http_client_read(client, ota_write_data, BUFFSIZE);//检查是否读取了http响应中的整个数据而没有任何错误if (esp_http_client_is_complete_data_received(client) != true)//关闭esp_http_client_close(client);esp_http_client_cleanup(client);

MQTT订阅主题'/topic/qos0'


msg_id = esp_mqtt_client_subscribe(client, '/topic/qos0', 0);

手机控制ESP32 OTA升级











case MQTT_EVENT_DATA://接收到已定阅主题数据  ESP_LOGI(TAG, 'MQTT_EVENT_DATA');  printf('TOPIC=%.*s\r\n', event->topic_len, event->topic);  printf('DATA=%.*s\r\n', event->data_len, event->data);  //启动ota  if(strstr(event->data,'ota')!=NULL)  {      ota_start(event->data,event->data_len);  }break;

工程目录结构

Image

05
验证

首次使用,等待smartConfig配网;

Image

连上MQTT;

Image

手机触发OTA(发布主题消息);

Image

ESP32收到MQTT消息,OTA升级过程及启动

Image

Image

APP收到推送升级成功

Image

06
源码下载

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多