diff --git a/.travis.yml b/.travis.yml index 881c97f..14693dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,28 +2,31 @@ sudo: false language: bash os: - linux +env: + matrix: + - CPU="esp8266" BOARD="esp8266com:esp8266:generic:CpuFrequency=80" IDE_VERSION=1.6.5 + - CPU="esp8266" BOARD="esp8266com:esp8266:generic:CpuFrequency=80,FlashSize=1M0,FlashMode=qio,FlashFreq=80" IDE_VERSION=1.8.5 + - CPU="esp8266" BOARD="esp8266com:esp8266:generic:CpuFrequency=80,Debug=Serial1" IDE_VERSION=1.6.5 + - CPU="esp32" BOARD="espressif:esp32:esp32:FlashFreq=80" IDE_VERSION=1.6.5 + - CPU="esp32" BOARD="espressif:esp32:esp32:FlashFreq=80" IDE_VERSION=1.8.5 script: - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16 - sleep 3 - export DISPLAY=:1.0 - - wget http://downloads.arduino.cc/arduino-1.6.5-linux64.tar.xz - - tar xf arduino-1.6.5-linux64.tar.xz - - mv arduino-1.6.5 $HOME/arduino_ide + - wget http://downloads.arduino.cc/arduino-$IDE_VERSION-linux64.tar.xz + - tar xf arduino-$IDE_VERSION-linux64.tar.xz + - mv arduino-$IDE_VERSION $HOME/arduino_ide - export PATH="$HOME/arduino_ide:$PATH" - which arduino - mkdir -p $HOME/Arduino/libraries - cp -r $TRAVIS_BUILD_DIR $HOME/Arduino/libraries/arduinoWebSockets - - cd $HOME/arduino_ide/hardware - - mkdir esp8266com - - cd esp8266com - - git clone https://github.com/esp8266/Arduino.git esp8266 - - cd esp8266/tools - - python get.py - source $TRAVIS_BUILD_DIR/travis/common.sh - - arduino --board esp8266com:esp8266:generic --save-prefs + - get_core $CPU + - cd $TRAVIS_BUILD_DIR + - arduino --board $BOARD --save-prefs - arduino --get-pref sketchbook.path - - build_sketches arduino $HOME/Arduino/libraries/arduinoWebSockets esp8266 + - build_sketches arduino $HOME/Arduino/libraries/arduinoWebSockets/examples/$CPU $CPU notifications: email: diff --git a/README.md b/README.md index 0c49b48..81b4107 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,8 @@ a WebSocket Server and Client for Arduino based on RFC6455. - wss / SSL is not possible. ##### Supported Hardware ##### - - ESP8266 [Arduino for ESP8266](https://github.com/Links2004/Arduino) + - ESP8266 [Arduino for ESP8266](https://github.com/esp8266/Arduino/) + - ESP32 [Arduino for ESP32](https://github.com/espressif/arduino-esp32) - ESP31B - Particle with STM32 ARM Cortex M3 - ATmega328 with Ethernet Shield (ATmega branch) diff --git a/examples/ParticleWebSocketClient/.esp8266.skip b/examples/ParticleWebSocketClient/.esp8266.skip deleted file mode 100644 index e69de29..0000000 diff --git a/examples/WebSocketClientAVR/.esp8266.skip b/examples/WebSocketClientAVR/.esp8266.skip deleted file mode 100644 index e69de29..0000000 diff --git a/examples/WebSocketClientAVR/WebSocketClientAVR.ino b/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino similarity index 100% rename from examples/WebSocketClientAVR/WebSocketClientAVR.ino rename to examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino diff --git a/examples/esp32/WebSocketClient/WebSocketClient.ino b/examples/esp32/WebSocketClient/WebSocketClient.ino new file mode 100644 index 0000000..7483b6b --- /dev/null +++ b/examples/esp32/WebSocketClient/WebSocketClient.ino @@ -0,0 +1,106 @@ +/* + * WebSocketClient.ino + * + * Created on: 24.05.2015 + * + */ + +#include + +#include +#include +#include + +#include + + +WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +HardwareSerial Serial1(2); + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("192.168.0.123", 81, "/"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional remove if not needed + webSocket.setAuthorization("user", "Password"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); + +} + +void loop() { + webSocket.loop(); +} diff --git a/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino b/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino new file mode 100644 index 0000000..5b4f3a5 --- /dev/null +++ b/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino @@ -0,0 +1,102 @@ +/* + * WebSocketClientSSL.ino + * + * Created on: 10.12.2015 + * + * note SSL is only possible with the ESP8266 + * + */ + +#include + +#include +#include +#include + +#include + + +WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +HardwareSerial Serial1(2); + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.beginSSL("192.168.0.123", 81); + webSocket.onEvent(webSocketEvent); + +} + +void loop() { + webSocket.loop(); +} diff --git a/examples/esp32/WebSocketServer/WebSocketServer.ino b/examples/esp32/WebSocketServer/WebSocketServer.ino new file mode 100644 index 0000000..da7d38f --- /dev/null +++ b/examples/esp32/WebSocketServer/WebSocketServer.ino @@ -0,0 +1,100 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include + +#include + +WiFiMulti WiFiMulti; +WebSocketsServer webSocket = WebSocketsServer(81); + +HardwareSerial Serial1(2); + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: + { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + // send message to client + // webSocket.sendTXT(num, "message here"); + + // send data to all connected clients + // webSocket.broadcastTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + + // send message to client + // webSocket.sendBIN(num, payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/examples/WebSocketClient/WebSocketClient.ino b/examples/esp8266/WebSocketClient/WebSocketClient.ino similarity index 100% rename from examples/WebSocketClient/WebSocketClient.ino rename to examples/esp8266/WebSocketClient/WebSocketClient.ino diff --git a/examples/WebSocketClientSSL/WebSocketClientSSL.ino b/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino similarity index 100% rename from examples/WebSocketClientSSL/WebSocketClientSSL.ino rename to examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino diff --git a/examples/WebSocketClientSocketIO/WebSocketClientSocketIO.ino b/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino similarity index 100% rename from examples/WebSocketClientSocketIO/WebSocketClientSocketIO.ino rename to examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino diff --git a/examples/WebSocketClientStomp/WebSocketClientStomp.ino b/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino similarity index 100% rename from examples/WebSocketClientStomp/WebSocketClientStomp.ino rename to examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino diff --git a/examples/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino b/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino similarity index 100% rename from examples/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino rename to examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino diff --git a/examples/WebSocketServer/WebSocketServer.ino b/examples/esp8266/WebSocketServer/WebSocketServer.ino similarity index 100% rename from examples/WebSocketServer/WebSocketServer.ino rename to examples/esp8266/WebSocketServer/WebSocketServer.ino diff --git a/examples/WebSocketServerFragmentation/WebSocketServerFragmentation.ino b/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino similarity index 100% rename from examples/WebSocketServerFragmentation/WebSocketServerFragmentation.ino rename to examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino diff --git a/examples/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino b/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino similarity index 100% rename from examples/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino rename to examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino diff --git a/examples/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino b/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino similarity index 95% rename from examples/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino rename to examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino index f737d7f..7915409 100644 --- a/examples/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino +++ b/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino @@ -23,7 +23,7 @@ ESP8266WiFiMulti WiFiMulti; -ESP8266WebServer server = ESP8266WebServer(80); +ESP8266WebServer server(80); WebSocketsServer webSocket = WebSocketsServer(81); void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { @@ -119,4 +119,3 @@ void loop() { webSocket.loop(); server.handleClient(); } - diff --git a/examples/ParticleWebSocketClient/application.cpp b/examples/particle/ParticleWebSocketClient/application.cpp similarity index 100% rename from examples/ParticleWebSocketClient/application.cpp rename to examples/particle/ParticleWebSocketClient/application.cpp diff --git a/library.json b/library.json index 35289fc..a019efb 100644 --- a/library.json +++ b/library.json @@ -13,7 +13,7 @@ "type": "git", "url": "https://github.com/Links2004/arduinoWebSockets.git" }, - "version": "2.0.10", + "version": "2.1.0", "license": "LGPL-2.1", "export": { "exclude": [ diff --git a/library.properties b/library.properties index 6ae767e..14e1fe9 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=WebSockets -version=2.0.10 +version=2.1.0 author=Markus Sattler maintainer=Markus Sattler sentence=WebSockets for Arduino (Server + Client) diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index cd7c9cc..44ddbb1 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -38,6 +38,8 @@ extern "C" { #ifdef ESP8266 #include +#elif defined(ESP32) +#include #else extern "C" { @@ -484,6 +486,9 @@ String WebSockets::acceptKey(String & clientKey) { uint8_t sha1HashBin[20] = { 0 }; #ifdef ESP8266 sha1(clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", &sha1HashBin[0]); +#elif defined(ESP32) + String data = clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + esp_sha(SHA1, (unsigned char*)data.c_str(), data.length(), &sha1HashBin[0]); #else clientKey += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; SHA1_CTX ctx; diff --git a/src/WebSockets.h b/src/WebSockets.h index 63443f9..0d930f7 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -48,24 +48,29 @@ #define NODEBUG_WEBSOCKETS #endif -#ifdef ESP8266 +#if defined(ESP8266) || defined(ESP32) + #define WEBSOCKETS_MAX_DATA_SIZE (15*1024) #define WEBSOCKETS_USE_BIG_MEM #define GET_FREE_HEAP ESP.getFreeHeap() // moves all Header strings to Flash (~300 Byte) //#define WEBSOCKETS_SAVE_RAM -#else -#ifdef STM32_DEVICE + +#elif defined(STM32_DEVICE) + #define WEBSOCKETS_MAX_DATA_SIZE (15*1024) #define WEBSOCKETS_USE_BIG_MEM #define GET_FREE_HEAP System.freeMemory() + #else + //atmega328p has only 2KB ram! #define WEBSOCKETS_MAX_DATA_SIZE (1024) // moves all Header strings to Flash #define WEBSOCKETS_SAVE_RAM + #endif -#endif + #define WEBSOCKETS_TCP_TIMEOUT (2000) @@ -73,36 +78,46 @@ #define NETWORK_ESP8266 (1) #define NETWORK_W5100 (2) #define NETWORK_ENC28J60 (3) +#define NETWORK_ESP32 (4) // max size of the WS Message Header #define WEBSOCKETS_MAX_HEADER_SIZE (14) -#if !defined(WEBSOCKETS_NETWORK_TYPE) +#if !defined(WEBSOCKETS_NETWORK_TYPE) // 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 + +#elif defined(ESP32) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32 + #else #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 + #endif #endif +// Includes and defined based on Network Type #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) // Note: // No SSL/WSS support for client in Async mode // TLS lib need a sync interface! -#if !defined(ESP8266) && !defined(ESP31B) + +#if defined(ESP8266) +#include +#elif defined(ESP32) +#include +#include +#elif defined(ESP31B) +#include +#else #error "network type ESP8266 ASYNC only possible on the ESP mcu!" #endif -#ifdef ESP8266 -#include -#else -#include -#endif #include #include #define WEBSOCKETS_NETWORK_CLASS AsyncTCPbuffer @@ -140,6 +155,13 @@ #define WEBSOCKETS_NETWORK_CLASS UIPClient #define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + +#include +#include +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + #else #error "no network type selected!" #endif @@ -204,7 +226,7 @@ typedef struct { bool isSocketIO; ///< client for socket.io server -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) bool isSSL; ///< run in ssl mode WiFiClientSecure * ssl; #endif diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index ea31db7..68e24fa 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -42,14 +42,14 @@ WebSocketsClient::~WebSocketsClient() { void WebSocketsClient::begin(const char *host, uint16_t port, const char * url, const char * protocol) { _host = host; _port = port; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) _fingerprint = ""; #endif _client.num = 0; _client.status = WSC_NOT_CONNECTED; _client.tcp = NULL; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) _client.isSSL = false; _client.ssl = NULL; #endif @@ -84,7 +84,7 @@ void WebSocketsClient::begin(String host, uint16_t port, String url, String prot begin(host.c_str(), port, url.c_str(), protocol.c_str()); } -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) void WebSocketsClient::beginSSL(const char *host, uint16_t port, const char * url, const char * fingerprint, const char * protocol) { begin(host, port, url, protocol); _client.isSSL = true; @@ -105,7 +105,7 @@ void WebSocketsClient::beginSocketIO(String host, uint16_t port, String url, Str beginSocketIO(host.c_str(), port, url.c_str(), protocol.c_str()); } -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) void WebSocketsClient::beginSocketIOSSL(const char *host, uint16_t port, const char * url, const char * protocol) { begin(host, port, url, protocol); _client.isSocketIO = true; @@ -129,7 +129,7 @@ void WebSocketsClient::loop(void) { return; } -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) if(_client.isSSL) { DEBUG_WEBSOCKETS("[WS-Client] connect wss...\n"); if(_client.ssl) { @@ -341,7 +341,7 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) { bool event = false; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) if(client->isSSL && client->ssl) { if(client->ssl->connected()) { client->ssl->flush(); @@ -439,7 +439,7 @@ void WebSocketsClient::handleClientData(void) { break; } } -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) delay(0); #endif } diff --git a/src/WebSocketsClient.h b/src/WebSocketsClient.h index ab82e98..b56cff8 100644 --- a/src/WebSocketsClient.h +++ b/src/WebSocketsClient.h @@ -42,7 +42,7 @@ class WebSocketsClient: private WebSockets { void begin(const char *host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); void begin(String host, uint16_t port, String url = "/", String protocol = "arduino"); -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) void beginSSL(const char *host, uint16_t port, const char * url = "/", const char * = "", const char * protocol = "arduino"); void beginSSL(String host, uint16_t port, String url = "/", String fingerprint = "", String protocol = "arduino"); #endif @@ -50,7 +50,7 @@ class WebSocketsClient: private WebSockets { void beginSocketIO(const char *host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); void beginSocketIO(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) void beginSocketIOSSL(const char *host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); void beginSocketIOSSL(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); #endif @@ -89,7 +89,7 @@ class WebSocketsClient: private WebSockets { String _host; uint16_t _port; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) String _fingerprint; #endif WSclient_t _client; diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 0e5795f..1e60f97 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -54,6 +54,8 @@ WebSocketsServer::~WebSocketsServer() { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) _server->close(); +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + _server->end(); #else // TODO how to close server? #endif @@ -77,7 +79,7 @@ void WebSocketsServer::begin(void) { client->num = i; client->status = WSC_NOT_CONNECTED; client->tcp = NULL; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) client->isSSL = false; client->ssl = NULL; #endif @@ -100,6 +102,9 @@ void WebSocketsServer::begin(void) { #ifdef ESP8266 randomSeed(RANDOM_REG32); +#elif defined(ESP32) + #define DR_REG_RNG_BASE 0x3ff75144 + randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); #else // TODO find better seed randomSeed(millis()); @@ -388,7 +393,7 @@ void WebSocketsServer::setAuthorization(const char * auth) { } } -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) /** * get an IP for a client * @param num uint8_t client id @@ -425,7 +430,7 @@ bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) { client->tcp = TCPclient; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) client->isSSL = false; client->tcp->setNoDelay(true); #endif @@ -434,7 +439,7 @@ bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) { client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); #endif client->status = WSC_HEADER; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) IPAddress ip = client->tcp->remoteIP(); DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); #else @@ -498,7 +503,7 @@ void WebSocketsServer::messageReceived(WSclient_t * client, WSopcode_t opcode, u void WebSocketsServer::clientDisconnect(WSclient_t * client) { -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) if(client->isSSL && client->ssl) { if(client->ssl->connected()) { client->ssl->flush(); @@ -584,12 +589,12 @@ bool WebSocketsServer::clientIsConnected(WSclient_t * client) { */ void WebSocketsServer::handleNewClients(void) { -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) while(_server->hasClient()) { #endif bool ok = false; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) // store new connection WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); #else @@ -605,7 +610,7 @@ void WebSocketsServer::handleNewClients(void) { if(!ok) { // no free space to handle client -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) IPAddress ip = tcpClient->remoteIP(); DEBUG_WEBSOCKETS("[WS-Server] no free space new client from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); #else @@ -614,7 +619,7 @@ void WebSocketsServer::handleNewClients(void) { tcpClient->stop(); } -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) delay(0); } #endif diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 7d5a7cd..cd38fd6 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -92,7 +92,7 @@ public: void setAuthorization(const char * user, const char * password); void setAuthorization(const char * auth); -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) IPAddress remoteIP(uint8_t num); #endif diff --git a/src/libb64/cdecode.c b/src/libb64/cdecode.c index 0d86d0e..e135da2 100644 --- a/src/libb64/cdecode.c +++ b/src/libb64/cdecode.c @@ -9,6 +9,10 @@ For details, see http://sourceforge.net/projects/libb64 #include #endif +#if defined(ESP32) +#define CORE_HAS_LIBB64 +#endif + #ifndef CORE_HAS_LIBB64 #include "cdecode_inc.h" @@ -32,9 +36,9 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex const char* codechar = code_in; char* plainchar = plaintext_out; char fragment; - + *plainchar = state_in->plainchar; - + switch (state_in->step) { while (1) diff --git a/src/libb64/cencode.c b/src/libb64/cencode.c index 7367135..afe1463 100644 --- a/src/libb64/cencode.c +++ b/src/libb64/cencode.c @@ -9,6 +9,10 @@ For details, see http://sourceforge.net/projects/libb64 #include #endif +#if defined(ESP32) +#define CORE_HAS_LIBB64 +#endif + #ifndef CORE_HAS_LIBB64 #include "cencode_inc.h" @@ -35,9 +39,9 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, char* codechar = code_out; char result; char fragment; - + result = state_in->result; - + switch (state_in->step) { while (1) @@ -76,7 +80,7 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, *codechar++ = base64_encode_value(result); result = (fragment & 0x03f) >> 0; *codechar++ = base64_encode_value(result); - + ++(state_in->stepcount); if (state_in->stepcount == CHARS_PER_LINE/4) { @@ -92,7 +96,7 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, int base64_encode_blockend(char* code_out, base64_encodestate* state_in) { char* codechar = code_out; - + switch (state_in->step) { case step_B: @@ -108,7 +112,7 @@ int base64_encode_blockend(char* code_out, base64_encodestate* state_in) break; } *codechar++ = 0x00; - + return codechar - code_out; } diff --git a/src/libsha1/libsha1.c b/src/libsha1/libsha1.c index 7ff3846..fcf01c5 100644 --- a/src/libsha1/libsha1.c +++ b/src/libsha1/libsha1.c @@ -18,7 +18,7 @@ A million repetitions of "a" /* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ /* #define SHA1HANDSOFF * Copies data before messing with it. */ -#ifndef ESP8266 +#if !defined(ESP8266) && !defined(ESP32) #define SHA1HANDSOFF diff --git a/src/libsha1/libsha1.h b/src/libsha1/libsha1.h index 1f08d0e..40afa61 100644 --- a/src/libsha1/libsha1.h +++ b/src/libsha1/libsha1.h @@ -5,7 +5,7 @@ By Steve Reid 100% Public Domain */ -#ifndef ESP8266 +#if !defined(ESP8266) && !defined(ESP32) typedef struct { uint32_t state[5]; @@ -18,4 +18,4 @@ void SHA1Init(SHA1_CTX* context); void SHA1Update(SHA1_CTX* context, const unsigned char* data, uint32_t len); void SHA1Final(unsigned char digest[20], SHA1_CTX* context); -#endif \ No newline at end of file +#endif diff --git a/travis/common.sh b/travis/common.sh index 4bcd81b..be959fa 100644 --- a/travis/common.sh +++ b/travis/common.sh @@ -16,9 +16,38 @@ function build_sketches() $arduino --verify $sketch; local result=$? if [ $result -ne 0 ]; then - echo "Build failed ($1)" + echo "Build failed ($sketch) build verbose..." + $arduino --verify --verbose --preserve-temp-files $sketch + result=$? + fi + if [ $result -ne 0 ]; then + echo "Build failed ($1) $sketch" return $result fi done } + +function get_core() +{ + echo Setup core for $1 + + cd $HOME/arduino_ide/hardware + + if [ "$1" = "esp8266" ] ; then + mkdir esp8266com + cd esp8266com + git clone https://github.com/esp8266/Arduino.git esp8266 + cd esp8266/tools + python get.py + fi + + if [ "$1" = "esp32" ] ; then + mkdir espressif + cd espressif + git clone https://github.com/espressif/arduino-esp32.git esp32 + cd esp32/tools + python get.py + fi + +}