Я пытаюсь выполнить обновление OTA с помощью esp-idf, загрузив прошивку из корзины S3. Я использую следующий предоставленный фрагмент:
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 в мой браузер или получаю его, файл загружается нормально. Однако загрузка не выполняется на 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? Я думал, что использовал неправильный сертификат, но, похоже, это произошло еще до того, как сертификат был использован.