#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