Загрузка файла ESP32 / C в виде строки

#c #arduino #download #esp32

#c #arduino #Скачать #esp32

Вопрос:

Повторная отправка вопроса, поскольку он был незаконно запрещен (см. PS)

У меня есть сервер загрузки файлов (называющий его myfilesserver.xyz), использующий http (не https), и я хочу загрузить с него файл. В python у меня есть простой 2-строчный фрагмент кода, который делает именно это (см. Ниже). Но в C на моем ESP32 я не могу просто сделать это с помощью HTTP-запроса, он возвращает пустой ответ.

Я не нашел решения в Google, кто-нибудь знает (предпочтительный компактный) способ загрузки файла и чтения его содержимого в виде строки?

Код Python

 import requests
x = requests.get("http://fileserver/release/file.bin")
  

PS Я уже использую для этого библиотеку, ее HttpClient, которая поставляется в комплекте с большинством Arduino. Я не ищу новый. Я хочу знать, возможно ли это сделать с этим.

Я не собираюсь обрезать код перед его публикацией здесь, потому что в прошлый раз, когда я это делал, мне сказали не делать этого. Если я ошибаюсь в этом, пожалуйста, скажите мне.

Код, который я сейчас использую:

 void update(String repoUrl) {
  HTTPClient http;
  http.begin(repoUrl);
  int httpCode = http.GET();
  if (httpCode > 0) {
    if (httpCode == HTTP_CODE_OK) {
      payload = http.getString().substring(22);
    } else {
      Serial.println("Wrong HTTP Response: "   httpCode);
      return;
    }
  } else {
    Serial.println("Wrong HTTP Response: "   httpCode);
    return;
  }

  http.begin(payload);
  httpCode = http.GET();
  if (httpCode > 0) {
    if (httpCode == HTTP_CODE_OK) {
      payload = http.getString().substring(22);
    } else {
      Serial.println("Wrong HTTP Response: "   httpCode);
      return;
    }
  } else {
    Serial.println("Wrong HTTP Response: "   httpCode);
    return;
  }
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS!");
    return;
  }
  File fileWrite = SPIFFS.open("/update.bin", FILE_WRITE);
  if(!fileWrite){
    Serial.println("An error has occured while opening the file for writing!");
    return;
  }
  String fw = http.getString();
  Serial.println(fw);
  fileWrite.print(fw);
  Serial.println("File should be written, size is "   fileWrite.size());
  fileWrite.close();
  
  File fileRead = SPIFFS.open("/update.bin");
  if (fileRead) {
    if(fileRead.isDirectory()){
      Serial.println("Error, update.bin is not a file");
      fileRead.close();
      return;
  }
  size_t fileSize = fileRead.size();
  if (fileSize > 0) {
    Serial.println("Try to start update");
    if (Update.begin(fileSize)) {      
      size_t written = Update.writeStream(fileRead);
      if (written == fileSize) {
        Serial.println("Written : "   String(written)   " successfully");
      } else {
        Serial.println("Written only : "   String(written)   "/"   String(fileSize)   ". Retry?");
      }
      if (Update.end()) {
        Serial.println("OTA done!");
        if (Update.isFinished()) {
          Serial.println("Update successfully completed. Rebooting.");
        } else {
          Serial.println("Update not finished? Something went wrong!");
        }
      } else {
        Serial.println("Error Occurred. Error #: "   String(Update.getError()));
      }
    } else {
      Serial.println("Not enough space to begin OTA");
    }
  } else {
      Serial.println("Error, file is empty");
  }
  fileRead.close();
  
  // when finished remove the binary from sd card to indicate end of the process
    SPIFFS.remove("/update.bin");      
  } else {
    Serial.println("Could not load update.bin from sd root");
  }

}
  

Комментарии:

1. Вы должны добавить больше деталей. Не совсем понятно, в чем проблема. Вы говорите, что у вас был пустой ответ. Был ли код ошибки? Что это был за код? Вы говорите, что сами запускаете HTTP-сервер. Что отображается в его журналах? Что именно он обслуживает? Это настоящий текстовый файл? Ваш URL предполагает, что это могут быть двоичные данные, которые не подходят для строк на C , поскольку в строке a char со значением '' интерпретируется как конец строки. Если вы получаете двоичные данные, вы должны сохранить их в соответствующем контейнере, таком как вектор байтов.

2. библиотеки HttpClient разные. для esp32 смотрите Пример StreamHttpClient