接前一篇文章:ESP32-C3模组上跑通OTA升级(9)
八、程序调试过程中遇到的问题及解决
前边各篇文章主要讲解了OTA的基础知识以及示例代码,但这其实是(远远)不够的,真正要在ESP32-C3芯片上跑通(即正确运行起来)才算可以。
笔者使用的是advanced_https_ota这个示例项目,如下所示:
项目的主文件为main\advanced_https_ota_example.c。在调试过程中,遇到了不少坑,用了大半天时间逐一把这些坑填平了。下边将这些坑即遇到的问题按照先后顺序记录下来,以供后来者参考,使你们不再花大量时间和精力重复踩坑填坑。
1. No option for server verification is enabled in esp_http_client config问题
详细的问题log如下:
wifi_updfile_md5 is: 0e864846aa6f6146602a809b498f8c74
I (16536) Wi-Fi Module: HTTP_EVENT_DISCONNECTED
I (16576) Wi-Fi Module: OTA started
E (16576) esp_https_ota: No option for server verification is enabled in esp_http_client config.
E (16576) Wi-Fi Module: ESP HTTPS OTA Begin failed
之所以会出现这个问题,是因为笔者放置升级文件的服务器是https(即url为“https://……”),但是又暂时没有证书(很矛盾)。对应到具体代码上,是这样:
esp_http_client_config_t config = {//.url = CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL,//.cert_pem = (char *)server_cert_pem_start,.timeout_ms = CONFIG_EXAMPLE_OTA_RECV_TIMEOUT,.keep_alive_enable = true,
//#ifdef CONFIG_EXAMPLE_SKIP_COMMON_NAME_CHECK.skip_cert_common_name_check = true,
//#endif};config.url = updfile_url;
以上代码片段中,本来“.cert_pem = (char *)server_cert_pem_start,”一行是打开的,例程中也给了一个证书:
但由于是要用自己的服务器升级,所以肯定不能用官方提供的ca_cert.pem这个证书。正常情况下,应该是自己的服务器也给一个证书,但目前暂时还没有(本来是想先不带证书调能省点事,结果反倒费事了)。因此,笔者在代码中注释掉了“.cert_pem = (char *)server_cert_pem_start,”那一行(如上代码所示)。结果编译是能编译通过,运行的时候就出现上述问题了。
针对这个问题咨询了乐鑫的技术支持人员,他们给出的建议是:如果用的是https server,https使用的是ssl协议,这里(指的上边的配置代码)就需要有相应的证书;如果用的是http server进行OTA,则需要开启http OTA相关配置。
乐鑫技术支持人员同时也给了一个参考文章:
ESP32 HTTP OTA test_skip server certificate cn fieldcheck-CSDN博客
这篇文章写得非常好!里边罗列了OTA升级遇到的诸多问题以及解决方法。针对于此问题,给出的解决方法如下:
笔者按照以上指导修改了自己的项目配置:
修改此配置之后,再次编译运行,果然这个错误就不再出现了,即问题解决了。
但是紧接着又出现了新的问题,如下图所示:
这个问题是由于固件版本号相同,因此检查不通过,不允许升级。这真是一波方平、一波又起。
这个错误又该如何解决呢?请看下回。