Ошибка при выполнении обновления OTA esp-idf с AWS S3 - PullRequest
0 голосов
/ 03 августа 2020

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

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Если кто-нибудь из будущего столкнется с этой проблемой при попытке примера от esp-idf, проблема в том, что xTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL); вызывается до того, как Wi-Fi будет полностью настроен. У меня есть функция event_handler для Wi-Fi, и создание задачи после события SYSTEM_EVENT_STA_GOT_IP сработало для меня.

1 голос
/ 06 августа 2020

Можете ли вы зарегистрировать размеры кучи до и после запроса.

esp_get_free_heap_size();
esp_get_minimum_free_heap_size();

Возможно, вам понадобится 40 КБ кучи, прежде чем делать запрос https / tls.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...