Проблема, связанная с отправкой файлов через SoftAP-соединение на ESP8266

esp8266 arduino-ide esp softap

у меня есть код на моем 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();
}

интересно, есть ли способ решить эту проблему? был бы признателен за любую помощь.

, 👍-1

Обсуждение

Каким образом это приводит к повреждению файла?, @Majenko

например, если это файл изображения, то на клиенте он не откроется. полученные байты отличаются друг от друга, @Arad

server.write(buf, len);? не клиент? вы используете ArduinoWiFiServer?, @Juraj

esp8266 имеет client.write(файл), @Juraj

да, я использую ArduinoWiFiServer, а также я пробовал использовать его с помощью client.write, но тоже не сработало, @Arad

ArduinoWiFiServer не дает вам никаких преимуществ, только накладные расходы. используйте простой WiFiServer. (кстати, я создал ArduinoWiFiServer), @Juraj

Похоже, у вас нет какого-либо механизма, позволяющего клиенту знать, сколько байтов должно быть получено..., @Majenko

моя клиентская часть - это телефон на базе Android. и я получаю поток в пакетах по 1 килобайту, @Arad

посмотрите на пример скетча fsbrowser. он разбивает задачи на отдельные разумные фрагменты вместо одной огромной функции запуска., @dandavis