从 AWS S3 执行 esp-idf OTA 更新时出错
Error performing esp-idf OTA update from AWS S3
我正在尝试通过从 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
here 中抛出的。具体来说,错误发生在这段代码中:
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 中的 example 时遇到此问题,问题是 xTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL);
在 wifi 完全设置之前被调用。我有一个用于 wifi 的 event_handler
函数,并且在 SYSTEM_EVENT_STA_GOT_IP
事件对我有用后创建任务。
我正在尝试通过从 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
here 中抛出的。具体来说,错误发生在这段代码中:
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 中的 example 时遇到此问题,问题是 xTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL);
在 wifi 完全设置之前被调用。我有一个用于 wifi 的 event_handler
函数,并且在 SYSTEM_EVENT_STA_GOT_IP
事件对我有用后创建任务。