Giter Site home page Giter Site logo

asynctcp's People

Contributors

andig avatar atanisoft avatar bmooij avatar copercini avatar ivankravets avatar matt123p avatar me-no-dev avatar obrain17 avatar robert-alfaro avatar tantive avatar tve avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

asynctcp's Issues

Impossible to build with ESP32 1.0.1 and AsyncTCP 1.0.3

Hello,

I'm currently facing to this issue when trying to bulked a simple WebSocket example on my ESP WEMOS LOLIN 32.

I had a look on several issues reported, all of them said to compile AsyncTCP 1.0.3 with ESP32 1.0.1, but is seems that there is a another problem though.
Any idea to make it works?

/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp: In member function 'bool AsyncClient::connect(IPAddress, uint16_t)':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:115:8: error: 'ip_addr_t {aka struct ip_addr}' has no member named 'addr'
   addr.addr = ip;
        ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp: In member function 'bool AsyncClient::connect(const char*, uint16_t)':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:148:35: error: 'ip_addr_t {aka struct ip_addr}' has no member named 'addr'
     return connect(IPAddress(addr.addr), port);
                                   ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp: In member function 'bool AsyncClient::operator==(const AsyncClient&)':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:192:66: error: 'ip_addr_t {aka struct ip_addr}' has no member named 'addr'
   return (_pcb != NULL && other._pcb != NULL && (_pcb->remote_ip.addr == other._pcb->remote_ip.addr) && (_pcb->remote_port == other._pcb->remote_port));
                                                                  ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:192:96: error: 'ip_addr_t {aka struct ip_addr}' has no member named 'addr'
   return (_pcb != NULL && other._pcb != NULL && (_pcb->remote_ip.addr == other._pcb->remote_ip.addr) && (_pcb->remote_port == other._pcb->remote_port));
                                                                                                ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCPbuffer.cpp: In constructor 'AsyncTCPbuffer::AsyncTCPbuffer(AsyncClient*)':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCPbuffer.cpp:35:15: error: 'panic' was not declared in this scope
         panic();

               ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp: In member function 'void AsyncClient::_dns_found(const ip_addr*)':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:473:31: error: 'const struct ip_addr' has no member named 'addr'
     connect(IPAddress(ipaddr->addr), _connect_port);
                               ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp: In member function 'uint32_t AsyncClient::getRemoteAddress()':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:586:26: error: 'ip_addr_t {aka struct ip_addr}' has no member named 'addr'
   return _pcb->remote_ip.addr;
                          ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp: In member function 'uint32_t AsyncClient::getLocalAddress()':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:598:25: error: 'ip_addr_t {aka struct ip_addr}' has no member named 'addr'
   return _pcb->local_ip.addr;
                         ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCPbuffer.cpp: In member function 'virtual size_t AsyncTCPbuffer::write(const uint8_t*, size_t)':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCPbuffer.cpp:128:23: error: 'panic' was not declared in this scope
                 panic();

                       ^
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp: In member function 'void AsyncServer::begin()':
/Users/cp/Developer/_Arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp:873:14: error: 'ip_addr_t {aka struct ip_addr}' has no member named 'addr'
   local_addr.addr = (uint32_t) _addr;
              ^
Multiple libraries were found for "WiFi.h"
 Used: /Users/cp/Library/Arduino15/packages/esp32/hardware/esp32/1.0.1/libraries/WiFi
 Not used: /Applications/Arduino.app/Contents/Java/libraries/WiFi

Thanks

Server Show Client Connected Even if Client Loses Power

When a client connects and sends data, everything works normally. However, if the client connects and loses power or just connects to another AP while the connection is open, no notification of the client disconnecting exists.

Even if you check if clients[N]->connected() it will return true even if the client is unplugged.

Is there a way to get a disconnection message when the client disassociates from WiFi even if the connection is still open?

Task Priority Is Hardcoded !!!

/*
static void _stop_async_task(){
    if(_async_service_task_handle){
        vTaskDelete(_async_service_task_handle);
        _async_service_task_handle = NULL;
    }
}
*/
static bool _start_async_task(){
    if(!_init_async_event_queue()){
        return false;
    }
    if(!_async_service_task_handle){
        xTaskCreatePinnedToCore(_async_service_task, "async_tcp", 8192, NULL, 3, &_async_service_task_handle, ASYNCTCP_RUNNING_CORE);
        if(!_async_service_task_handle){
            return false;
        }
    }
    return true;
}

maybe someone like me want a way to define it.

WDT triggered by plain FS listing

Hello,

SPIFFS contains only CSS,
all relevant data is on SD Card.

When there is certain amount of files in one dir (in my case around 170) on SD Card, plain 'ls dir' triggers WDT -

E (12932127) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (12932127) task_wdt:  - async_tcp (CPU 0/1)
E (12932127) task_wdt: Tasks currently running:
E (12932127) task_wdt: CPU 0: IDLE0
E (12932127) task_wdt: CPU 1: loopTask
E (12932127) task_wdt: Aborting.
abort() was called at PC 0x4010d760 on core 0
Backtrace: 0x40092ae0:0x3ffbe160 0x40092d11:0x3ffbe180 0x4010d760:0x3ffbe1a0 0x4008336d:0x3ffbe1c0 0x401798cf:0x3ffbc310 0x40109033:0x3ffbc330 0x400907f1:0x3ffbc350 0x4008e8f1:0x3ffbc370
Rebooting...

The same code works fine on 'classic' WebServer.
Relevant part of the code is here ->

String listDirectory( File path, bool jsonFlag ) {

  String linkName;
  int numPic = 0;
  String strJSON = "[";

  if( path.isDirectory() ) {
    File file = path.openNextFile();
    while( file ) {
      linkName = String( file.name() );
      if( strJSON != "[" ) {
        strJSON += ',';
      }
      strJSON += "{\"type\":\"";
      strJSON += ( file.isDirectory() ) ? "dir" : "file";
      strJSON += "\",\"name\":\"";
      strJSON += String( file.name() ).substring(1);
      strJSON += "\"}";
      file.close();
      file = path.openNextFile();
      numPic++;
    }
  }
  strJSON += "]";
  return strJSON;

}

bool loadFromSDCard( AsyncWebServerRequest *request ) {

  String dataType;
  String webText;
  String path = request->url();

  File dataFile = SD_MMC.open( path.c_str() );

  if( !dataFile ) {
    return false;
  }

  if( dataFile.isDirectory() ) {
//    webText = listDirectory( dataFile );
//    request->send( 200, "text/html", webText );
    webText = listDirectory( dataFile, true );
    request->send( 200, "application/json", webText );
    dataFile.close();
    return true;
  }
  if( path.endsWith( ".jpg" ) ) {
    dataType = "image/jpeg";
    // request->send( SD_MMC, path.c_str(), String(), true ); // new window - download
    request->send( SD_MMC, path.c_str(), dataType );
    dataFile.close();
    return true;
  }

  return false;

}

void asyncHandleNotFound( AsyncWebServerRequest *request ) {

  String path = request->url();
  String dataType = "text/plain";
  String webText;

  int lastSlash = path.lastIndexOf( '/' );
  String fileName = path.substring( lastSlash, path.length() );

  bool fileSPIFFS = false;
  if( fileName.endsWith( ".css" ) ) {
    dataType = "text/css";
    fileSPIFFS = true;
  } else if( fileName.endsWith( ".js" ) ) {
    dataType = "aplication/javascript";
    fileSPIFFS = true;
  }
  if( fileSPIFFS ) {
    request->send( SPIFFS, fileName.c_str(), "text/css" );
    return;
  }

  if( loadFromSDCard( request ) ) {
    return;
  }

  webText = "\nNo Handler\r\n" + webText;
  request->send( 404, "text/plain", webText );
  DBG_OUTPUT_PORT.println( webText );

}

void initAsyncWebServer( void ) {

  asyncWebServer.onNotFound( asyncHandleNotFound );

  asyncWebServer.begin();

}

example required

is there any usage examples for this library? arduino
thanks very much.

compilation error on linux

Hi
I have recently used this library on windows 10 together with ESPUI and I was quite happy with it
But i had to move my whole work to linux(parrot OS) and after installing arduino 1.8.7 and esp32 package, I started with gui example. It didn't work. Here's the error message:
Arduino: 1.8.7 (Linux), Board: "ESP32 Dev Module, Disabled, Default, QIO, 80MHz, 4MB (32Mb), 921600, None"

Build options changed, rebuilding all
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:27: error: field 'call' has incomplete type 'tcpip_api_call'
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: forward declaration of 'struct tcpip_api_call'
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_output(tcp_pcb*)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:291:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_output_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:291:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_write(tcp_pcb*, const char*, size_t, uint8_t)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:307:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_write_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:307:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_recved(tcp_pcb*, size_t)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:322:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:322:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_connect(tcp_pcb*, ip_addr_t*, uint16_t, tcp_connected_fn)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:338:66: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_connect_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:338:66: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_close(tcp_pcb*)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:352:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_close_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:352:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_abort(tcp_pcb*)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:367:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:367:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_bind(tcp_pcb*, ip_addr_t*, uint16_t)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:382:63: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_bind_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:382:63: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'tcp_pcb* _tcp_listen_with_backlog(tcp_pcb*, uint8_t)':
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:397:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_listen_api, (struct tcpip_api_call*)&msg);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:397:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: At global scope:
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:624:6: error: prototype for 'void AsyncClient::_dns_found(ip_addr_t*)' does not match any in class 'AsyncClient'
void AsyncClient::_dns_found(ip_addr_t ipaddr){
^
In file included from /root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:24:0:
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.h:84:10: error: candidate is: void AsyncClient::_dns_found(_ip_addr)
void _dns_found(struct _ip_addr ipaddr);
^
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:946:6: error: prototype for 'void AsyncClient::_s_dns_found(const char, ip_addr_t*, void*)' does not match any in class 'AsyncClient'
void AsyncClient::_s_dns_found(const char * name, ip_addr_t * ipaddr, void * arg){
^
In file included from /root/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:24:0:
/root/Arduino/libraries/AsyncTCP/src/AsyncTCP.h:164:17: error: candidate is: static void AsyncClient::_s_dns_found(const char*, _ip_addr*, void*)
static void _s_dns_found(const char *name, struct _ip_addr *ipaddr, void *arg);
^
Multiple libraries were found for "WiFi.h"
Used: /root/Arduino/hardware/espressif/esp32/libraries/WiFi
Not used: /home/user/arduino-1.8.7/libraries/WiFi
exit status 1
Error compiling for board ESP32 Dev Module.
As a sidenote, since I had to do my work on a flash memory and persistent partition, I had no choice but doing EVERYTHING as a root user.
Arduino ide cannot work without it(Serial usb access) and even arduino playground solution for that cannot help, since it is a live user

Missing dependency?

My project's travis build (https://travis-ci.org/bofh69/AiLight/builds/274342483) started to fail today:

In file included from .piolibdeps/AsyncTCP_ID1826/src/AsyncTCP.cpp:24:0:
.piolibdeps/AsyncTCP_ID1826/src/AsyncTCP.h:28:29: fatal error: freertos/semphr.h: No such file or directory
#include "freertos/semphr.h"
^
compilation terminated.

Shouldn't there be a dependency on the freetos library from this library?

Thread safety/multicore and race conditions

My debugging seems to indicate that AsyncTCP is not thread/multicore save on the ESP32. I.e. one or more of the onError/onDisconnect/onData etc events will run parallel with the main core on the ESP32 and can therefore cause race conditions. I solved this by wrapping all events in a mutex and since then the code has been stable. More background.

I was wondering if this was by design? If so it might be good to mention it in the README/code comments.

I think this might be the cause of: me-no-dev/ESPAsyncWebServer#324

Guru Meditation Error -- free method call on client disconnect

WROOM32 Module (Arduino 1.0.0 stable release)

Stacktrace & Exception

Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x400d3a97 PS : 0x00060b30 A0 : 0x800d2841 A1 : 0x3ffbbf40
A2 : 0x00000000 A3 : 0x00060b23 A4 : 0x00060b20 A5 : 0x3ffb9aa4
A6 : 0x3ffbcf84 A7 : 0x00000000 A8 : 0x00000000 A9 : 0x3ffbbf30
A10 : 0x3ffbcf84 A11 : 0x00001800 A12 : 0x3ffae704 A13 : 0x00000000
A14 : 0x00000000 A15 : 0x00000000 SAR : 0x0000000a EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff

Backtrace: 0x400d3a97:0x3ffbbf40 0x400d283e:0x3ffbbf60 0x400d3c56:0x3ffbbf80 0x400d3cf1:0x3ffbbfb0 0x400d3d95:0x3ffbbff0 0x400d40a1:0x3ffbc030

Rebooting...

PC: 0x400d3a97: AsyncClient::free() at C:\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 687
EXCVADDR: 0x00000000

Decoding stack results
0x400d3a97: AsyncClient::free() at C:\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 687
0x400d283e: std::_Function_handler >::_M_invoke(const std::_Any_data &, , ) at C:\Arduino\libraries\fauxmoesp\src\fauxmoESP.cpp line 343
0x400d3c56: std::function ::operator()(void*, AsyncClient*) const at c:\users\chirag\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0/functional line 2271
0x400d3cf1: AsyncClient::_close() at C:\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 534
0x400d3d95: AsyncClient::_recv(tcp_pcb*, pbuf*, signed char) at C:\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 567
0x400d40a1: _async_service_task(void*) at C:\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 956

Thank you

Using with Arduino IDE

hi, I am trying to use this library with Arduino IDE but facing some difficulty in finding this in the libraries ( using library manager ). ESP32/Arduino IDE is new to me so are there any steps I can follow to install this library?
My ultimate aim is to be able to use this library: https://github.com/me-no-dev/ESPAsyncWebServer and this library requires AsyncTCP.

Thanks a lot, appreciate any pointers.

Slow speed & corruption, am I doing something wrong?

I have a program that reads 60 bytes of info from an IMU (gyroscope, accelerometer, compass) and sends it out WiFi by TCP. I'm having trouble getting the throughput I need and I'm wondering if I am doing something wrong or if this is a limit of the hardware?

Minus all the IMU reading stuff, the main loop looks something like

void loop()
{
int
loop_start; // Time in micros at top of loop

loop_start = micros();
if(loop_start < next_report)
return;
next_report = loop_start + REPORT_TIME;

// Read IMU and put 60 bytes of data into tempbuf

  telemetryClient->write((char*)tempbuf, 60, ASYNC_WRITE_FLAG_COPY | ASYNC_WRITE_FLAG_MORE);

}

Run this at 100hz and it works fine, at 1000hz (still less than 1m bits/sec) and I get all kinds of data corruption.

Do you think I should be able to send data this fast on ESP32? Anything I can do to make it work? I have tried using add/send and have the same problems. Also tried write with the default flags.

The data doesn't have to go out immediately, it can be buffered up till we have a max-size packet (no nagle algorithm needed).

error: 'xTaskCreateUniversal' was not declared in this scope

Trying to use the library for ESP32 OTA support. Newest version throws an exception that did not exist in version 1.0.3.

.piolibdeps\AsyncTCP_ID1826\src\AsyncTCP.cpp: In function 'bool _start_async_task()':
.piolibdeps\AsyncTCP_ID1826\src\AsyncTCP.cpp:205:141: error: 'xTaskCreateUniversal' was not declared in this scope

SSL support?

I was under the impression I would be able to use ssl with ESPAsyncWebServer on esp32, however as this library doesn't support ssl (whereas it's esp8266 counterpart does) it appears that's not possible?

It would be nice for this lib to be on par with the esp8266 version in terms of features to avoid surprises like this.

Is ssl support a feature that is likely to get implemented?

Using hostname on ESP32 fails to connect

When using mqttClient.setServer("myserver.lan", 1883) the connection fails on ESP32, on ESP8266 it works fine.

When using mqttClient.setServer(IpAddress(192, 168, 0, 1), 1883) it works fine.

The asyncmqtt library uses client->connect of AsyncTCP which I think fails

Correct use of ESP.reset() when using Async Libs?

Thanks for such a fantastic library. I have a question and have not been able to find an answer.

As far as I can work out, when using any of the Async libraries you should never use the delay(nn) function which I understand.

What I am unable to work out is what is the correct way to use the ESP.reset() function.
All examples I have found always seem to follow this (note that the delay times vary depending on where you find your example).

delay(3000);
ESP.reset();
delay(2000);

So with the idea that we can't use the delay() function, what is the correct way to do this?

AsyncClient::errorToString seems to be incorrect.

In comparing AsyncClient::errorToString to err_strerr in esp-idf/components/lwip/lwip/src/api/err,c, the error string for -8 is "Address in use." in err.c and "Connection aborted" in AsyncTCP and then -13 is "Connection aborted." in err.c and "Address in use." in AsyncTCP.

Can't compile with the latest ESP32 snapshot

Hi, seems, that the library can't be anymore compiled with the latest arduino esp32 code:

C:\RH\arduino-1.8.5\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:27: error: field 'call' has incomplete type 'tcpip_api_call'

 struct tcpip_api_call call;

                       ^

C:\RH\arduino-1.8.5\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: forward declaration of 'struct tcpip_api_call'

 struct tcpip_api_call call;

ipv6 support - small code change suggested.

Currently, the library will only bind to ipv4 addresses when used as a server. I've been doing some testing and discovered that a couple of small changes will allow the code to work with either ipv4 or ipv6 connections. Is this something worth creating a pull request for?

I haven't yet looked at making the same changes to connect() to support outbound connections to an ipv6
address, but that's also not hard I suspect, but would require an api change.

For anyone who's interested, the key change is to use IP_ADDR_TYPE_ANY instead of IP_ADDR_TYPE_V4 in server.begin(), and then bind to IP_ANY_TYPE a few lines later.

There are then a few places in the code where structures need to be declared const in tcp_api_call_t, and the definition of _tcp_bind.

I now have my esp32 happily responding to ipv6 web requests.....

unstable connection: disconnects, slow responses, lots of retransmissions

I'm struggling to get the lib working for a simple modbus master. I can't even connect to the server.
Wireshark shows a remarkable log:
image

Even though the ESP is already connected, it resends SYN. Also, it takes about 3 seconds before the ESP knows it has connected (wireshark show it about 3 secs sooner).

From time to time, I experience stranger errors like [E][AsyncTCP.cpp:571] _recv(): 0x3ffbb578 != 0x3ffbb120

Behaviour is the same for the main branch as the idf-update branch. The _recv() only appears at the idf-update branch.

Edit: when the _recv() error appears, there's no callback called, so my app also doesn't know it can move on. As a workaround I need to implement a timer myself.

ESP32 - Bind error:67 Ethernet wiznet5500 using Ethernet2.h library

Hi, I have an issue to make it work with ethernet Module W5500 using Ethernet2.h arduino library.
My board is a ESP32 conected via SPI to the W5500. By the way the W5500 is fully working and connected to my network.

With wifi connection everything work.
The error I am getting:
[AsyncTCP.cpp:1107] begin(): bind error: 67

I really don't know what that "67" means.
Any idea?
Regards.

esp32 crashes onMqttDisconnect(). Guru Meditation Error:

i am using esp32 with ethernet module lan8720, every thing working fine except when using async mqtt client library, onMqttDisconnect() event rises following error appears and esp32 crashes.

Disconnected from MQTT.
Guru Meditation Error: Core 1 panic'ed (LoadProhibited)
. Exception was unhandled.
Register dump:
PC : 0x401096b3 PS : 0x00060330 A0 : 0x800d62e8 A1 : 0x3ffdca90
A2 : 0x00000000 A3 : 0x00000001 A4 : 0x0000000a A5 : 0x00022203
A6 : 0x00000000 A7 : 0x00004034 A8 : 0x80112d50 A9 : 0x3ffdca60
A10 : 0x3ffdbe18 A11 : 0x3ffc10d0 A12 : 0x3ffdbe78 A13 : 0x00000000
A14 : 0x3ffdbed8 A15 : 0x00000000 SAR : 0x00000008 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000038 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff

Backtrace: 0x401096b3:0x3ffdca90 0x400d62e5:0x3ffdcab0 0x4010290d:0x3ffdcad0

Rebooting...

Got new errors when upgrading framework-arduinoespressif32

I upgraded https://github.com/espressif/arduino-esp32.git locally to commit: 85032b226c7775bae510e954112823a2ae32181a and now I get the following error when I compile:

.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:259:27: error: field 'call' has incomplete type 'tcpip_api_call'
struct tcpip_api_call call;
^
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:259:12: note: forward declaration of 'struct tcpip_api_call'
struct tcpip_api_call call;
^
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_output(tcp_pcb*)':
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:291:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_output_api, (struct tcpip_api_call*)&msg);
^
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:291:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_write(tcp_pcb*, const char*, size_t, uint8_t)':
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:307:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_write_api, (struct tcpip_api_call*)&msg);
^
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:307:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_recved(tcp_pcb*, size_t)':
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:322:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call*)&msg);
^
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:322:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
.piolibdeps/AsyncTCP/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

My project have the following dependencies:
lib_deps =
[email protected]
AsyncTCP=https://github.com/me-no-dev/AsyncTCP.git#5453ec2e3fdd9beb92b8423878008b57be7805e6
ESP Async WebServer=https://github.com/me-no-dev/ESPAsyncWebServer.git#bed4146ec647fd1cdfd1d2485724369c92cab8e6
[email protected]
[email protected]
[email protected]

ESP32 Crash on TCP Close

Hi all,
I use AsyncTCPWebserver and When I disconnect my websocket client after some time, my ESP32 crash with that backtrace :

CORRUPT HEAP: Bad head at 0x3ffceca8. Expected 0xabba1234 got 0x3ffcef30
assertion "head != NULL" failed: file "C:/msys32/home/Jyce/esp/esp-idf/components/heap/multi_heap_poisoning.c", line 201, function: multi_heap_free
abort() was called at PC 0x400d37cf on core 1
0x400d37cf: __assert_func at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdlib/../../../.././newlib/libc/stdlib/assert.c:63 (discriminator 8)

Backtrace: 0x4008e014:0x3ffc59f0 0x4008e1ef:0x3ffc5a10 0x400d37cf:0x3ffc5a30 0x4008dd25:0x3ffc5a60 0x40082982:0x3ffc5a80 0x40082ecd:0x3ffc5aa0 0x4000bec7:0x3ffc5ac0 0x40137e0d:0x3ffc5ae0 0x40137ecf:0x3ffc5b00 0x401022a1:0x3ffc5b20 0x40131019:0x3ffc5b40
0x4008e014: invoke_abort at C:/msys32/home/Jyce/esp/esp-idf/components/esp32/panic.c:648

0x4008e1ef: abort at C:/msys32/home/Jyce/esp/esp-idf/components/esp32/panic.c:648

0x400d37cf: __assert_func at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdlib/../../../.././newlib/libc/stdlib/assert.c:63 (discriminator 8)

0x4008dd25: multi_heap_free at C:/msys32/home/Jyce/esp/esp-idf/components/heap/multi_heap_poisoning.c:299

0x40082982: heap_caps_free at C:/msys32/home/Jyce/esp/esp-idf/components/heap/heap_caps.c:123

0x40082ecd: _free_r at C:/msys32/home/Jyce/esp/esp-idf/components/newlib/syscalls.c:42

0x40137e0d: tcp_close_shutdown at C:/msys32/home/Jyce/esp/esp-idf/components/lwip/core/tcp.c:835

0x40137ecf: tcp_close at C:/msys32/home/Jyce/esp/esp-idf/components/lwip/core/tcp.c:835

0x401022a1: _tcp_close_api(tcpip_api_call*) at C:/msys32/home/Jyce/esp/arduino/components/arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:785

0x40131019: tcpip_thread at C:/msys32/home/Jyce/esp/esp-idf/components/lwip/api/tcpip.c:474

I use the head of master of espressif IDF, Arduino, AsyncWebserver and TCPAsync at the time I write this message.

Is AsyncTCP can replace WiFiClient client?

I want to GET parameters from a webserver. Currently I am using WifiClient to do that. Now I am using AsyncTCP to use my ESP32 as a websocket so I am wondering how to use AsyncTCP as a client.
String GetClient(String URL)
{
String line1="";
String SHHH="";
if (!client.connect(serverName, serverPort)) {
Serial.println("Host connection failed");
}
else {
URL.replace(" ", "%");
Serial.print("Requesting URL: ");
Serial.println(URL);
client.print(String("GET ") + URL + " HTTP/1.1\r\n" +
"Host: " + serverName + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long startTime=millis();
while (!client.available()) {
if (millis() - startTime > 60000UL) {
Serial.println("request failed");
break;
}
}
while (client.available()) {
String line = client.readStringUntil('<');
line1 = client.readStringUntil('>');
ws.textAll(":"+line1);
Serial.println(line1);//Record CODE CREATED
if(line1.indexOf(',')==-1) {
SHHH=line1;
}

         }
          client.flush();
    }

return SHHH;
}

WDT on repetitive connection when distant server is slow to free conn or respond

Hello all,

I am using 16 esp32, sending POST to a small http server & receiving udp msg. I am getting an wdt on wifi core after some hours of processing, on some esp32.

version :
PLATFORM: Espressif 32 1.10.0,
arduino-esp32 v1.0.3
AsyncTCP 1.1.0

The situation :

I have a server sending every 10 sec a broadcast udp request to multiple ESP32 ( wemos d1 esp32). When the esp32 receives the udp request, it sends a tcp POST, with asynctcp, to the server.
Everything work fine with 3 esp32.
However, with 16 esp32, I got wdt after a few hours, on some device. I guess it's when the server is not fast enough to handle the requests at once.
The server is a simple java HttpServer. The UDP sender is a simple app in java sending the packet.

on the ESP, udp server is WiFiUDP, read in the main loop

void readUdpControl() {
  int count = udpControl.parsePacket();
  if (count) { 
    String buf = udpControl.readString();
    processNetControl(buf);
  }
}

in the following code, getWDPostInfo returns a arduinojson'ised' structure as string.

(the watchdog wording here is not linked with espressif wdt...

void watchDogAsync() {
  if (tcpClient) { // client already exists
    log("ASYNCTCP-Stooping: client already exists");
    return;
  }

  watchdogContent = getWDPostInfo().c_str();

  tcpClient = new AsyncClient();
  if (!tcpClient) { // could not allocate client
    log("ASYNCTCP-Stooping:  could not allocate client");
    return;
  }

  tcpClient->onError([](void *arg, AsyncClient *client, int error) {
    tcpClient = NULL;
    delete client;
  }, NULL);

  tcpClient->onConnect([](void *arg, AsyncClient *client) {

    client->onError(NULL, NULL);

    client->onData([](void *arg, AsyncClient *c, void *data, size_t len) {},
                   NULL);

    client->onDisconnect([](void *arg, AsyncClient *c) {
      tcpClient = NULL;
      delete c;
      Serial.println("Dis");

    }, NULL);

    tcpClient->write(watchdogContent.c_str());
    // tcpClient->stop();
  }, NULL);

  if (!tcpClient->connect(udpOTA.remoteIP().toString().c_str(), 23780)) {
    log("ASYNCTCP-Connect Fail");
    AsyncClient *client = tcpClient;
    tcpClient = NULL;
    delete client;
  }
}
ASYNCTCP-Sending Async...
E (31521402) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (31521402) task_wdt:  - IDLE0 (CPU 0)
E (31521402) task_wdt: Tasks currently running:
E (31521402) task_wdt: CPU 0: wifi
E (31521402) task_wdt: CPU 1: IDLE1
E (31521402) task_wdt: Aborting.
abort() was called at PC 0x400f69e0 on core 0


Backtrace: 0x4008f024:0x3ffbe160 0x4008f255:0x3ffbe180 0x400f69e0:0x3ffbe1a0 0x40083469:0x3ffbe1c0 0x4014aea5:0x3ffafab0 0x4014b441:0x3ffafae0 0x40092171:0x3ffafb10 0x4008af9d:0x3ffafb50

c:\Users\jc\SynologyDrive\Liti>java -jar EspStackTraceDecoder.jar c:/Users/jc/.platformio/packages/toolchain-xtensa32/bin/xtensa-esp32-elf-addr2line.exe c:/Users/jc/SynologyDrive/Liti/vsCode/LitiController/.pio/build/esp32doit-devkit-v1/firmware.elf dump.txt
Exception Cause: Not found

0x400f69e0: task_wdt_isr at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/task_wdt.c:252
0x4008f024: invoke_abort at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/panic.c:707
0x4008f255: abort at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/panic.c:707
0x400f69e0: task_wdt_isr at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/task_wdt.c:252
0x40083469: _xt_lowint1 at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/xtensa_vectors.S:1154
0x4014aea5: lmacProcessTxRtsError at ??:?
0x4014b441: lmacProcessTxComplete at ??:?
0x40092171: ppTask at ??:?
0x4008af9d: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c:355 (discriminator 1)

Since everything works fine when using 3 devices, I guess the problem origin when using all my esp32 is my server not handling stuff quickly enough. But AsyncTCP should take care of this and not letting wdt'd.

How can I be assured asynctcp is using a timeout on all steps of the connexion ?

Unify the ESP32 and ESP8266 version.

My library works on both ESP32 and ESP8266, but I had trouble getting my project to reliably switch between using AsyncTCP and ESPAsyncTCP depending on the hardware (this was with platformio). In the end I decided to make AsyncTCP also work/compile on ESP8266 hardware. If you are interested the relevant files/changes can be found here:

https://gitlab.com/BlackEdder/painlessMesh/blob/tcp_locking/src/AsyncTCP.h
https://gitlab.com/BlackEdder/painlessMesh/blob/tcp_locking/src/AsyncTCP.cpp

Support for ESP-IDF

Is there any support for AsyncTCP or ESPAsyncWebServer in ESP-IDF? if no can we use a C++ library like this in ESP-IDF?

ETH support

Can the lib be used with ETH on the ESP32 instead of WiFi?

client connection timeout.

Hello,
I am using the library to connect to my solar inverter and collect data.
It all works great except when the inverter is shut down and it is no longer connected to my network. aClient hangs and returns "Error : Address in use".
Is there a way I can set a connection time out?
I have tried running a timer after the connection attempt starts and calling aClient->close() when my timer runs out but the causes the esp to crash.
onTimeout is never called even when I use setRXTimeout or setACKTimeout .
Any help would be appreciated. Thanks

void INVgetData() {
  Inverter_Conn_Started = true;
  Inverter_Conn_Time = millis();
  if (aClient) //client already exists
    return;

  aClient = new AsyncClient();
  if (!aClient) //could not allocate client
    return;
  aClient->onError([](void * arg, AsyncClient * client, int error) {
    Serial.printf("Error: %s\n\n", client->errorToString(error));
    Serial.println("Inverter Download Failed.");
    aClient = NULL;
    PV1v = 0.00;//PV1 v 0
    PV2v = 0.00;
    PV1a = 0.00;
    PV2a = 0.00;
    GRIDa = 0.00;
    if (GRIDv == 0) {
      GRIDv = 250;
    }
    delete client;
    //delete aClient;
  }, NULL);
  aClient->onTimeout([](void* arg, AsyncClient * client, uint32_t time) {
    Serial.printf("Error : Timeout\n");
    Serial.println("Inverter Update Failed.");
    client->close();
    delete client;
    delete aClient;
    PV1v = 0.00;//PV1 v 0
    PV2v = 0.00;
    PV1a = 0.00;
    PV2a = 0.00;
    GRIDa = 0.00;
    if (GRIDv == 0) {
      GRIDv = 250;
    }
  });
  aClient->onConnect([](void * arg, AsyncClient * client) {
    Serial.println("Inverter Connected. Sending Request.");
    aClient->onError(NULL, NULL);
    Inverter_Connected = true;

    client->onDisconnect([](void * arg, AsyncClient * c) {
      Serial.println("Inverter Disconnected");
      aClient = NULL;
      delete c;
    }, NULL);

    client->onData([](void * arg, AsyncClient * c, void * data, size_t len) {
      Serial.print("\r\nData: ");
      Serial.println(len);
      if (len > 31) {
        Serial.printf("Data received with length: %d\n", len);
        Buff = (byte*)data;
        INVupdateData();
        Serial.println("Inverter Update Done.");
      } Serial.println(len);
      Serial.println((char*)data);
      c->close();
      Inverter_Connected = false;
      //c->close();
    }, NULL);

    //send the request
    char ServerReq[] = {0x68, 0x02, 0x41, 0xb1, 0xde, 0x58, 0x15, 0x30, 0xde, 0x58, 0x15, 0x30, 0x01, 0x00, 0xeb, 0x16};
    client->write(ServerReq, sizeof(ServerReq));

  }, NULL);
  Serial.print("Connecting To Inverter At : ");
  Serial.println(InvAdd);  
  if (!aClient->connect(InvAdd, InvPort)) {
    Serial.println("Connect Fail");
    AsyncClient * client = aClient;
    aClient = NULL;
    delete client;
  }

remoteIP() and remotePort() return only 0

When using remoteIP() and remotePort() to catch the connected client ip address provides only 0's.

Code:

AsyncWebServer server(80);
AsyncClient remoteclient;

// respond to GET requests on URL /heap
server.on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println(remoteclient.remoteIP().toString());
Serial.println(remoteclient.remotePort());
request->send(200, "text/plain", String(ESP.getFreeHeap()));
});

Output:
0.0.0.0
0

Rest of my webserver code is running fine.

Using github version of:

AsyncTCP-master-24102017.zip
ESPAsyncWebServer-master-24102017.zip
arduino-esp32-master_v3.0-dev-899-g3a271a4a_19102017.zip
Arduino IDE 1.6.12 running on doitESP32devkitV1

Bug or are do I something wrong?

Changing priority of task

I tried to port my code from ESP8266 to ESP32 and became timing issues. Problem was that on the ESP8266 the requests were handled in the loop and not Async at any time. This caused timing issues in the rest of the logic which is critical for my application. I tried to fix that by suspending the AsyncTCP task but it didn't work exactly how i wanted.
Finally a hige difference made the change of the tasks priority.

Changing priority from 3
xTaskCreateUniversal(_async_service_task, "async_tcp", 8192 * 2, NULL, 3, &_async_service_task_handle, CONFIG_ASYNC_TCP_RUNNING_CORE);

to 1 fixed all my issues
xTaskCreateUniversal(_async_service_task, "async_tcp", 8192 * 2, NULL, 1, &_async_service_task_handle, CONFIG_ASYNC_TCP_RUNNING_CORE);

Now my code runs reliable without any noticeable impact by handled requests.

So is there a reason that by default the priority is set to 3?

ESP32 simple Webserver hangs network connection completely

I posted a closer description here, but I doubt it's the right place:
espressif/arduino-esp32#2267 (comment)

Basic webserver fails immediately when putting synchronous requests to it using
a webside which contains some small pictures. WLAN or LAN makes no difference.
(Arduino+AsyncWebserver).

For me it "feels" like an interfacing issue to lwIP or even a problem in lwIP.
Are you able to tell me how to continue debugging?

error on send large data

I used to send jpg ,it works fine on about 5k byte size,but over 5k the picture have some part invisible and have notice like : "Low-level netif error"

onDisconnect sometimes doesn't fire (on hold)

I'm using AsyncMqttClient with relative low timeouts (10 seconds).
Sometimes the onDisconnect callback doesn't fire, always after this message:

[W][AsyncTCP.cpp:632] _poll(): rx timeout 4

Subsequently, my esp thinks it's connected and doesn't reconnect. The AsyncMqttLib relies on onPoll to check the connection. As this callback is called only when there is a connection, it stops checking completely.

Release tags

Hi, as I see, there are no release tags and it is difficult to roll back to a specific release without diving into commit logs.

With the recent update to esp-idf that introduced problems with mesh (non-)working (espressif/esp-idf#2916, espressif/esp-idf#2915), I wanted to do roll-back but I couldn't figure out which version should I check out.

The library isn't working with latest version of Arduino esp-32.

Error Log,
Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:27: error: field 'call' has incomplete type 'tcpip_api_call'
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: forward declaration of 'struct tcpip_api_call'
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_output(tcp_pcb*)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:291:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_output_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:291:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_write(tcp_pcb*, const char*, size_t, uint8_t)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:307:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_write_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:307:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_recved(tcp_pcb*, size_t)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:322:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:322:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_connect(tcp_pcb*, ip_addr_t*, uint16_t, tcp_connected_fn)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:338:66: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_connect_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:338:66: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_close(tcp_pcb*)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:352:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_close_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:352:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_abort(tcp_pcb*)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:367:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:367:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_bind(tcp_pcb*, ip_addr_t*, uint16_t)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:382:63: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_bind_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:382:63: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: In function 'tcp_pcb* _tcp_listen_with_backlog(tcp_pcb*, uint8_t)':
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:397:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]
tcpip_api_call(_tcp_listen_api, (struct tcpip_api_call*)&msg);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:397:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete
struct tcpip_api_call call;
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp: At global scope:
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:624:6: error: prototype for 'void AsyncClient::_dns_found(ip_addr_t*)' does not match any in class 'AsyncClient'
void AsyncClient::_dns_found(ip_addr_t ipaddr){
^
In file included from /Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:24:0:
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.h:84:10: error: candidate is: void AsyncClient::_dns_found(_ip_addr
)
void _dns_found(struct _ip_addr ipaddr);
^
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:946:6: error: prototype for 'void AsyncClient::_s_dns_found(const char
, ip_addr_t*, void*)' does not match any in class 'AsyncClient'
void AsyncClient::_s_dns_found(const char * name, ip_addr_t * ipaddr, void * arg){
^
In file included from /Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.cpp:24:0:
/Users/akshar/Documents/Arduino/libraries/AsyncTCP-master/src/AsyncTCP.h:164:17: error: candidate is: static void AsyncClient::_s_dns_found(const char*, _ip_addr*, void*)
static void _s_dns_found(const char *name, struct _ip_addr *ipaddr, void *arg);

Errors compiling after Arduino core update to e5ea089a7fd5cc8a96d68aae64dc3b4dcef2315e

After updating Arduino Core to commit e5ea089a7fd5cc8a96d68aae64dc3b4dcef2315e AsyncTCP does not compile anymore.

A whole lot of errors:

Compiling library "AsyncTCP"
"/home/cellie/Arduino/hardware/espressif/esp32/tools/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++" -DESP_PLATFORM -DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h" -DHAVE_CONFIG_H "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/config" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/bluedroid" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/bluedroid/api" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/app_trace" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/app_update" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/bootloader_support" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/bt" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/driver" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/esp32" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/esp_adc_cal" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/esp_http_client" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/esp_https_ota" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/esp-mqtt" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/esp-tls" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/ethernet" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/fatfs" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/freertos" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/heap" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/http_server" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/jsmn" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/log" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/mdns" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/mbedtls" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/mbedtls_port" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/newlib" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/nvs_flash" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/openssl" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/spi_flash" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/sdmmc" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/smartconfig_ack" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/spiffs" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/tcpip_adapter" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/tcp_transport" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/ulp" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/vfs" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/wear_levelling" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/xtensa-debug-module" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/lwip" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/coap" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/console" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/expat" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/json" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/newlib" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/nghttp" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/soc" "-I/home/cellie/Arduino/hardware/espressif/esp32/tools/sdk/include/wpa_supplicant" -std=gnu++11 -fno-exceptions -Os -g3 -Wpointer-arith -fexceptions -fstack-protector -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib  -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -fno-rtti -MMD -c -DF_CPU=240000000L -DARDUINO=10805 -DARDUINO_MH_ET_LIVE_ESP32MINIKIT -DARDUINO_ARCH_ESP32 -DARDUINO_BOARD="MH_ET_LIVE_ESP32MINIKIT" -DARDUINO_VARIANT="mhetesp32minikit"  -DESP32 -DCORE_DEBUG_LEVEL=3  "-I/home/cellie/Arduino/hardware/espressif/esp32/cores/esp32" "-I/home/cellie/Arduino/hardware/espressif/esp32/variants/mhetesp32minikit" "-I/home/cellie/Arduino/hardware/espressif/esp32/libraries/SPI/src" "-I/home/cellie/Arduino/hardware/espressif/esp32/libraries/SPIFFS/src" "-I/home/cellie/Arduino/hardware/espressif/esp32/libraries/FS/src" "-I/home/cellie/Arduino/hardware/espressif/esp32/libraries/ESPmDNS/src" "-I/home/cellie/Arduino/hardware/espressif/esp32/libraries/Preferences/src" "-I/home/cellie/Arduino/libraries/Adafruit_ILI9341" "-I/home/cellie/Arduino/libraries/Adafruit_GFX_Library" "-I/home/cellie/Arduino/libraries/OneWire" "-I/home/cellie/Arduino/libraries/ESP8266_and_ESP32_Oled_Driver_for_SSD1306_display/src" "-I/home/cellie/Arduino/hardware/espressif/esp32/libraries/Wire/src" "-I/home/cellie/Arduino/libraries/AsyncTCP/src" "-I/home/cellie/Arduino/libraries/ESPAsyncWebServer/src" "-I/home/cellie/Arduino/hardware/espressif/esp32/libraries/WiFi/src" "-I/home/cellie/Arduino/libraries/XPT2046_Touchscreen" "-I/home/cellie/Arduino/libraries/MoonPhase" "/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp" -o "/tmp/arduino_build_820309/libraries/AsyncTCP/AsyncTCP.cpp.o"
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:27: error: field 'call' has incomplete type 'tcpip_api_call'
     struct tcpip_api_call call;
                           ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: forward declaration of 'struct tcpip_api_call'
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_output(tcp_pcb*)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:227:65: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_output_api, (struct tcpip_api_call*)&msg);
                                                                 ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:227:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_write(tcp_pcb*, const char*, size_t, uint8_t)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:243:64: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_write_api, (struct tcpip_api_call*)&msg);
                                                                ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:243:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_recved(tcp_pcb*, size_t)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:258:65: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call*)&msg);
                                                                 ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:258:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_connect(tcp_pcb*, ip_addr_t*, uint16_t, tcp_connected_fn)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:274:66: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_connect_api, (struct tcpip_api_call*)&msg);
                                                                  ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:274:66: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_close(tcp_pcb*)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:287:64: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_close_api, (struct tcpip_api_call*)&msg);
                                                                ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:287:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_abort(tcp_pcb*)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:301:64: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call*)&msg);
                                                                ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:301:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'esp_err_t _tcp_bind(tcp_pcb*, ip_addr_t*, uint16_t)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:316:63: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_bind_api, (struct tcpip_api_call*)&msg);
                                                               ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:316:63: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: In function 'tcp_pcb* _tcp_listen_with_backlog(tcp_pcb*, uint8_t)':
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:331:65: error: invalid conversion from 'err_t (*)(tcpip_api_call*) {aka signed char (*)(tcpip_api_call*)}' to 'tcpip_api_call_fn {aka signed char (*)(tcpip_api_call_data*)}' [-fpermissive]
     tcpip_api_call(_tcp_listen_api, (struct tcpip_api_call*)&msg);
                                                                 ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:331:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:195:12: note: class type 'tcpip_api_call' is incomplete
     struct tcpip_api_call call;
            ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp: At global scope:
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:553:6: error: prototype for 'void AsyncClient::_dns_found(ip_addr_t*)' does not match any in class 'AsyncClient'
 void AsyncClient::_dns_found(ip_addr_t *ipaddr){
      ^
In file included from /home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:24:0:
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.h:84:10: error: candidate is: void AsyncClient::_dns_found(_ip_addr*)
     void _dns_found(struct _ip_addr *ipaddr);
          ^
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:873:6: error: prototype for 'void AsyncClient::_s_dns_found(const char*, ip_addr_t*, void*)' does not match any in class 'AsyncClient'
 void AsyncClient::_s_dns_found(const char * name, ip_addr_t * ipaddr, void * arg){
      ^
In file included from /home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp:24:0:
/home/cellie/Arduino/libraries/AsyncTCP/src/AsyncTCP.h:164:17: error: candidate is: static void AsyncClient::_s_dns_found(const char*, _ip_addr*, void*)
     static void _s_dns_found(const char *name, struct _ip_addr *ipaddr, void *arg);

Could be an Arduino Core problem, if so I will open a issue there.

ESP32 rebooting when file serving from SPIFFS

Hi all!

When I use serveStatic(), it triggers watchdog timer and reboot device when I serve large file (~25kB).
JSON responses are handled correctly.
ESP32 works in WIFI AP mode.

My serverUp code:

  
  esp_wifi_set_ps (WIFI_PS_NONE);
  server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");  // Обработчик запроса домашней страницы
  server.serveStatic("/gz/css", SPIFFS, "/gz/css");
  server.serveStatic("/gz/js", SPIFFS, "/gz/js");
  server.serveStatic("/public", SPIFFS, "/logs");
  //server.serveStatic("/settings.json", SPIFFS, "/settings.json").setAuthentication(auth_username, device_key);
  server.on("/set_track_times", HTTP_POST, [](AsyncWebServerRequest *request) {
    saveTimeLimSets(request);
    req_millis = millis();
  });
  server.on("/file_list", HTTP_GET, [](AsyncWebServerRequest *request) {
    handleFileList(request);
    req_millis = millis();
  });
  server.on("/file_from_sd", HTTP_GET, [](AsyncWebServerRequest *request) {
    handleSDFileList(request);
    req_millis = millis();
  });
  server.on("/get_dev_data", [](AsyncWebServerRequest *request) {
    getDevData(dataObject.ts_now, request);
    req_millis = millis();
  });
  server.on("/get_tts", [](AsyncWebServerRequest *request) {
    request->send(403, "text/plain", "FORBIDDEN");
    req_millis = millis();
  });

  server.on("/op_status", [](AsyncWebServerRequest *request) {
    sendFinishCode(request);
    req_millis = millis();  
  });
  
  server.serveStatic("/config", SPIFFS, "/config.html");
  server.onNotFound([](AsyncWebServerRequest *request) {
    request->send(404, "text/plain", "Not found");
  }); //  Обработчик запроса несуществующей страницы

  //server.setRxTimeout(5000);
  //server.setAckTimeout(5000);
  //Serial.print("No delay: ");
//  Serial.println(server.getNoDelay() ? "true" : "false");
  server.begin();
}

Error:

14:32:42.019 -> E (69609) task_wdt:  - async_tcp (CPU 0/1)
14:32:42.019 -> E (69609) task_wdt: Tasks currently running:
14:32:42.019 -> E (69609) task_wdt: CPU 0: IDLE0
14:32:42.019 -> E (69609) task_wdt: CPU 1: IDLE1
14:32:42.019 -> E (69609) task_wdt: Aborting.
14:32:42.019 -> abort() was called at PC 0x400f499f on core 0
14:32:42.019 -> 
14:32:42.019 -> Backtrace: 0x4008d0c8:0x3ffbe170 0x4008d2f9:0x3ffbe190 0x400f499f:0x3ffbe1b0 0x400853d1:0x3ffbe1d0 0x40168557:0x3ffbc460 0x400f67e3:0x3ffbc480 0x4008afd1:0x3ffbc4a0 0x400897dd:0x3ffbc4c0
14:32:42.052 -> 
14:32:42.052 -> Rebooting...


I've tried to add #define CONFIG_ASYNC_TCP_RUNNING_CORE 1, but it made no sense

WDT trigger by async_tcp when stressing TCP stack

Hi,

Using AsyncTcp in combination Asyncwebserver, timers etc, (on PlatformIO these days, upstream library/SDK), and had issues with stability when stressing the tcp stack,
I noticed great improvement with stability with last commit and i did some testing:

  • having ServerSide Events running (webapp) in a 250ms data update interval, walk away (client from ESP32), to increase WiFi distance and see get tcp stack struggling when getting near out of reach (as expected), and it recovers as soon it got in reach again. Great!
  • idem, but now data update interval set to 1ms, walk away (near) out of distance, but then the watchdog gets triggered. The watchdog timer is configured by me to 8 seconds.

The relevant part of the serial monitor:

E (350990) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (350990) task_wdt:  - async_tcp (CPU 1)
E (350990) task_wdt: Tasks currently running:
E (350990) task_wdt: CPU 0: IDLE0
E (350990) task_wdt: CPU 1: IDLE1
E (350990) task_wdt: Aborting.
abort() was called at PC 0x400f5b33 on core 0

Backtrace: 0x4008d774:0x3ffbe160 0x4008d9a5:0x3ffbe180 0x400f5b33:0x3ffbe1a0 0x40082945:0x3ffbe1c0 0x4015ddef:0x3ffbc210 0x400f40f7:0x3ffbc230 0x4008b5ed:0x3ffbc250 0x400896ed:0x3ffbc270

Rebooting...

making a stack decoding with littleyoda (the only bt decoder which i got working with PIO):

java -jar EspStackTraceDecoder.jar ${HOME}/.platformio/packages/toolchain-xtensa32/bin/xtensa-esp32-elf-addr2line ${HOME}/Documents/PlatformIO/Projects/190426-131325-esp32doit-devkit-v1/.pioenvs/esp32doit-devkit-v1-upstream/firmware.elf  ./bt.txt
Exception Cause: Not found

0x4008d774: invoke_abort at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/panic.c:707
0x4008d9a5: abort at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/panic.c:707
0x400f5b33: task_wdt_isr at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/task_wdt.c:252
0x40082945: _xt_lowint1 at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/xtensa_vectors.S:1154
0x4015ddef: esp_pm_impl_waiti at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/pm_esp32.c:487
0x400f40f7: esp_vApplicationIdleHook at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/freertos_hooks.c:108
0x4008b5ed: prvIdleTask at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/tasks.c:3537
0x400896ed: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c:355 (discriminator 1)

In issue 14 the watchdog is also mentioned, but that is of 7th may, and asyncTcp code had updates afterwards
A more recent but Similar report

I assume it is trying to tell me, that the AsyncTCP does not-, or fails to- reset the watchdog, in a stressful situation, not (easy) getting data out, and new data keeps coming in.

Getting Random crashes when connecting via TCP

I can't find a pattern to why this is happening. Sometimes it happens and sometimes it doesn't. When it does, the ESP32 freezes and restarts itself.

I'm using the the latest Arduino core (1.0.3 rc1) and IDF. ESPAsyncWebServer is also up to date.

Here is the trace:

PC: 0x400d7d35: AsyncClient::_sent(tcp_pcb*, unsigned short) at C:\Users\John\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 859
EXCVADDR: 0x000000a4

Decoding stack results
0x400d7d35: AsyncClient::_sent(tcp_pcb*, unsigned short) at C:\Users\John\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 859
0x400d7ed8: AsyncClient::_s_sent(void*, tcp_pcb*, unsigned short) at C:\Users\John\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 1166
0x400d855d: _async_service_task(void*) at C:\Users\John\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp line 151
0x400889f5: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c line 143

esp32 error while serving files from SPIFFS

Hello, I have error with AsyncTCP while serving files from SPIFFS:

Guru Meditation Error: Core 1 panic'ed (StoreProhibited)
. Exception was unhandled.
Register dump:
PC : 0x4013ad4f PS : 0x00060130 A0 : 0x800d5311 A1 : 0x3ffe2340
A2 : 0xdceb8fcd A3 : 0x00000000 A4 : 0x00060120 A5 : 0x3ffe23e0
A6 : 0x3ffdfd2c A7 : 0x00000000 A8 : 0x00000000 A9 : 0x3ffe2350
A10 : 0x3ffca6e0 A11 : 0x3ffdfcfc A12 : 0x000022c2 A13 : 0x3ffe3da8
A14 : 0x00000000 A15 : 0x00000001 SAR : 0x00000019 EXCCAUSE: 0x0000001d
EXCVADDR: 0xdceb8ffd LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff

Backtrace: 0x4013ad4f:0x3ffe2340 0x400d530e:0x3ffe2360 0x400d55ed:0x3ffe23a0 0x400d565b:0x3ffe23d0

Which decodes to:

Decoding 7 results
0x4013ad4f: tcp_arg at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/lwip/core/tcp.c line 1652
0x4013ad4f: tcp_arg at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/lwip/core/tcp.c line 1652
0x400d530e: AsyncClient::_close() at /home/lefedor/Arduino/libraries/AsyncTCP.new/src/AsyncTCP.cpp line 787
0x400d55ed: AsyncClient::_poll(tcp_pcb*) at /home/lefedor/Arduino/libraries/AsyncTCP.new/src/AsyncTCP.cpp line 787
0x400d565b: AsyncClient::_s_poll(void*, tcp_pcb*) at /home/lefedor/Arduino/libraries/AsyncTCP.new/src/AsyncTCP.cpp line 787
: (inlined by) _handle_async_event at /home/lefedor/Arduino/libraries/AsyncTCP.new/src/AsyncTCP.cpp line 84
: (inlined by) _async_service_task at /home/lefedor/Arduino/libraries/AsyncTCP.new/src/AsyncTCP.cpp line 96

Have tried current and prev git versions AsyncTCP && current and prev version of arduino-esp32 - results are the same. Any Idea how to fix it?

Code does not compile

I want to try a code found here : https://techtutorialsx.com/

Here is the error message
`Arduino : 1.8.9 (Windows 10), Carte : "LOLIN D32, Default, 80MHz, 921600, None"

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:32: error: field 'call' has incomplete type 'tcpip_api_call_data'

 struct tcpip_api_call_data call;

                            ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: forward declaration of 'struct tcpip_api_call_data'

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_output(tcp_pcb*)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:295:70: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_output_api, (struct tcpip_api_call_data*)&msg);

                                                                  ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:295:70: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_write(tcp_pcb*, const char*, size_t, uint8_t)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:311:69: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_write_api, (struct tcpip_api_call_data*)&msg);

                                                                 ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:311:69: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_recved(tcp_pcb*, size_t)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:326:70: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call_data*)&msg);

                                                                  ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:326:70: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_connect(tcp_pcb*, ip_addr_t*, uint16_t, tcp_connected_fn)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:342:71: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_connect_api, (struct tcpip_api_call_data*)&msg);

                                                                   ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:342:71: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_close(tcp_pcb*)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:356:69: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_close_api, (struct tcpip_api_call_data*)&msg);

                                                                 ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:356:69: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_abort(tcp_pcb*)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:371:69: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call_data*)&msg);

                                                                 ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:371:69: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_bind(tcp_pcb*, ip_addr_t*, uint16_t)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:386:68: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_bind_api, (struct tcpip_api_call_data*)&msg);

                                                                ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:386:68: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'tcp_pcb* _tcp_listen_with_backlog(tcp_pcb*, uint8_t)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:401:70: error: invalid conversion from 'err_t ()(tcpip_api_call_data) {aka signed char ()(tcpip_api_call_data)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call)}' [-fpermissive]

 tcpip_api_call(_tcp_listen_api, (struct tcpip_api_call_data*)&msg);

                                                                  ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:401:70: error: cannot convert 'tcpip_api_call_data*' to 'tcpip_api_call*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call*)'

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call_data' is incomplete

 struct tcpip_api_call_data call;

        ^

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp: In member function 'void AsyncClient::_dns_found(ip_addr*)':

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:643:33: error: invalid use of incomplete type 'struct ip_addr'

     connect(IPAddress(ipaddr->u_addr.ip4.addr), _connect_port);

                             ^

In file included from C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.cpp:24:0:

C:\Users\Chuwi\Documents\Arduino\libraries\AsyncTCP\src\AsyncTCP.h:46:8: note: forward declaration of 'struct ip_addr'

struct ip_addr;

    ^

Plusieurs bibliothèque trouvées pour "WiFi.h"
Utilisé : C:\Users\Chuwi\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\libraries\WiFi
Non utilisé : C:\Program Files (x86)\Arduino\libraries\WiFi
exit status 1
Erreur de compilation pour la carte LOLIN D32

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.
`

And here is the code
#include "WiFi.h"
#include <FS.h>
#include <AsyncTCP.h>
#include "ESPAsyncWebServer.h"

const char* ssid = "---";
const char* password = "---";

AsyncWebServer server(80);

void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.printf("Connecting to %s ", ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("\nServer IP: ");
Serial.println(WiFi.localIP());
Serial.println("\n\n");

server.on("/hello", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "text/plain", "Hello World");
});

server.on("/printIp", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "text/plain", "ok");
Serial.print("Received request from client with IP: ");
Serial.println(request->client()->remoteIP());
});

server.on(
"/post", HTTP_POST, [](AsyncWebServerRequest * request) {}, NULL,
[](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
for (size_t i = 0; i < len; i++) Serial.write(data[i]);
Serial.println();
request->send(200);
});

server.begin();
}

void loop() {}

I'm using the latest IDE version 1.8.9 (but I had the same issue with v1.8.0) and selected either LOLIN D32 or ESP32 dev module

Error during compilation with newest arduino-esp32

WROOM -32
Arduino IDE

Until the last update espressif/arduino-esp32, there were no errors during compilation, and now the project is not compiled.

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:27: error: field 'call' has incomplete type 'tcpip_api_call'
struct tcpip_api_call call;
^
C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: forward declaration of 'struct tcpip_api_call'
struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_output(tcp_pcb*)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:291:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_output_api, (struct tcpip_api_call*)&msg);

                                                        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:291:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_write(tcp_pcb*, const char*, size_t, uint8_t)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:307:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_write_api, (struct tcpip_api_call*)&msg);

                                                            ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:307:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_recved(tcp_pcb*, size_t)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:322:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_recved_api, (struct tcpip_api_call*)&msg);

                                                             ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:322:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_connect(tcp_pcb*, ip_addr_t*, uint16_t, tcp_connected_fn)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:338:66: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_connect_api, (struct tcpip_api_call*)&msg);

                                                              ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:338:66: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_close(tcp_pcb*)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:352:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_close_api, (struct tcpip_api_call*)&msg);

                                                            ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:352:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_abort(tcp_pcb*)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:367:64: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_abort_api, (struct tcpip_api_call*)&msg);

                                                            ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:367:64: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'esp_err_t _tcp_bind(tcp_pcb*, ip_addr_t*, uint16_t)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:382:63: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_bind_api, (struct tcpip_api_call*)&msg);

                                                           ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:382:63: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: In function 'tcp_pcb* _tcp_listen_with_backlog(tcp_pcb*, uint8_t)':

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:397:65: error: invalid conversion from 'err_t ()(tcpip_api_call) {aka signed char ()(tcpip_api_call)}' to 'tcpip_api_call_fn {aka signed char ()(tcpip_api_call_data)}' [-fpermissive]

 tcpip_api_call(_tcp_listen_api, (struct tcpip_api_call*)&msg);

                                                             ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:397:65: error: cannot convert 'tcpip_api_call*' to 'tcpip_api_call_data*' for argument '2' to 'err_t tcpip_api_call(tcpip_api_call_fn, tcpip_api_call_data*)'

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:259:12: note: class type 'tcpip_api_call' is incomplete

 struct tcpip_api_call call;

        ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp: At global scope:

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:624:6: error: prototype for 'void AsyncClient::_dns_found(ip_addr_t*)' does not match any in class 'AsyncClient'

void AsyncClient::_dns_found(ip_addr_t *ipaddr){

  ^

In file included from C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:24:0:

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.h:84:10: error: candidate is: void AsyncClient::_dns_found(_ip_addr*)

 void _dns_found(struct _ip_addr *ipaddr);

      ^

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:946:6: error: prototype for 'void AsyncClient::_s_dns_found(const char*, ip_addr_t*, void*)' does not match any in class 'AsyncClient'

void AsyncClient::_s_dns_found(const char * name, ip_addr_t * ipaddr, void * arg){

  ^

In file included from C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.cpp:24:0:

C:\Users\Matsys\Documents\Arduino\hardware\espressif\esp32\libraries\AsyncTCP\src\AsyncTCP.h:164:17: error: candidate is: static void AsyncClient::_s_dns_found(const char*, _ip_addr*, void*)

 static void _s_dns_found(const char *name, struct _ip_addr *ipaddr, void *arg);

             ^

exit status 1
Ошибка компиляции для платы ESP32 Dev Module.

Serial console flooded with [E][AsyncTCP.cpp:897] _poll(): messages

Hi!

My first post on Github! Yay?

I started using AsyncTCP in combination with AsyncMqttClient (https://github.com/marvinroger/async-mqtt-client) and its working really good. No connectivity issues whatsoever. Except that my serial console is flooded with error messages:

[D][esp32-hal-psram.c:47] psramInit(): PSRAM enabled
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 0 - WIFI_READY
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 3 - STA_STOP
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 0 - WIFI_READY
[WiFi-event] event: 0
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 4 - STA_CONNECTED
[WiFi-event] event: 4
[WiFi-event] event: 4
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 7 - STA_GOT_IP
[D][WiFiGeneric.cpp:379] _eventCallback(): STA IP: 10.0.2.191, MASK: 255.255.255.0, GW: 10.0.2.254
10.0.2.191
Connecting to MQTT...
[WiFi-event] event: 7
WiFi connected
IP address:
10.0.2.191
Connecting to MQTT...
Connected to MQTT.
Session present: 0
[E][AsyncTCP.cpp:832] _lwip_fin(): 0x3ffba78c != 0x3ffcc6ec
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
Connecting to MQTT...
[W][AsyncTCP.cpp:650] connect(): already connected, state 4
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
[E][AsyncTCP.cpp:897] _poll(): 0x3ffba78c != 0x3ffcc6ec
....... continues forever......

Can someone please explain what is going on? What am I doing wrong?

Apparently esp_log_level_set does not work in the Arduino environment? So I can't ignore the message. Completely disabling logging is not an option for me. I could remove the log_e line in AsyncTCP.cpp but I rather keep the libraries as is.

My setup:
ESP32-wrover
Mikrotik Wifi
Mosquitto MQTT server/broker
Arduino environment with visual studio code.

How to access _async_service_task_handle to suspend?

Feature Request or implementation help:

I have a high speed data acquisition project in an ESP32 in which I need to devote one core to SPI communications and another core to serving the data via socket connection. I'm only using the Async libraries for (AsyncWebServer and AsyncWebSockets) for a configuration webpage, as even a 1ms response time of FreeRTOS is too slow (and the vTaskDelay(1) used in _async_service_task takes too much processing power). I need all of the grunt that the ESP32 can muster just to keep up with the flood of data. So I'd like a way of programmatically suspending and resuming the "_async_service_task". Which of course I'm doing with all of the other "housekeeping" type tasks i the program when the user initiates the high speed data transfer.
For some reason I can't just vTaskSuspend(_async_service_task_handle), as I get the following error:
"error: '_async_service_task_handle' was not declared in this scope
vTaskSuspend(_async_service_task_handle)"
I just can't seem to figure out how the Async Libraries are put together enough to access this handle.

I'm using VisualStudio with the VisualMicro plugin and the Arduino toolchain. I'm using the Arduino toolchain "Loop" task as my housekeeping task (Serial console, Telnet client, WiFi stuff, etc), and simply vTaskSuspending it during the high speed data transfer. I'd like to use the Async libraries, but I could just simply use the new WebServer library in the Arduino ESP32 toolchain and the arduinoWebSockets library in a task I can control, but I'd rather use these libraries for various reason (SPIFFS editor, Alexa library, re-use of previously written code, etc).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.