ota使用在智能家居上非常常见,当供应商需要对远程智能家居进行固件更新,让用户插在电脑上串口升级显然是不可能的,所以需要进行无限升级 yeah~。

无论是stm32、esp32都了解他们的固件存储位置,专业点讲就是分区,在esp32默认分区中,并不存在ota分区,所以需要在menuconfig中设置新的分区表,如图,我在vscode中设置:

part.png

这个分区表将esp32上外置的4MB flash分为以下几个部分:

# ESP-IDF Partition Table
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000,  1M,
ota_0,    app,  ota_0,   0x110000, 1M,
ota_1,    app,  ota_1,   0x210000, 1M,

而后我们第一烧录的程序bin文件会储存在factory分区(出厂固件)中,下一次的固件升级会存放在ota_0分区中,下下一次存放在ota_1分区中,下下下一次存放在ota_0分区中,这样以后的固件会在这两个ota分区中反复跳动,从哪个分区启动数据存放在otadata分区中,如下图所示:

6793005-68b34f943cf297fa.png

ota更新时,实现流程在这里:
1、电脑建立http(非https)服务器,原理上就是用python脚本实现一个浏览器云盘的功能,python -m http.server 8070,输入这行代码在浏览器打开网址:本机IP加8070端口号就可以看到http服务器功能已经实现,bin文件需要存在。
2、修改服务器IP、ssid、pwd等信息,关掉加密方式,在代码中新建自己的ota升级触发方式。
3、我的task任务为:

void task1(void* para)
{
    for(int i=0;i<15;i++)
    {
        printf("this is the first bin %d\n",i);
        vTaskDelay(100);
    }
    xTaskCreate(&advanced_ota_example_task, "advanced_ota_example_task", 1024 * 8, NULL, 5, NULL);
    vTaskDelete(NULL);
}

也就是,任务一的功能为倒数十五秒钟,输出字符串,结束后进行ota更新,这是我们简单修改代码进行编译,与第一个代码输出存在不同即可,进行观察,发现第一次ota更新后,输出字符串的确会发生变化,多进行几次,功能均正常。
实现流程图如下:
ota_workflow.png

其他需要注意的地方:
1、在代码中关闭版本检查,只要文件存在就下载更新。
2、注释掉版本号检察。
3、在代码中修改服务器IP与文件名,并且关闭cert_pem加密认证。
4、可以在分区表中看到,出场区、ota0、ota1只有一MB的空间,这就决定了而我们的固件不可以太大。
5、暂时更新这么多。后续有需要再进行补充,计划使用esp32-lvgl写一个页面,实现在线更新。