Мне нужно хранить данные ответа по частям с сервера Apache в файловую систему spiffs, используя espressif esp-idf framework на esp-wroom-32u.
Данные принимаются и хранятся в фоновом режиме, в то время как другие задачи выполняются самостоятельно.Работа.В настоящее время я помещаю данные в очередь из подпрограммы ISR http_client (плохой способ сделать это).Другим решением могут быть MessageBuffers или streamBuffers от FreeRTOS, но он недоступен в этой среде.
/ http_client.c
esp_err_t _http_event_handler_backup_file(esp_http_client_event_t *evt)
{
switch(evt->event_id) {
case HTTP_EVENT_ERROR:
ESP_LOGD("[ HTTP_CLIENT ]", "HTTP_EVENT_ERROR");
break;
case HTTP_EVENT_ON_CONNECTED:
ESP_LOGD("[ HTTP_CLIENT ]", "HTTP_EVENT_ON_CONNECTED");
break;
case HTTP_EVENT_HEADER_SENT:
ESP_LOGD("[ HTTP_CLIENT ]", "HTTP_EVENT_HEADER_SENT");
break;
case HTTP_EVENT_ON_HEADER:
ESP_LOGD("[ HTTP_CLIENT ]", "HTTP_EVENT_ON_HEADER, key=%s,
value=%s", evt->header_key, evt->header_value);
break;
case HTTP_EVENT_ON_DATA:
ESP_LOGD("[ HTTP_CLIENT ]", "HTTP_EVENT_ON_DATA, len=%d",
evt->data_len);
if (!esp_http_client_is_chunked_response(evt->client)) {
xHigherPriorityTaskWoken = pdFALSE;
responseBytes = (char*)evt->data;
xQueueSendFromISR( backupQueue, &responseBytes,
xHigherPriorityTaskWoken);
//ESP_LOGI("[ HTTP_CLIENT ]", "BACKUP CHUNK DATA");
//spiffs_append((char*)evt->data, evt->data_len);
evt->data = 0;
}
break;
case HTTP_EVENT_ON_FINISH:
ESP_LOGD("[ HTTP_CLIENT ]", "HTTP_EVENT_ON_FINISH");
break;
case HTTP_EVENT_DISCONNECTED:
ESP_LOGD("[ HTTP_CLIENT ]", "HTTP_EVENT_DISCONNECTED");
break;
}
return ESP_OK;
}
/ spiffs.c
void spiffs_append(char *dataToAppend, int size)
{
FILE *file;
if ((file = fopen("/spiffs/foo.txt", "r")))
{
fclose(file);
}else{
spiffs_create_file();
}
file = fopen("/spiffs/foo.txt", "a");
fwrite(dataToAppend, 1, size, SP.f);
fclose(file);
}
Хотярезервное копирование работает в фоновом режиме, пользователь должен иметь возможность открывать двери с помощью карты RFID или своего смартфона.