从AWS S3执行esp-idf OTA更新时出错



我正试图通过从S3存储桶下载固件来执行带有esp-idf的OTA更新。我使用以下提供的片段:

esp_http_client_config_t config = {
.url = "https://my-bucket-name-here.s3.amazonaws.com/firmware.bin",
.cert_pem = (char *)server_cert_pem_start,
.event_handler = _http_event_handler,
};
esp_err_t ret = esp_https_ota(&config);
if (ret == ESP_OK) {
esp_restart();
} else {
ESP_LOGE(TAG, "Firmware upgrade failed");
}

当把这个URL放在我的浏览器或wget中时,文件下载很好。但是,在ESP32上下载失败。我收到以下消息:

␛[0;31mE (1043) esp-tls: couldn't get hostname for :my-bucket-name-here.s3.amazonaws.com:␛[0m
␛[0;31mE (1053) esp-tls: Failed to open new connection␛[0m>
␛[0;31mE (1063) TRANS_SSL: Failed to open a new connection␛[0m
␛[0;31mE (1063) HTTP_CLIENT: Connection failed, sock < 0␛[0m
␛[0;31mE (1073) esp_https_ota: Failed to open HTTP connection: ERROR␛[0m
␛[0;31mE (1073) esp_https_ota: Failed to establish HTTP connection␛[0m
␛[0;31mE (1083) subpub: Firmware upgrade failed␛[0m

我能够追踪到引发第一个错误的函数。它是由resolve_host_name()esp_tls.c中抛出的。具体来说,错误发生在这个代码块中:

if (getaddrinfo(use_host, NULL, &hints, address_info)) {
ESP_LOGE(TAG, "couldn't get hostname for :%s:", use_host);
free(use_host);
return ESP_ERR_ESP_TLS_CANNOT_RESOLVE_HOSTNAME;
}

为什么getaddrinfo不能解析S3存储桶地址?我想我可能用错了证书,但这似乎是在证书使用之前。

您可以在请求前后记录堆大小吗。

esp_get_free_heap_size();
esp_get_minimum_free_heap_size();

在发出https://tls请求之前,您可能需要40K的可用堆。

如果将来有人在尝试esp-idf的示例时遇到这个问题,问题是在wifi完全设置之前调用了xTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL);。我有一个用于wifi的event_handler功能,在SYSTEM_EVENT_STA_GOT_IP事件后创建任务对我有效。

相关内容

  • 没有找到相关文章

最新更新