Links2004 / arduinoWebSockets

arduinoWebSockets
GNU Lesser General Public License v2.1
1.87k stars 555 forks source link

Async does not compile #454

Closed joecabezas closed 4 years ago

joecabezas commented 5 years ago

I tried to compile enabling ASYNC, but it failed

.pio\libdeps\client\WebSockets_ID549\src\WebSocketsClient.cpp:710:29: error: 'class AsyncTCPbuffer' has no member named 'available'
             if(_client.tcp->available()) {

I enabled it by doing in my compiler settings (platformio)

[env]
platform = espressif8266
board = d1_mini_lite
framework = arduino
build_flags =
    -D WEBSOCKETS_NETWORK_TYPE=NETWORK_ESP8266_ASYNC
lib_deps =
    WebSockets
    ESPAsyncTCP

Here is the full output of building:

Processing client (platform: espressif8266; board: d1_mini_lite; framework: arduino)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif8266/d1_mini_lite.html
PLATFORM: Espressif 8266 2.2.2 > WeMos D1 mini Lite
HARDWARE: ESP8266 80MHz, 80KB RAM, 1MB Flash
PACKAGES: toolchain-xtensa 2.40802.190218 (4.8.2), tool-esptool 1.413.0 (4.13), tool-esptoolpy 1.20600.0 (2.6.0), framework-arduinoespressif8266 2.20502.0 (2.5.2)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <WebSockets> 2.2.0
|   |-- <ESPAsyncTCP> 1.2.0
|   |   |-- <ESP8266WiFi> 1.0
|   |-- <Ethernet(esp8266)> 1.0.4
|   |   |-- <SPI> 1.0
|   |-- <Hash> 1.0
|   |-- <ESP8266WiFi> 1.0
|   |-- <SPI> 1.0
|-- <ESPAsyncTCP> 1.2.0
|   |-- <ESP8266WiFi> 1.0
|-- <ESP8266WiFi> 1.0
|-- <FastLED> 3.2.10
|   |-- <EspSoftwareSerial> 5.0.4
|-- <Microphone>
|-- <AudioLeds>
|   |-- <FastLED> 3.2.10
|   |   |-- <EspSoftwareSerial> 5.0.4
Compiling .pio\build\client\lib8e7\FastLED_ID126\FastLED.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\bitswap.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\colorpalettes.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\colorutils.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\hsv2rgb.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\lib8tion.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\noise.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\platforms.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\power_mgt.cpp.o
Compiling .pio\build\client\lib8e7\FastLED_ID126\wiring.cpp.o
Compiling .pio\build\client\src\client.cpp.o
Compiling .pio\build\client\src\server.cpp.o
Generating LD script .pio\build\client\ld\local.eagle.app.v6.common.ld
Compiling .pio\build\client\liba46\ESP8266WiFi\BearSSLHelpers.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\CertStoreBearSSL.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\ESP8266WiFi.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\ESP8266WiFiAP.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\ESP8266WiFiGeneric.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\ESP8266WiFiMulti.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\ESP8266WiFiSTA-WPS.cpp.o
In file included from src\client.cpp:6:0:
.pio\libdeps\client\FastLED_ID126/FastLED.h:14:21: note: #pragma message: FastLED version 3.002.010
 #    pragma message "FastLED version 3.002.010"
                     ^
In file included from .pio\libdeps\client\FastLED_ID126/FastLED.h:65:0,
                 from src\client.cpp:6:
.pio\libdeps\client\FastLED_ID126/fastspi.h:115:23: note: #pragma message: No hardware SPI pins defined.  All SPI access will default to bitbanged output
 #      pragma message "No hardware SPI pins defined.  All SPI access will default to bitbanged output"
                       ^
src\client.cpp: In function 'void loop()':
src\client.cpp:146:28: warning: 'void WebSocketsClient::loop()' is deprecated (declared at .pio\libdeps\client\WebSockets_ID549\src/WebSocketsClient.h:64) [-Wdeprecated-declarations]
     webSocketsClient->loop();
                            ^
Compiling .pio\build\client\liba46\ESP8266WiFi\ESP8266WiFiSTA.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\ESP8266WiFiScan.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\WiFiClient.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\WiFiClientSecureAxTLS.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\WiFiClientSecureBearSSL.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\WiFiServer.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\WiFiServerSecureAxTLS.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\WiFiServerSecureBearSSL.cpp.o
Compiling .pio\build\client\liba46\ESP8266WiFi\WiFiUdp.cpp.o
Compiling .pio\build\client\lib828\ESPAsyncTCP_ID305\AsyncPrinter.cpp.o
Compiling .pio\build\client\lib828\ESPAsyncTCP_ID305\ESPAsyncTCP.cpp.o
Compiling .pio\build\client\lib828\ESPAsyncTCP_ID305\ESPAsyncTCPbuffer.cpp.o
Compiling .pio\build\client\lib828\ESPAsyncTCP_ID305\SyncClient.cpp.o
Compiling .pio\build\client\lib828\ESPAsyncTCP_ID305\tcp_axtls.c.o
Compiling .pio\build\client\lib4d6\SPI\SPI.cpp.o
Compiling .pio\build\client\libe9b\Ethernet\Dhcp.cpp.o
Compiling .pio\build\client\libe9b\Ethernet\Dns.cpp.o
Compiling .pio\build\client\libe9b\Ethernet\Ethernet.cpp.o
Compiling .pio\build\client\libe9b\Ethernet\EthernetClient.cpp.o
Archiving .pio\build\client\liba46\libESP8266WiFi.a
Compiling .pio\build\client\libe9b\Ethernet\EthernetServer.cpp.o
Archiving .pio\build\client\lib828\libESPAsyncTCP_ID305.a
Compiling .pio\build\client\libe9b\Ethernet\EthernetUdp.cpp.o
Compiling .pio\build\client\libe9b\Ethernet\utility\socket.cpp.o
Archiving .pio\build\client\lib4d6\libSPI.a
Compiling .pio\build\client\libe9b\Ethernet\utility\w5100.cpp.o
Compiling .pio\build\client\libf8a\Hash\Hash.cpp.o
Compiling .pio\build\client\libf8a\Hash\sha1\sha1.c.o
Compiling .pio\build\client\lib10b\WebSockets_ID549\SocketIOclient.cpp.o
Compiling .pio\build\client\lib10b\WebSockets_ID549\WebSockets.cpp.o
Compiling .pio\build\client\lib10b\WebSockets_ID549\WebSocketsClient.cpp.o
Compiling .pio\build\client\lib10b\WebSockets_ID549\WebSocketsServer.cpp.o
Compiling .pio\build\client\lib10b\WebSockets_ID549\libb64\cdecode.c.o
Archiving .pio\build\client\libf8a\libHash.a
.pio\libdeps\client\WebSockets_ID549\src\SocketIOclient.cpp: In member function 'void SocketIOclient::loop()':
.pio\libdeps\client\WebSockets_ID549\src\SocketIOclient.cpp:92:28: warning: 'void WebSocketsClient::loop()' is deprecated (declared at .pio\libdeps\client\WebSockets_ID549\src\WebSocketsClient.h:64) [-Wdeprecated-declarations]
     WebSocketsClient::loop();
                            ^
.pio\libdeps\client\WebSockets_ID549\src\SocketIOclient.cpp: In member function 'void SocketIOclient::handleCbEvent(WStype_t, uint8_t*, size_t)':
.pio\libdeps\client\WebSockets_ID549\src\SocketIOclient.cpp:102:11: warning: enumeration value 'WStype_ERROR' not handled in switch [-Wswitch]
     switch(type) {
C ompiling .pio\build\client\lib10b\WebSockets_ID549\libb64\cencode.c.o
          ^
Archiving .pio\build\client\libe9b\libEthernet.a
Compiling .pio\build\client\lib10b\WebSockets_ID549\libsha1\libsha1.c.o
Compiling .pio\build\client\lib7ed\SoftwareSerial\SoftwareSerial.cpp.o
Compiling .pio\build\client\lib4c4\Microphone\Microphone.cpp.o
Compiling .pio\build\client\lib112\AudioLeds\AudioLeds.cpp.o
Compiling .pio\build\client\lib112\AudioLeds\effects\RainbowEffect.cpp.o
Archiving .pio\build\client\libFrameworkArduinoVariant.a
C.ompiling .pio\build\client\FrameworkArduino\Esp-frag.cpp.o
pio\libdeps\client\WebSockets_ID549\src\WebSocketsClient.cpp: In member function 'void WebSocketsClient::handleHeader(WSclient_t*, String*)':
.pio\libdeps\client\WebSockets_ID549\src\WebSocketsClient.cpp:710:29: error: 'class AsyncTCPbuffer' has no member named 'available'
             if(_client.tcp->available()) {

I even dont see available in source code for AsyncTCPbuffer https://github.com/me-no-dev/ESPAsyncTCP/blob/master/src/ESPAsyncTCPbuffer.h

what I am missing?

alin23 commented 5 years ago

@joecabezas Wrap the following lines inside a network type check: https://github.com/Links2004/arduinoWebSockets/blob/c038f100d68b8e5d0a96f25dd1609ff28592b02f/src/WebSocketsClient.cpp#L709-L717

Like that:

    #if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
        } else if(clientIsConnected(client) && client->isSocketIO && client->cSessionId.length() > 0) {
            if(_client.tcp->available()) {
                // read not needed data
                DEBUG_WEBSOCKETS("[WS-Client][handleHeader] still data in buffer (%d), clean up.\n", _client.tcp->available());
                while(_client.tcp->available() > 0) {
                    _client.tcp->read();
                }
            }
            sendHeader(client);
    #endif
Tajam commented 5 years ago

I run into this issue as well. Thanks for the fix! I feel like we should make a pull request for this fix.

whakru commented 4 years ago

Correct it please) I spent a lot of time until I found it.

kalibatta commented 4 years ago

I have struggled with this for days as it was not sending the upgrade request to the SocketIO server as shown below

`[WS-Client][sendHeader] sending header... [WS-Client][sendHeader] handshake GET /socket.io/?EIO=3&transport=polling HTTP/1.1 Host: 192.168.0.100:3000 Connection: keep-alive Origin: file:// User-Agent: arduino-WebSocket-Client

[write] n: zu t: 157 [WS-Client][sendHeader] sending header... Done (14829us). [WS-Client][handleHeader] RX: HTTP/1.1 200 OK [WS-Client][handleHeader] RX: Content-Type: text/plain; charset=UTF-8 [WS-Client][handleHeader] RX: Content-Length: 103 [WS-Client][handleHeader] RX: Access-Control-Allow-Credentials: true [WS-Client][handleHeader] RX: Access-Control-Allow-Origin: file:// [WS-Client][handleHeader] RX: Set-Cookie: io=R5J2Ie8Ow4P8_WDPAABt; Path=/; HttpOnly; SameSite=Strict [WS-Client][handleHeader] RX: Date: Thu, 14 May 2020 09:57:54 GMT [WS-Client][handleHeader] RX: Connection: keep-alive [WS-Client][handleHeader] Header read fin. [WS-Client][handleHeader] Client settings: [WS-Client][handleHeader] - cURL: /socket.io/?EIO=3 [WS-Client][handleHeader] - cKey: Cp8Nv8IlbQwQgiQQbqB8jg== [WS-Client][handleHeader] Server header: [WS-Client][handleHeader] - cCode: 200 [WS-Client][handleHeader] - cIsUpgrade: 0 [WS-Client][handleHeader] - cIsWebsocket: 1 [WS-Client][handleHeader] - cAccept: [WS-Client][handleHeader] - cProtocol: arduino [WS-Client][handleHeader] - cExtensions: [WS-Client][handleHeader] - cVersion: 0 [WS-Client][handleHeader] - cSessionId: R5J2Ie8Ow4P8_WDPAABt [WS-Client][handleHeader] no Websocket connection close. [write] n: zu t: 27 [WS-Client] client disconnected. [IOc] Disconnected! [wsIOc] Disconnected! [WS-Server][0] Disconnect client [WS-Client] asyncConnect... [WS-Client] connected to 192.168.0.100:3000. [WS-Client][sendHeader] sending header... [WS-Client][sendHeader] handshake GET /socket.io/?EIO=3&transport=polling HTTP/1.1 Host: 192.168.0.100:3000 Connection: keep-alive Origin: file:// User-Agent: arduino-WebSocket-Client

[write] n: zu t: 157 [WS-Client][sendHeader] sending header... Done (14771us). [WS-Client][handleHeader] RX: HTTP/1.1 200 OK [WS-Client][handleHeader] RX: Content-Type: text/plain; charset=UTF-8 [WS-Client][handleHeader] RX: Content-Length: 103 [WS-Client][handleHeader] RX: Access-Control-Allow-Credentials: true [WS-Client][handleHeader] RX: Access-Control-Allow-Origin: file:// [WS-Client][handleHeader] RX: Set-Cookie: io=5qWpOzM8qksSY5IZAABu; Path=/; HttpOnly; SameSite=Strict [WS-Client][handleHeader] RX: Date: Thu, 14 May 2020 09:57:55 GMT [WS-Client][handleHeader] RX: Connection: keep-alive [WS-Client][handleHeader] Header read fin. [WS-Client][handleHeader] Client settings: [WS-Client][handleHeader] - cURL: /socket.io/?EIO=3 [WS-Client][handleHeader] - cKey: F+WMaIhmW34p7wqNtEfQWw== [WS-Client][handleHeader] Server header: [WS-Client][handleHeader] - cCode: 200 [WS-Client][handleHeader] - cIsUpgrade: 0 [WS-Client][handleHeader] - cIsWebsocket: 0 [WS-Client][handleHeader] - cAccept: [WS-Client][handleHeader] - cProtocol: arduino [WS-Client][handleHeader] - cExtensions: [WS-Client][handleHeader] - cVersion: 0 [WS-Client][handleHeader] - cSessionId: 5qWpOzM8qksSY5IZAABu [WS-Client][handleHeader] no Websocket connection close. [write] n: zu t: 27 [WS-Client] client disconnected. [IOc] Disconnected! [wsIOc] Disconnected! [WS-Server][0] Disconnect client [WS-Client] asyncConnect...`

I had to change the condition suggested `#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) } else if(clientIsConnected(client) && client->isSocketIO && client->cSessionId.length() > 0) {

        if(_client.tcp->available()) {
            // read not needed data
            DEBUG_WEBSOCKETS("[WS-Client][handleHeader] still data in buffer (%d), clean up.\n", _client.tcp->available());
            while(_client.tcp->available() > 0) {
                _client.tcp->read();
            }
        }

        sendHeader(client);

endif`

To the one below to connect to the SocketIO

` } else if(clientIsConnected(client) && client->isSocketIO && client->cSessionId.length() > 0) {

if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)

        if(_client.tcp->available()) {
            // read not needed data
            DEBUG_WEBSOCKETS("[WS-Client][handleHeader] still data in buffer (%d), clean up.\n", _client.tcp->available());
            while(_client.tcp->available() > 0) {
                _client.tcp->read();
            }
        }

endif

        sendHeader(client);

    }`

My new log

`[WS-Client] asyncConnect... [WS-Client] connected to 192.168.0.100:3000. [WS-Client][sendHeader] sending header... [WS-Client][sendHeader] handshake GET /socket.io/?EIO=3&transport=polling HTTP/1.1 Host: 192.168.0.100:3000 Connection: keep-alive Origin: file:// User-Agent: arduino-WebSocket-Client

[write] n: zu t: 157 [WS-Client][sendHeader] sending header... Done (14818us). [WS-Client][handleHeader] RX: HTTP/1.1 200 OK [WS-Client][handleHeader] RX: Content-Type: text/plain; charset=UTF-8 [WS-Client][handleHeader] RX: Content-Length: 103 [WS-Client][handleHeader] RX: Access-Control-Allow-Credentials: true [WS-Client][handleHeader] RX: Access-Control-Allow-Origin: file:// [WS-Client][handleHeader] RX: Set-Cookie: io=U50dVxBukIkqorr2AACU; Path=/; HttpOnly; SameSite=Strict [WS-Client][handleHeader] RX: Date: Thu, 14 May 2020 10:04:12 GMT [WS-Client][handleHeader] RX: Connection: keep-alive [WS-Client][handleHeader] Header read fin. [WS-Client][handleHeader] Client settings: [WS-Client][handleHeader] - cURL: /socket.io/?EIO=3 [WS-Client][handleHeader] - cKey: DlcAFBKWzYSrfO8SBwoTUQ== [WS-Client][handleHeader] Server header: [WS-Client][handleHeader] - cCode: 200 [WS-Client][handleHeader] - cIsUpgrade: 0 [WS-Client][handleHeader] - cIsWebsocket: 1 [WS-Client][handleHeader] - cAccept: [WS-Client][handleHeader] - cProtocol: arduino [WS-Client][handleHeader] - cExtensions: [WS-Client][handleHeader] - cVersion: 0 [WS-Client][handleHeader] - cSessionId: U50dVxBukIkqorr2AACU [WS-Client][sendHeader] sending header... [WS-Client][sendHeader] handshake GET /socket.io/?EIO=3&transport=websocket&sid=U50dVxBukIkqorr2AACU HTTP/1.1 Host: 192.168.0.100:3000 Connection: Upgrade Upgrade: websocket Sec-WebSocket-Version: 13 Sec-WebSocket-Key: rElpwim5ZdE4rFYAn6waIA== Sec-WebSocket-Protocol: arduino Origin: file:// User-Agent: arduino-WebSocket-Client

[write] n: zu t: 306 [WS-Client][sendHeader] sending header... Done (31834us). [WS-Client][handleHeader] RX: 96:0{"sid":"U50dVxBukIkqorr2AACU","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}2:40HTTP/1.1 101 Switching Protocols [WS-Client][handleHeader] RX: Upgrade: websocket [WS-Client][handleHeader] RX: Connection: Upgrade [WS-Client][handleHeader] RX: Sec-WebSocket-Accept: lPma1hCVK7kegvLM8r3TJ3egMlk= [WS-Client][handleHeader] RX: Sec-WebSocket-Protocol: arduino [WS-Client][handleHeader] Header read fin. [WS-Client][handleHeader] Client settings: [WS-Client][handleHeader] - cURL: /socket.io/?EIO=3 [WS-Client][handleHeader] - cKey: rElpwim5ZdE4rFYAn6waIA== [WS-Client][handleHeader] Server header: [WS-Client][handleHeader] - cCode: 200 [WS-Client][handleHeader] - cIsUpgrade: 1 [WS-Client][handleHeader] - cIsWebsocket: 1 [WS-Client][handleHeader] - cAccept: lPma1hCVK7kegvLM8r3TJ3egMlk= [WS-Client][handleHeader] - cProtocol: arduino [WS-Client][handleHeader] - cExtensions: [WS-Client][handleHeader] - cVersion: 0 [WS-Client][handleHeader] - cSessionId: U50dVxBukIkqorr2AACU [WS-Client][handleHeader] Websocket connection init done. [WS][0][headerDone] Header Handling Done. [WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0 [wsIOc] Connected to url: /socket.io/?EIO=3 [WS][0][sendFrame] ------- send message frame ------- [WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 1 headerToPayload: 1 [WS][0][sendFrame] text: 5 [write] n: zu t: 7 [WS][0][sendFrame] sending Frame Done (2382us). [IOc] Connected to url: /socket.io/?EIO=3 [write] n: zu t: 6 [write] n: zu t: 2 [write] n: zu t: 85 ["login",{"room":"room-value","address":"address-value","username":"username-value"}] [WS][0][handleWebsocketWaitFor][readCb] size: 2 ok: 1 [WS][0][handleWebsocket] ------- read massage frame ------- [WS][0][handleWebsocket] fin: 1 rsv1: 0 rsv2: 0 rsv3 0 opCode: 1 [WS][0][handleWebsocket] mask: 0 payloadLen: 78 [WS][0][handleWebsocket] text: 42["login","{\"username\":\"username-value\",\"status\":0,\"msg\":\"Error\"}"] [wsIOc] get event (76): ["login","{\"username\":\"username-value\",\"status\":0,\"msg\":\"Error\"}"] [IOc] get event: ["login","{\"username\":\"username-value\",\"status\":0,\"msg\":\"Error\"}"] [WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0 [write] n: zu t: 6 [write] n: zu t: 2 [write] n: zu t: 85 ["login",{"room":"room-value","address":"address-value","username":"username-value"}] [WS][0][handleWebsocketWaitFor][readCb] size: 2 ok: 1 [WS][0][handleWebsocket] ------- read massage frame ------- [WS][0][handleWebsocket] fin: 1 rsv1: 0 rsv2: 0 rsv3 0 opCode: 1 [WS][0][handleWebsocket] mask: 0 payloadLen: 78 [WS][0][handleWebsocket] text: 42["login","{\"username\":\"username-value\",\"status\":0,\"msg\":\"Error\"}"] [wsIOc] get event (76): ["login","{\"username\":\"username-value\",\"status\":0,\"msg\":\"Error\"}"] [IOc] get event: ["login","{\"username\":\"username-value\",\"status\":0,\"msg\":\"Error\"}"]`

Hope this can help someone in the same situation like me