Я пытаюсь объединить несколько проектов esp-idf и esp-adf в один, чтобы можно было скачать mp3-файл с URL.Я просмотрел примеры на сайте esp32 и попытался найти похожие решения или примеры, но безрезультатно.Я пытаюсь записать на SD-карту через fwrite, когда он обнаруживает фрагменты данных, но постоянно получает ошибку и устраняет ее в самом fwrite.Я не уверен, что передал неправильный указатель, потому что я перепробовал все, что мог придумать, чтобы он заработал, даже устранял неполадки, если это связано с размером буфера или размером стека задач, но без изменений.Я раскрываю свой код и надеюсь, что у кого-нибудь есть решение о том, почему он не работает, или есть рекомендации по решению этой проблемы.
esp_err_t _http_event_handler(esp_http_client_event_t *evt)
{
switch(evt->event_id) {
case HTTP_EVENT_ERROR:
ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
break;
case HTTP_EVENT_ON_CONNECTED:
ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED");
break;
case HTTP_EVENT_HEADER_SENT:
ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT");
break;
case HTTP_EVENT_ON_HEADER:
ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
break;
case HTTP_EVENT_ON_DATA:
ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
if (!esp_http_client_is_chunked_response(evt->client)) {
if(check==0){
check=1;
FILE* f = fopen("/sdcard/hayden.mp3", "wb");
}
//Write out data
//printf("%.*s", evt->data_len, (char*)evt->data);
//fwrite(evt->data,MAX_HTTP_RECV_BUFFER,1,f);
//printf("%.*s",evt->data);
fwrite(evt->data,evt->data_len,1,f);
//break;
}
break;
case HTTP_EVENT_ON_FINISH:
ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH");
break;
case HTTP_EVENT_DISCONNECTED:
ESP_LOGD(TAG, "HTTP_EVENT_DISCONNECTED");
break;
}
return ESP_OK;
}
static void http_moj_test()
{ //
esp_http_client_config_t config = {
.url = "http://www.hochmuth.com/mp3/Haydn_Cello_Concerto_D-1.mp3",
.event_handler = _http_event_handler,
};
//
esp_http_client_handle_t client = esp_http_client_init(&config);
esp_err_t err = esp_http_client_perform(client);
//error checking
if (err == ESP_OK) {
ESP_LOGI(TAG,"Status=%d, content_lenght=%d", esp_http_client_get_status_code(client),
esp_http_client_get_content_length(client));
}
//free mem
printf("func end ");
esp_http_client_cleanup(client);
return;
}
static void http_test_task(void *pvParameters)
{
app_wifi_wait_connected();
ESP_LOGI(TAG, "Connected to AP, begin http example");
http_moj_test();
fclose(f);
ESP_LOGI(TAG, "Finish http example");
//fwrite(pointer,sizeof(char),1,f);
//fclose(f);
vTaskDelete(NULL);
}
void app_main()
{
esp_err_t let = nvs_flash_init();
if (let == ESP_ERR_NVS_NO_FREE_PAGES || let == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
let = nvs_flash_init();
}
ESP_ERROR_CHECK(let);
app_wifi_initialise();
esp_periph_config_t periph_cfg = { 0 };
esp_periph_init(&periph_cfg);
periph_sdcard_cfg_t sdcard_cfg = {
.root = "/sdcard",
.card_detect_pin = SD_CARD_INTR_GPIO, // GPIO_NUM_34
};
esp_periph_handle_t sdcard_handle = periph_sdcard_init(&sdcard_cfg);
esp_periph_start(sdcard_handle);
while (!periph_sdcard_is_mounted(sdcard_handle)) {
vTaskDelay(100 / portTICK_PERIOD_MS);
}
printf("SD CARD MOUNTED");
FILE* f = fopen("/sdcard/hayden.mp3", "wb");
xTaskCreate(&http_test_task, "http_test_task", 8192*3, NULL, 5, NULL);
printf("TASK COMPLETED");
esp_periph_stop_all();
esp_periph_destroy();
}