Конкатенация http пост данных ответа - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно хранить данные ответа по частям с сервера 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 или своего смартфона.

...