Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Jun 27 23:02
    rblilja commented #1172
  • Jun 27 22:43
    rblilja opened #1172
  • Jun 27 09:33
    hyansuper commented #1082
  • Jun 27 06:51
    hyansuper commented #303
  • Jun 27 06:48
    hyansuper commented #303
  • Jun 25 11:18
    BlueAndi commented #1169
  • Jun 24 16:22
    vatsake closed #1171
  • Jun 24 16:22
    vatsake commented #1171
  • Jun 24 14:09
    zekageri commented #1171
  • Jun 24 13:44
    vatsake commented #1171
  • Jun 24 13:43
    vatsake commented #1171
  • Jun 24 10:50
    zekageri commented #1171
  • Jun 24 10:41
    zekageri commented #1171
  • Jun 24 09:41
    vatsake opened #1171
  • Jun 24 05:13
    zekageri commented #1170
  • Jun 24 01:11
    merrywall opened #1170
  • Jun 21 07:23
    me-no-dev commented #1167
  • Jun 21 07:19
    MartinVerges commented #1167
  • Jun 21 07:16
    me-no-dev commented #1167
  • Jun 21 07:08
    MartinVerges commented #1162
bustedbunny
@bustedbunny
sirs. Anyone can take a look at issue?
me-no-dev/ESPAsyncWebServer#962
jethomson
@jethomson
Hello. Is there a way to get the file size before the upload handler is called?
//AsyncCallbackWebHandler& on(const char* uri, WebRequestMethodComposite method, ArRequestHandlerFunction onRequest, ArUploadHandlerFunction onUpload);
web_server.on("/flash_firmware", HTTP_POST,
[](AsyncWebServerRequest *request) {
    Serial.println("in request handler");
    //"update" is the name of the file input <input type='file' name='update'>
    if (request->hasParam("update", true, true)) {
        Serial.print("request handler - filesize: ");
        Serial.println(String(request->getParam("update", true, true)->size()).c_str());
        upload_file_size = request->getParam("update", true, true)->size();
    }
}, 
[](AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) {
    Serial.println("in upload handler");
    //"update" is the name of the file input <input type='file' name='update'>
    if (request->hasParam("update", true, true)) {
        Serial.print("(1) upload handler - filesize: ");
        Serial.println(String(request->getParam("update", true, true)->size()).c_str());
        upload_file_size = request->getParam("update", true, true)->size();
    }
    Serial.print("(2) upload handler - filesize: ");
    Serial.println(upload_file_size);
    //handle_flash_firmware(request, filename, index, data, len, final);
});
That code prints out:
in upload handler
// notice that (1) upload handler - filesize: is never printed
(2) upload handler - filesize: 0
in request handler
request handler - filesize: 8
So the upload handler is called first but the file size is not available when in the upload handler. I need the file size before the upload process starts.
Cellie
@CelliesProjects

@me-no-dev I am trying to use `errorToString'


  aClient->onError([](void * arg, AsyncClient * client, err_t error) {
    ESP_LOGE( TAG, "aSyncClient error %i", error);
    ESP_LOGE( TAG, "aSyncClient error code %s", errorToString(error)));
    aClient = NULL;
    delete client;
  }, NULL);

but get this message:

In file included from /home/cellie/Arduino/hardware/espressif/esp32/cores/esp32/esp32-hal.h:45:0,
                 from /home/cellie/Arduino/hardware/espressif/esp32/cores/esp32/Arduino.h:35,
                 from /dev/shm/build/arduino/sketch/aSync_client.ino.cpp:1:
/home/cellie/Desktop/aSync_client/aSync_client.ino: In lambda function:
aSync_client:53:68: error: 'errorToString' was not declared in this scope
     ESP_LOGE( TAG, "aSyncClient error code %s", errorToString(error)));
For posterity:

  aClient->onError([](void * arg, AsyncClient * client, err_t error) {
    ESP_LOGE( TAG, "aSyncClient error %i", error);
    ESP_LOGE( TAG, "aSyncClient error code %s", client->errorToString(error));
    aClient = NULL;
    delete client;
  }, NULL);
Solved.
jethomson
@jethomson
@BlueAndi That's the approach I used as a workaround, but it required POSTing with javascript. Having the file size available in the upload handler would make things much the webpage code much simpler.
Mike Dunston
@atanisoft
File uploads are typically a POST, there is a header included by the client with the part size. The callback from the webserver provides a chunk size only. But you should be able to grab the segment header or at worst case the overall Content-Length header (it will be larger than the actual file upload though)
jethomson
@jethomson
I see now that size() (_itemSize) comes from counting up the number of bytes uploaded, so it isn't available until after the upload. The original code I used calls contentLength() which works fine for uploading firmware because firmware size + a little extra from the contentLength() "boundary=----..." header and footer is still less than the space available. The problem is when I try to upload a littlefs.bin that is exactly 1MB and there is 1MB of space available using contentLength() makes it look like the file is too big for the space available.
jethomson
@jethomson
I see if I add an input with the size of the file to my html form before the file input that the file size input gets read in before the upload handler is called, so some potential there to explore. I'll post an update.
jethomson
@jethomson
Yes, this solution works well! It works much better for me than using javascript to POST with a custom header. Uploading is quicker and more reliable.
jethomson
@jethomson
Here are some snippets to help out anyone else that had this problem:

<form id='flash' method='POST' action='/flash_firmware' enctype='multipart/form-data'>
<!--need to upload filesize first because Content-Length [request->contentLength()] isn't the actual file size-->
<input id='filesize' name="filesize" value="0" style="display:none">
<input id='file' type='file' name='update'>
<p></p>
<input id='flash_btn' type='submit' value='Flash'>
</form>

<script>
document.querySelector('form').addEventListener('submit', (e) => {
document.getElementById('filesize').value = document.getElementById('file').files[0].size;
});
</script>

size_t filesize = 0;
if (request->hasParam("filesize", true)) {
// because contentLength() doesn't work for spiffs or littlefs had to use a separate form input to upload actual filesize.
filesize = request->getParam("filesize", true)->value().toInt();
}
else {
// this doesn't work for spiffs or littlefs because contentLength() includes count of bytes in bin file plus header and footer
filesize = request->contentLength();
}
Turbotronics
@Turbotronics
Does anyone still experience the websockets random disconnect issues? I am at the end of a 3 year dev cycle and have not been able to contain it. Only other issue I had was the 5-file limit on filerequest which was solved by using JS function that would only request the next file once it has actually been loaded. Not much difference in download speed. For static images local storage is a great workaround.
Gonzalo
@gnalbandian
Hi @Turbotronics. I have faced the two same issues as you. WebSocket disconnection is an ongoing issues with ESPAsyncWebServer and its underlying use os ESPAsyncTCP. There are many forks that seems to fix this. Haven't tryed anyone yet. It's a pity the main lbrary is stalled and not willing to accept pull requests. The second issues, the 5-file limit, I solve it creating only one huge html file with all the content embedded (html, css, js)
Turbotronics
@Turbotronics
Hi Gonzalo, thanx for the feedback. Do you have links to the other forks? My i/f is a controller dashboard than must always be responsive to user input. I am considering using streams to replace the socket since so far I have had no issues transfering data that way. I had a function calling a sequence of strings to tx to client. It was painfully slow since without long intervals it would break. Replacing this with an XMLHttpRequest made is almost instant.
Michael Heinrich
@pinki

Hi!
I want to write a file upload handler class.
My current class is

class UpdateMasterRequestHandler : public AsyncWebHandler {
public:
    UpdateMasterRequestHandler(/* args */) { }
    virtual ~UpdateMasterRequestHandler() { }

    bool canHandle(AsyncWebServerRequest *request);
    void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final);
};

canHandle returns true, but handleUpload never gets called.
What am I doing wrong?

bool UpdateMasterRequestHandler::canHandle(AsyncWebServerRequest *request) {
    bool forMe = request->url() == "/api/UpdateMaster"
              && request->method() == HTTP_POST
              && request->multipart();
    if (forMe) logDebugln("UpdateMasterRequestHandler!");

    return forMe;
}

void UpdateMasterRequestHandler::handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) {
    if (index == 0) {
        logDebug("UploadStart: ");
        logDebugln(filename);

        request->_tempFile = SPIFFS.open("master.hex", "w");
    }

    if (len > 0) {
        request->_tempFile.write(data, len);
    }

    if (final) {
        logDebug("UploadEnd: ");
        logDebugln(filename);

        request->_tempFile.close();

        request->send(200, MIME_TYPE_PLAIN_TEXT, "Upload complete!");
    }
}
HTML:
<form id="masterUpdateForm" action="/api/UpdateMaster" method="POST" enctype="multipart/form-data">
    Firmware: <input type="file" name="file" accept="*.hex">
    <button type="submit">Update</button>
</form>
Michael Heinrich
@pinki
I also tried this:
class UpdateMasterRequestHandler : public AsyncWebHandler {
public:
    UpdateMasterRequestHandler(/* args */) { }
    virtual ~UpdateMasterRequestHandler() { }

    virtual bool canHandle(AsyncWebServerRequest *request) override final;
    virtual void handleRequest(AsyncWebServerRequest *request) override final;
    virtual void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) override final;
};
Michael Heinrich
@pinki
I found the solution. I had to override isRequestHandlerTrivial as well and make it return false.
BinaryFour
@BlNARYFOUR
Hi, is there a complimentary ESP8266 WebSocket library for ws clients? I used the library for Wemos D1 Mini as websocket server, which works great! But I want to connect to this websocket server using a second Wemos D1 Mini. Can I do this using the same library? Or is there a complimentary library?
Cellie
@CelliesProjects
@me-no-dev I am working on a project that uses AsyncTCP for networking.
Is there a way to disable the WDT on the Async task?
Paul Andrews
@judge2005
I am curious about how async TCP works on the ESP8266. In particular, do I need to be careful about concurrency issues in handlers?
Should maybe have tagged that with @me-no-dev :-)
mesutaydeger
@mesutaydeger
Hello. Can we use ESPAsyncWebServer library with GSM shield in ESP32-ESP8266?
manuel75o
@manuel75o
Hello guys, i have a question in terms of licensing of the „ESPAsyncWebServer“. Every other library from @me-no-dev is licensed as LGPL-3.0 or 2.0 licence, however this one has no license listed.
Cellie
@CelliesProjects
@me-no-dev I made a simple class from AsyncTCP but am at a loss how to set a timeout.
mesutaydeger
@mesutaydeger
I have opend ESPAsyncTCP library. main class includes C-C++ "lwip" library... Can I get a result if I edit the void AsyncServer :: begin () function in the class according to AT commands?
mesutaydeger
@mesutaydeger
Please can you advise to me about "Can we use ESPAsyncWebServer library with GSM shield in ESP32-ESP8266?"?
OnurNP
@K0rkunc
hi
im create async web server
but refreshing and reset esp32
how to fix that
my html document
backtrace

Backtrace: 0x4000c3f0:0x3ffd1380 0x400db076:0x3ffd13a0 0x400db192:0x3ffd13c0 0x400d7ad1:0x3ffd13e0 0x400d6192:0x3ffd1450 0x400d60f5:0x3ffd1490 0x400d145d:0x3ffd14b0 0x4015188f:0x3ffd14f0 0x400d9309:0x3ffd1510 0x400d6df1:0x3ffd1560 0x400d6eb5:0x3ffd15a0 0x400d7105:0x3ffd15f0 0x4014b7b1:0x3ffd1610 0x4014b82d:0x3ffd1650 0x4014bed6:0x3ffd1670 0x4008a286:0x3ffd16a0

#0 0x4000c3f0:0x3ffd1380 in ?? ??:0

#1 0x400db076:0x3ffd13a0 in String::move(String&) at C:\Users\OnurNP.platformio\packages\framework-arduinoespressif32\cores\esp32/WString.cpp:857

#2 0x400db192:0x3ffd13c0 in String::operator=(String&&) at C:\Users\OnurNP.platformio\packages\framework-arduinoespressif32\cores\esp32/WString.cpp:857

#3 0x400d7ad1:0x3ffd13e0 in AsyncBasicResponse::_respond(AsyncWebServerRequest) at lib\ESPAsyncWebServer\src/WebResponses.cpp:699

#4 0x400d6192:0x3ffd1450 in AsyncWebServerRequest::send(AsyncWebServerResponse
) at lib\ESPAsyncWebServer\src/WebRequest.cpp:797

#5 0x400d60f5:0x3ffd1490 in AsyncWebServerRequest::send(int, String const&, String const&) at lib\ESPAsyncWebServer\src/WebRequest.cpp:797

#6 0x400d145d:0x3ffd14b0 in handleRoot(AsyncWebServerRequest) at src/main.cpp:289

#7 0x4015188f:0x3ffd14f0 in std::_Function_handler<void (AsyncWebServerRequest
), void ()(AsyncWebServerRequest)>::_M_invoke(std::_Any_data const&,

AsyncWebServerRequest*&&) at c:\users\onurnp.platformio\packages\toolchain-xtensa32@2.50200.97\xtensa-esp32-elf\include\c++\5.2.0/functional:1871

#8 0x400d9309:0x3ffd1510 in std::function<void (AsyncWebServerRequest*)>::operator()(AsyncWebServerRequest*) const at lib\ESPAsyncWebServer\src/StringArray.h:73

  (inlined by) AsyncCallbackWebHandler::handleRequest(AsyncWebServerRequest*) at lib\ESPAsyncWebServer\src/WebHandlerImpl.h:132

#9 0x400d6df1:0x3ffd1560 in AsyncWebServerRequest::_parseLine() at lib\ESPAsyncWebServer\src/WebRequest.cpp:797

#10 0x400d6eb5:0x3ffd15a0 in AsyncWebServerRequest::_onData(void, unsigned int) at lib\ESPAsyncWebServer\src/WebRequest.cpp:797

#11 0x400d7105:0x3ffd15f0 in std::_Function_handler<void (void
, AsyncClient, void, unsigned int), AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer, AsyncClient)::{lambda(void, AsyncClient, void, unsigned int)#8}>::_M_invoke(std::_Any_data const&, void&&, AsyncClient*&&, std::_Any_data const&, unsigned int&&) at lib\ESPAsyncWebServer\src/WebRequest.cpp:797

  (inlined by) _M_invoke at c:\users\onurnp\.platformio\packages\toolchain-xtensa32@2.50200.97\xtensa-esp32-elf\include\c++\5.2.0/functional:1871    

#12 0x4014b7b1:0x3ffd1610 in std::function<void (void*, AsyncClient*, void*, unsigned int)>::operator()(void, AsyncClient, void*, unsigned int) const at lib\AsyncTCP\src/AsyncTCP.cpp:1039

  (inlined by) AsyncClient::_recv(tcp_pcb*, pbuf*, signed char) at lib\AsyncTCP\src/AsyncTCP.cpp:934

#13 0x4014b82d:0x3ffd1650 in AsyncClient::_s_recv(void, tcp_pcb, pbuf, signed char) at lib\AsyncTCP\src/AsyncTCP.cpp:1039

#14 0x4014bed6:0x3ffd1670 in _async_service_task(void
) at lib\AsyncTCP\src/AsyncTCP.cpp:1039

  (inlined by) _async_service_task at lib\AsyncTCP\src/AsyncTCP.cpp:197

#15 0x4008a286:0x3ffd16a0 in vPortTaskWrapper at

/home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

how to fix that help me
mesutaydeger
@mesutaydeger
"I made a simple class from AsyncTCP but am at a loss how to set a timeout." : Could you tell me briefly what to do? Can I put in AT commands?
notsolowki
@notsolowki
Hi!! anyone around?
OnurNP
@K0rkunc
im activated external interrupt and cant connect wifi
how to fix that
OnurNP
@K0rkunc
hi
how do use rtos on async web server
Ramses Garcia Dilone
@ramsesgarciad
hello world