点击上方“嘉友创信息科技”,选择关注,干货福利,第一时间奉上。
配网后,进入用户任务,用户任务启动MQTT
MQTT订阅接收OTA开始命令
HTTP OTA,3分区,每个分区1340KB(最常用的4MB Flash)
HTTP OTA,2分区,每个分区1984KB,适合更大的项目
【这个界面是不是很熟悉,批量烧写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分区。
分区文件如下:
使用idf.py menuconfig可以切换区分文件
OTA是在OTA0和OTA1分区循环升级,不会破坏出厂分区。
分区文件内容如下:
http:http获取天气
mqtt:手机MQTT控制ESP32指示灯
smartConfig:ESP32配网SmartConfig
【先smartConfig配网,然后连MQTT服务器,手机触发OTA升级】
固件升级包http路径,两个固件,可以循环升级
"http://www.jiauc.com/esp32/esp32s2_ota1.bin"//版本1
"http://www.jiauc.com/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.jiauc.com",
.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;
工程目录结构
首次使用,等待smartConfig配网;
连上MQTT;
手机触发OTA(发布主题消息);
ESP32收到MQTT消息,OTA升级过程及启动
APP收到推送升级成功
谢谢关注,下期更精彩。
收藏、点赞、在看一键三连
-- END --