Проблема, связанная с отправкой файлов через SoftAP-соединение на ESP8266
у меня есть код на моем esp8266, в котором я пытаюсь отправить файл клиенту, который подключен ко мне через предоставленную мной точку доступа SoftAP.
клиент сначала отправляет нужное имя файла с ключевой строкой "отправить его SD" , затем сервер считывает файл с SD-карты, если он существует, и затем отправляет его клиенту
но обычно требуется несколько попыток отправить файл без повреждения.
клиент.прочитайте код раздела:
if(client){
Serial.println("client available");
data = client.readStringUntil('\n');
data.trim();
Serial.println("\nClient: " + data);
}
отправить код раздела файла:
if(data.indexOf("send it SD") == 0){
data.remove(0, 10);
Serial.println("Client has requested this file: " + data);
if(data.equals("sdDirectory.txt")){
getDirectory(root);
if(SD.exists("/sdDirectory.txt")){
SD.remove("/sdDirectory.txt");
if(!SD.exists("/sdDirectory.txt")){
Serial.println("directory removed");
}
}
File writeDirectory = SD.open("/sdDirectory.txt", FILE_WRITE);
if(writeDirectory){
writeDirectory.println(directory);
writeDirectory.close();
}
}
String result = findInDirectory(root, data);
if(result.indexOf("/") == -1)
result = "/" + result;
Serial.println("result: " + result);
File SDfile = SD.open(result);
if(!SDfile){
Serial.println("not found");
return;
}
byte buf[1024];
String str_error = "error has occured";
byte error[str_error.length() + 1];
int siz = SDfile.size();
int i=0;
Serial.println("file size: " + String(siz));
while(siz > 0) {
size_t len = std::min((int)(sizeof(buf) - 1), siz);
SDfile.read(buf, len);
int t = server.write(buf, len);
server.flush();
Serial.println("len: " + String(len) + "t: " + String(t));
siz -= len;
}
data.remove(0);
SDfile.close();
}
интересно, есть ли способ решить эту проблему? был бы признателен за любую помощь.
@Arad, 👍-1
Обсуждение0
Смотрите также:
- Ошибка при загрузке «Произошла фатальная ошибка esptool.py: тайм-аут записи»
- Достаточно ли 1 МБ флэш-памяти для загрузки OTA в ESP-01?
- NodeMCU 1.0 автоматически сбрасывается через некоторое время
- Как читать и записывать EEPROM в ESP8266
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Как определить размер Flash?
- Несколько клиентских серверов через Wi-Fi
Каким образом это приводит к повреждению файла?, @Majenko
например, если это файл изображения, то на клиенте он не откроется. полученные байты отличаются друг от друга, @Arad
server.write(buf, len);
? неклиент
? вы используете ArduinoWiFiServer?, @Jurajesp8266 имеет client.write(файл), @Juraj
да, я использую ArduinoWiFiServer, а также я пробовал использовать его с помощью client.write, но тоже не сработало, @Arad
ArduinoWiFiServer не дает вам никаких преимуществ, только накладные расходы. используйте простой WiFiServer. (кстати, я создал ArduinoWiFiServer), @Juraj
Похоже, у вас нет какого-либо механизма, позволяющего клиенту знать, сколько байтов должно быть получено..., @Majenko
моя клиентская часть - это телефон на базе Android. и я получаю поток в пакетах по 1 килобайту, @Arad
посмотрите на пример скетча fsbrowser. он разбивает задачи на отдельные разумные фрагменты вместо одной огромной функции запуска., @dandavis