diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d7bea65..279fe85 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,18 +33,20 @@ jobs: run: | source $GITHUB_WORKSPACE/travis/common.sh cd $GITHUB_WORKSPACE - echo -en "::set-output name=matrix::" - echo -en "[" - get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266 esp8266 1.8.19 esp8266com:esp8266:generic:xtal=80,dbg=Serial1 - echo -en "," + echo -en "matrix=" >> $GITHUB_OUTPUT + echo -en "[" >> $GITHUB_OUTPUT - get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266 esp8266 1.8.19 esp8266com:esp8266:generic:xtal=80,eesz=1M,FlashMode=qio,FlashFreq=80 - echo -en "," + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266_pico esp8266 1.8.19 esp8266com:esp8266:generic:xtal=80,vt=flash,exception=disabled,stacksmash=disabled,ssl=all,mmu=3232,non32xfer=fast,ResetMethod=nodemcu,CrystalFreq=26,FlashFreq=80,FlashMode=qio,eesz=4M2M,led=2,sdk=nonosdk_190703,ip=lm2f,dbg=Serial1,lvl=SSL,wipe=none,baud=115200 >> $GITHUB_OUTPUT + echo -en "," >> $GITHUB_OUTPUT - get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp32 esp32 1.8.19 espressif:esp32:esp32:FlashFreq=80 + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266_pico esp8266 1.8.19 esp8266com:esp8266:generic:xtal=80,vt=flash,exception=disabled,stacksmash=disabled,ssl=all,mmu=3232,non32xfer=fast,ResetMethod=nodemcu,CrystalFreq=26,FlashFreq=80,FlashMode=qio,eesz=4M2M,led=2,sdk=nonosdk_190703,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=115200 >> $GITHUB_OUTPUT + echo -en "," >> $GITHUB_OUTPUT - echo -en "]" + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp32 esp32 1.8.19 espressif:esp32:esp32:FlashFreq=80 >> $GITHUB_OUTPUT + + echo -en "]" >> $GITHUB_OUTPUT + echo >> $GITHUB_OUTPUT outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} @@ -63,7 +65,7 @@ jobs: - name: Get Date id: get-date run: | - echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" + echo "date=$(/bin/date -u "+%Y%m%d")" >> $GITHUB_OUTPUT shell: bash - uses: actions/cache@v2 @@ -125,7 +127,7 @@ jobs: - name: Get Date id: get-date run: | - echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" + echo "date=$(/bin/date -u "+%Y%m%d")" >> $GITHUB_OUTPUT shell: bash - uses: actions/cache@v2 @@ -161,11 +163,13 @@ jobs: - name: config IDE run: | + set +x export DISPLAY=:1.0 export PATH="$HOME/arduino_ide:$PATH" arduino --board $BOARD --save-prefs + arduino --pref update.check=false --pref build.verbose=false --pref cache.enable=true --pref compiler.cache_core=true --pref compiler.warning_level=default --save-prefs arduino --get-pref sketchbook.path - arduino --pref update.check=false + arduino --get-pref - name: build example timeout-minutes: 20 diff --git a/README.md b/README.md index 26d124c..83faaab 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ a WebSocket Server and Client for Arduino based on RFC6455. - ESP8266 [Arduino for ESP8266](https://github.com/esp8266/Arduino/) - ESP32 [Arduino for ESP32](https://github.com/espressif/arduino-esp32) - ESP31B + - Raspberry Pi Pico W [Arduino for Pico](https://github.com/earlephilhower/arduino-pico) - Particle with STM32 ARM Cortex M3 - ATmega328 with Ethernet Shield (ATmega branch) - ATmega328 with enc28j60 (ATmega branch) diff --git a/examples/esp8266/WebSocketClient/WebSocketClient.ino b/examples/esp8266_pico/WebSocketClient/WebSocketClient.ino similarity index 100% rename from examples/esp8266/WebSocketClient/WebSocketClient.ino rename to examples/esp8266_pico/WebSocketClient/WebSocketClient.ino diff --git a/examples/esp8266/WebSocketClientOTA/README.md b/examples/esp8266_pico/WebSocketClientOTA/README.md similarity index 100% rename from examples/esp8266/WebSocketClientOTA/README.md rename to examples/esp8266_pico/WebSocketClientOTA/README.md diff --git a/examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino b/examples/esp8266_pico/WebSocketClientOTA/WebSocketClientOTA.ino similarity index 83% rename from examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino rename to examples/esp8266_pico/WebSocketClientOTA/WebSocketClientOTA.ino index 2c87c25..3a988a5 100644 --- a/examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino +++ b/examples/esp8266_pico/WebSocketClientOTA/WebSocketClientOTA.ino @@ -8,25 +8,29 @@ #include #include -#ifdef ESP8266 +#if defined(ESP8266) #include + #include #include - #include -#endif -#ifdef ESP32 - #include "WiFi.h" + #include + #include + + ESP8266WiFiMulti WiFiMulti; +#elif defined(ESP32) + #include + #include #include "ESPmDNS.h" - #include + #include + + WiFiMulti WiFiMulti; +#else + #error Unsupported device #endif #include -#include - #include -#include -ESP8266WiFiMulti WiFiMulti; WebSocketsClient webSocket; #define USE_SERIAL Serial @@ -48,19 +52,12 @@ uint32_t maxSketchSpace = 0; int SketchSize = 0; bool ws_conn = false; -String IpAddress2String(const IPAddress& ipAddress) -{ - return String(ipAddress[0]) + String(".") + - String(ipAddress[1]) + String(".") + - String(ipAddress[2]) + String(".") + - String(ipAddress[3]); -} void greetings_(){ StaticJsonDocument<200> doc; doc["type"] = "greetings"; - doc["mac"] = WiFi.macAddress(); - doc["ip"] = IpAddress2String(WiFi.localIP()); + doc["mac"] = WiFi.macAddress().c_str(); + doc["ip"] = WiFi.localIP().toString().c_str(); doc["version"] = version; doc["name"] = name; doc["chip"] = chip; @@ -73,7 +70,7 @@ void greetings_(){ void register_(){ StaticJsonDocument<200> doc; doc["type"] = "register"; - doc["mac"] = WiFi.macAddress(); + doc["mac"] = WiFi.macAddress().c_str(); char data[200]; serializeJson(doc, data); @@ -88,11 +85,10 @@ typedef struct { CALLBACK_FUNCTION func; } RESPONSES_STRUCT; -void OTA(JsonDocument &msg){ +void OTA_RESPONSES(JsonDocument &msg){ USE_SERIAL.print(F("[WSc] OTA mode: ")); - const char* go = "go"; - const char* ok = "ok"; - if(strncmp( msg["value"], go, strlen(go)) == 0 ) { + String val = msg["value"]; + if(val == "go") { USE_SERIAL.print(F("go\n")); SketchSize = int(msg["size"]); maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; @@ -103,27 +99,31 @@ void OTA(JsonDocument &msg){ Update.printError(Serial); ESP.restart(); } - } else if (strncmp( msg["value"], ok, strlen(ok)) == 0) { + } else if (val == "ok") { USE_SERIAL.print(F("OK\n")); register_(); } else { USE_SERIAL.print(F("unknown value : ")); - USE_SERIAL.print(msg["value"].as()); + USE_SERIAL.print(val); USE_SERIAL.print(F("\n")); } } -void STATE(JsonDocument &msg){ +void STA_RESPONSES(JsonDocument &msg){ // Do something with message } -RESPONSES_STRUCT responses[] = { - {"ota", OTA}, - {"state", STATE}, +// Count of responses handled by RESPONSES_STRUCT +// increase increase if another response handler is added +const int nrOfResponses = 2; + +RESPONSES_STRUCT responses[nrOfResponses] = { + {"ota", OTA_RESPONSES}, + {"state", STA_RESPONSES}, }; void text(uint8_t * payload, size_t length){ - // Convert mesage to something usable + // Convert message to something usable char msgch[length]; for (unsigned int i = 0; i < length; i++) { @@ -145,9 +145,10 @@ void text(uint8_t * payload, size_t length){ // Handle each TYPE of message int b = 0; - for( b=0 ; strlen(responses[b].type) ; b++ ) + String t = doc_in["type"]; + for( b=0 ; b None: type_ = msg_json.get('type') name = msg_json.get('name') - func = switcher.get(type_, _unhandleld) + func = switcher.get(type_, _unhandled) Logger.debug("Client(%s)said: %s", name, type_) try: @@ -225,7 +225,7 @@ async def ws_server(websocket, path) -> None: async def main(): """Server starter - Normal user can bind only port nubers greater than 1024 + Normal user can bind only port numbers greater than 1024 """ async with websockets.serve(ws_server, "10.0.1.5", 8081): await asyncio.Future() # run forever diff --git a/examples/esp8266/WebSocketClientOTA/python_ota_server/requirements.txt b/examples/esp8266_pico/WebSocketClientOTA/python_ota_server/requirements.txt similarity index 100% rename from examples/esp8266/WebSocketClientOTA/python_ota_server/requirements.txt rename to examples/esp8266_pico/WebSocketClientOTA/python_ota_server/requirements.txt diff --git a/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino b/examples/esp8266_pico/WebSocketClientSSL/WebSocketClientSSL.ino similarity index 100% rename from examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino rename to examples/esp8266_pico/WebSocketClientSSL/WebSocketClientSSL.ino diff --git a/examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino b/examples/esp8266_pico/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino similarity index 100% rename from examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino rename to examples/esp8266_pico/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino diff --git a/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino b/examples/esp8266_pico/WebSocketClientSocketIO/WebSocketClientSocketIO.ino similarity index 100% rename from examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino rename to examples/esp8266_pico/WebSocketClientSocketIO/WebSocketClientSocketIO.ino diff --git a/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino b/examples/esp8266_pico/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino similarity index 100% rename from examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino rename to examples/esp8266_pico/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino diff --git a/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino b/examples/esp8266_pico/WebSocketClientStomp/WebSocketClientStomp.ino similarity index 100% rename from examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino rename to examples/esp8266_pico/WebSocketClientStomp/WebSocketClientStomp.ino diff --git a/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino b/examples/esp8266_pico/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino similarity index 100% rename from examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino rename to examples/esp8266_pico/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino diff --git a/examples/esp8266/WebSocketServer/WebSocketServer.ino b/examples/esp8266_pico/WebSocketServer/WebSocketServer.ino similarity index 100% rename from examples/esp8266/WebSocketServer/WebSocketServer.ino rename to examples/esp8266_pico/WebSocketServer/WebSocketServer.ino diff --git a/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino b/examples/esp8266_pico/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino similarity index 100% rename from examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino rename to examples/esp8266_pico/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino diff --git a/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino b/examples/esp8266_pico/WebSocketServerFragmentation/WebSocketServerFragmentation.ino similarity index 100% rename from examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino rename to examples/esp8266_pico/WebSocketServerFragmentation/WebSocketServerFragmentation.ino diff --git a/examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino b/examples/esp8266_pico/WebSocketServerHooked/WebSocketServerHooked.ino similarity index 100% rename from examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino rename to examples/esp8266_pico/WebSocketServerHooked/WebSocketServerHooked.ino diff --git a/examples/esp8266/WebSocketServerHooked/emu b/examples/esp8266_pico/WebSocketServerHooked/emu similarity index 100% rename from examples/esp8266/WebSocketServerHooked/emu rename to examples/esp8266_pico/WebSocketServerHooked/emu diff --git a/examples/esp8266/WebSocketServerHooked/ws-testclient.py b/examples/esp8266_pico/WebSocketServerHooked/ws-testclient.py similarity index 100% rename from examples/esp8266/WebSocketServerHooked/ws-testclient.py rename to examples/esp8266_pico/WebSocketServerHooked/ws-testclient.py diff --git a/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino b/examples/esp8266_pico/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino similarity index 100% rename from examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino rename to examples/esp8266_pico/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino diff --git a/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino b/examples/esp8266_pico/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino similarity index 100% rename from examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino rename to examples/esp8266_pico/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino diff --git a/library.json b/library.json index 2f7aec6..d29c1a7 100644 --- a/library.json +++ b/library.json @@ -16,10 +16,10 @@ "keywords": "wifi, http, web, server, client, websocket", "license": "LGPL-2.1", "name": "WebSockets", - "platforms": "atmelavr, espressif8266, espressif32", + "platforms": "atmelavr, espressif8266, espressif32, raspberrypi", "repository": { "type": "git", "url": "https://github.com/Links2004/arduinoWebSockets.git" }, - "version": "2.3.6" + "version": "2.4.0" } \ No newline at end of file diff --git a/library.properties b/library.properties index b9899d0..097048e 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=WebSockets -version=2.3.6 +version=2.4.0 author=Markus Sattler maintainer=Markus Sattler sentence=WebSockets for Arduino (Server + Client) diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 49f5480..260129f 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -482,7 +482,7 @@ void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t switch(header->opCode) { case WSop_text: DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); - // no break here! + // fallthrough case WSop_binary: case WSop_continuation: messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); diff --git a/src/WebSockets.h b/src/WebSockets.h index 60c13d9..db6c0e8 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -50,7 +50,7 @@ DEBUG_ESP_PORT.flush(); \ } #else -//#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ ) +// #define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ ) #endif #endif @@ -67,7 +67,7 @@ #define WEBSOCKETS_USE_BIG_MEM #define GET_FREE_HEAP ESP.getFreeHeap() // moves all Header strings to Flash (~300 Byte) -//#define WEBSOCKETS_SAVE_RAM +// #define WEBSOCKETS_SAVE_RAM #if defined(ESP8266) #define WEBSOCKETS_YIELD() delay(0) @@ -84,6 +84,15 @@ #define GET_FREE_HEAP System.freeMemory() #define WEBSOCKETS_YIELD() #define WEBSOCKETS_YIELD_MORE() + +#elif defined(ARDUINO_ARCH_RP2040) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP rp2040.getFreeHeap() +#define WEBSOCKETS_YIELD() yield() +#define WEBSOCKETS_YIELD_MORE() delay(1) + #else // atmega328p has only 2KB ram! @@ -94,7 +103,9 @@ #define WEBSOCKETS_YIELD_MORE() #endif +#ifndef WEBSOCKETS_TCP_TIMEOUT #define WEBSOCKETS_TCP_TIMEOUT (5000) +#endif #define NETWORK_ESP8266_ASYNC (0) #define NETWORK_ESP8266 (1) @@ -102,6 +113,7 @@ #define NETWORK_ENC28J60 (3) #define NETWORK_ESP32 (4) #define NETWORK_ESP32_ETH (5) +#define NETWORK_RP2040 (6) // max size of the WS Message Header #define WEBSOCKETS_MAX_HEADER_SIZE (14) @@ -110,12 +122,16 @@ // select Network type based #if defined(ESP8266) || defined(ESP31B) #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 -//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC -//#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 +// #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC +// #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 #elif defined(ESP32) #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32 -//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH +// #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH + +#elif defined(ARDUINO_ARCH_RP2040) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_RP2040 + #else #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 @@ -199,6 +215,15 @@ #define WEBSOCKETS_NETWORK_CLASS WiFiClient #define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) + +#include +#include +#define SSL_BARESSL +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + #else #error "no network type selected!" #endif diff --git a/src/WebSockets4WebServer.h b/src/WebSockets4WebServer.h index ba2b020..595f38b 100644 --- a/src/WebSockets4WebServer.h +++ b/src/WebSockets4WebServer.h @@ -28,23 +28,29 @@ #include #include -#if WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266 && WEBSERVER_HAS_HOOK +#if((WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)) && WEBSERVER_HAS_HOOK class WebSockets4WebServer : public WebSocketsServerCore { +#if defined(ESP8266) + using WebServerClass = ESP8266WebServer; +#else + using WebServerClass = WebServer; +#endif + public: WebSockets4WebServer(const String & origin = "", const String & protocol = "arduino") : WebSocketsServerCore(origin, protocol) { begin(); } - ESP8266WebServer::HookFunction hookForWebserver(const String & wsRootDir, WebSocketServerEvent event) { + WebServerClass::HookFunction hookForWebserver(const String & wsRootDir, WebSocketServerEvent event) { onEvent(event); - return [&, wsRootDir](const String & method, const String & url, WiFiClient * tcpClient, ESP8266WebServer::ContentTypeFunction contentType) { + return [&, wsRootDir](const String & method, const String & url, WiFiClient * tcpClient, WebServerClass::ContentTypeFunction contentType) { (void)contentType; if(!(method == "GET" && url.indexOf(wsRootDir) == 0)) { - return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE; + return WebServerClass::CLIENT_REQUEST_CAN_CONTINUE; } // allocate a WiFiClient copy (like in WebSocketsServer::handleNewClients()) @@ -63,7 +69,7 @@ class WebSockets4WebServer : public WebSocketsServerCore { } // tell webserver to not close but forget about this client - return ESP8266WebServer::CLIENT_IS_GIVEN; + return WebServerClass::CLIENT_IS_GIVEN; }; } }; diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 2be6f32..f1155e0 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -76,6 +76,8 @@ void WebSocketsClient::begin(const char * host, uint16_t port, const char * url, #ifdef ESP8266 randomSeed(RANDOM_REG32); +#elif defined(ARDUINO_ARCH_RP2040) + randomSeed(rp2040.hwrand32()); #else // todo find better seed randomSeed(millis()); @@ -224,7 +226,7 @@ void WebSocketsClient::loop(void) { _client.ssl->setCACert(_CA_cert); #elif defined(ESP8266) && defined(SSL_AXTLS) _client.ssl->setCACert((const uint8_t *)_CA_cert, strlen(_CA_cert) + 1); -#elif defined(ESP8266) && defined(SSL_BARESSL) +#elif(defined(ESP8266) || defined(ARDUINO_ARCH_RP2040)) && defined(SSL_BARESSL) _client.ssl->setTrustAnchors(_CA_cert); #else #error setCACert not implemented @@ -426,9 +428,9 @@ bool WebSocketsClient::isConnected(void) { return (_client.status == WSC_CONNECTED); } -//################################################################################# -//################################################################################# -//################################################################################# +// ################################################################################# +// ################################################################################# +// ################################################################################# /** * @@ -473,7 +475,7 @@ void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, u void WebSocketsClient::clientDisconnect(WSclient_t * client) { bool event = false; -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) if(client->isSSL && client->ssl) { if(client->ssl->connected()) { client->ssl->flush(); @@ -733,7 +735,7 @@ void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) { client->cExtensions = headerValue; } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { client->cVersion = headerValue.toInt(); - } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Set-Cookie"))) { + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Set-Cookie")) && headerValue.indexOf(" io=") > -1) { if(headerValue.indexOf(';') > -1) { client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1, headerValue.indexOf(";")); } else { @@ -864,7 +866,7 @@ void WebSocketsClient::connectedCb() { _client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); #endif -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) _client.tcp->setNoDelay(true); #endif diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index c2f533b..79a52ce 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -85,6 +85,8 @@ void WebSocketsServerCore::begin(void) { #elif defined(ESP32) #define DR_REG_RNG_BASE 0x3ff75144 randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); +#elif defined(ARDUINO_ARCH_RP2040) + randomSeed(rp2040.hwrand32()); #else // TODO find better seed randomSeed(millis()); @@ -394,7 +396,7 @@ bool WebSocketsServerCore::clientIsConnected(uint8_t num) { return clientIsConnected(client); } -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) /** * get an IP for a client * @param num uint8_t client id @@ -412,9 +414,9 @@ IPAddress WebSocketsServerCore::remoteIP(uint8_t num) { } #endif -//################################################################################# -//################################################################################# -//################################################################################# +// ################################################################################# +// ################################################################################# +// ################################################################################# /** * handle new client connection @@ -439,7 +441,7 @@ WSclient_t * WebSocketsServerCore::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclien client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); #endif client->status = WSC_HEADER; -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) #ifndef NODEBUG_WEBSOCKETS IPAddress ip = client->tcp->remoteIP(); #endif @@ -521,7 +523,7 @@ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) { } if(client->tcp) { if(client->tcp->connected()) { -#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_RP2040) client->tcp->flush(); #endif client->tcp->stop(); @@ -540,7 +542,7 @@ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) { * @param client WSclient_t * ptr to the client struct */ void WebSocketsServerCore::clientDisconnect(WSclient_t * client) { -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) if(client->isSSL && client->ssl) { if(client->ssl->connected()) { client->ssl->flush(); @@ -614,7 +616,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc if(!client) { // no free space to handle client -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) #ifndef NODEBUG_WEBSOCKETS IPAddress ip = tcpClient->remoteIP(); #endif @@ -627,6 +629,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc client = &dummy; client->tcp = tcpClient; dropNativeClient(client); + return nullptr; } WEBSOCKETS_YIELD(); @@ -638,7 +641,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc * Handle incoming Connection Request */ void WebSocketsServer::handleNewClients(void) { -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) while(_server->hasClient()) { #endif @@ -651,7 +654,7 @@ void WebSocketsServer::handleNewClients(void) { handleNewClient(tcpClient); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) } #endif } @@ -922,7 +925,7 @@ void WebSocketsServer::begin(void) { void WebSocketsServer::close(void) { WebSocketsServerCore::close(); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) _server->close(); #elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) _server->end(); diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 543cba9..197c37f 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -90,7 +90,7 @@ class WebSocketsServerCore : protected WebSockets { void enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); void disableHeartbeat(); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) IPAddress remoteIP(uint8_t num); #endif diff --git a/src/WebSocketsVersion.h b/src/WebSocketsVersion.h index e0ab39c..e349bbf 100644 --- a/src/WebSocketsVersion.h +++ b/src/WebSocketsVersion.h @@ -1,6 +1,6 @@ /** * @file WebSocketsVersion.h - * @date 08.03.2021 + * @date 01.05.2023 * @author Markus Sattler * * Copyright (c) 2015 Markus Sattler. All rights reserved. @@ -25,12 +25,12 @@ #ifndef WEBSOCKETSVERSION_H_ #define WEBSOCKETSVERSION_H_ -#define WEBSOCKETS_VERSION "2.3.6" +#define WEBSOCKETS_VERSION "2.4.0" #define WEBSOCKETS_VERSION_MAJOR 2 -#define WEBSOCKETS_VERSION_MINOR 3 -#define WEBSOCKETS_VERSION_PATCH 6 +#define WEBSOCKETS_VERSION_MINOR 4 +#define WEBSOCKETS_VERSION_PATCH 0 -#define WEBSOCKETS_VERSION_INT 2003006 +#define WEBSOCKETS_VERSION_INT 2004000 #endif /* WEBSOCKETSVERSION_H_ */ diff --git a/src/libb64/cdecode.c b/src/libb64/cdecode.c index e135da2..615068a 100644 --- a/src/libb64/cdecode.c +++ b/src/libb64/cdecode.c @@ -9,7 +9,7 @@ For details, see http://sourceforge.net/projects/libb64 #include #endif -#if defined(ESP32) +#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040) #define CORE_HAS_LIBB64 #endif diff --git a/src/libb64/cencode.c b/src/libb64/cencode.c index afe1463..cdc0f67 100644 --- a/src/libb64/cencode.c +++ b/src/libb64/cencode.c @@ -9,7 +9,7 @@ For details, see http://sourceforge.net/projects/libb64 #include #endif -#if defined(ESP32) +#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040) #define CORE_HAS_LIBB64 #endif diff --git a/travis/common.sh b/travis/common.sh index c1c2328..2754bdc 100644 --- a/travis/common.sh +++ b/travis/common.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -ex +set -x function build_sketches() { @@ -33,7 +33,7 @@ function build_sketch() { local arduino=$1 local sketch=$2 - $arduino --verify $sketch; + $arduino --verify --verbose $sketch; local result=$? if [ $result -ne 0 ]; then echo "Build failed ($sketch) build verbose..."