From 19e99ebcf9b755998a0d57fb10c36f589aed3357 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sat, 5 May 2018 11:22:31 -0400 Subject: [PATCH 01/12] support ethernet2.h --- .../WebSocketServer_ethernetShield2.ino | 82 +++++++++++ src/WebSockets.cpp | 130 +++++++++++++++--- src/WebSockets.h | 32 ++++- src/WebSocketsClient.cpp | 112 +++++++++++---- src/WebSocketsServer.cpp | 117 +++++++++++++--- src/WebSocketsServer.h | 5 +- 6 files changed, 397 insertions(+), 81 deletions(-) create mode 100644 examples/WebSocketServer/WebSocketServer_ethernetShield2.ino diff --git a/examples/WebSocketServer/WebSocketServer_ethernetShield2.ino b/examples/WebSocketServer/WebSocketServer_ethernetShield2.ino new file mode 100644 index 0000000..9cea53a --- /dev/null +++ b/examples/WebSocketServer/WebSocketServer_ethernetShield2.ino @@ -0,0 +1,82 @@ +#include +#include +#include +#include +/////////#include //downloaded from https://github.com/Yveaux/Arduino_HexDump + +#include +//#include + +#include + +byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF}; +IPAddress ip(192, 168, 0, 110); + +WebSocketsServer webSocket = WebSocketsServer(8081); + +#define USE_SERIAL Serial + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght) { + + switch(type) { + case WStype_DISCONNECTED: + //USE_SERIAL.printf("[%u] Disconnected!\n", num); + USE_SERIAL << num << " Disconnected!" << endl; + 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); + USE_SERIAL << num << " Connected url: " << int(payload) << endl; + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + //USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + USE_SERIAL << num << " get Text: " << int(payload) << endl; + + // 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 lenght: %u\n", num, lenght); + USE_SERIAL << num <<" get binary lenght: " << lenght << endl; + ///////////hexdump(payload, lenght); + + // send message to client + webSocket.sendBIN(num, payload, lenght); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + Ethernet.begin(mac, ip); + +// 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); + } + + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 4ec9a1f..70604f0 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -56,7 +56,11 @@ extern "C" { * @param reasonLen */ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] clientDisconnect code: "); + WS_PRINTLN(code); if(client->status == WSC_CONNECTED && code) { if(reason) { sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen); @@ -83,20 +87,45 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask, bool fin, bool headerToPayload) { if(client->tcp && !client->tcp->connected()) { - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); + //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINTLN("][sendFrame] not Connected!?"); return; } if(client->status != WSC_CONNECTED) { - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); + //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINTLN("][sendFrame] not in WSC_CONNECTED state!?"); return; } - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send massage frame -------\n", client->num); - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, mask, length, headerToPayload); + //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send massage frame -------\n", client->num); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINTLN("][sendFrame] ------- send massage frame -------"); + //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, mask, length, headerToPayload); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][sendFrame] fin: "); + WS_PRINT(fin); + WS_PRINT(" opCode: "); + WS_PRINT(opcode); + WS_PRINT(" mask: "); + WS_PRINT(mask); + WS_PRINT(" length: "); + WS_PRINT(length); + WS_PRINT(" headerToPayload: "); + WS_PRINTLN(headerToPayload); if(opcode == WSop_text) { - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); + //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][sendFrame] text: "); + WS_PRINTLN(reinterpret_cast(payload + (headerToPayload ? 14 : 0)));//<<<------------------------------------------------ } uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; @@ -125,7 +154,10 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay // only for ESP since AVR has less HEAP // try to send data in one TCP package (only if some free Heap is there) if(!headerToPayload && ((length > 0) && (length < 1400)) && (ESP.getFreeHeap() > 6000)) { - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); + //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINTLN("][sendFrame] pack to one TCP package..."); uint8_t * dataPtr = (uint8_t *) malloc(length + WEBSOCKETS_MAX_HEADER_SIZE); if(dataPtr) { memcpy((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length); @@ -227,7 +259,7 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay } } - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%uus).\n", client->num, (micros() - start)); + ////////////DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%uus).\n", client->num, (micros() - start)); #ifdef WEBSOCKETS_USE_BIG_MEM if(useInternBuffer && payloadPtr) { @@ -257,7 +289,10 @@ void WebSockets::handleWebsocket(WSclient_t * client) { uint8_t * payload = NULL; - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINTLN("][handleWebsocket] ------- read massage frame -------"); if(!readWait(client, buffer, 2)) { //timeout @@ -298,11 +333,34 @@ void WebSockets::handleWebsocket(WSclient_t * client) { } } - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, fin, rsv1, rsv2, rsv3, opCode); - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, mask, payloadLen); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, fin, rsv1, rsv2, rsv3, opCode); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] fin: "); + WS_PRINT(fin); + WS_PRINT(" rsv1: "); + WS_PRINT(rsv1); + WS_PRINT(" rsv2: "); + WS_PRINT(rsv2); + WS_PRINT(" rsv3: "); + WS_PRINT(rsv3); + WS_PRINT(" opCode: "); + WS_PRINTLN(opCode); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, mask, payloadLen); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] mask: "); + WS_PRINT(mask); + WS_PRINT(" payloadLen: "); + WS_PRINTLN(payloadLen); if(payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] payload to big! ("); + WS_PRINT(payloadLen); + WS_PRINTLN(")"); clientDisconnect(client, 1009); return; } @@ -320,13 +378,21 @@ void WebSockets::handleWebsocket(WSclient_t * client) { payload = (uint8_t *) malloc(payloadLen + 1); if(!payload) { - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] to less memory to handle payload "); + WS_PRINT(payloadLen); + WS_PRINTLN("!"); clientDisconnect(client, 1011); return; } if(!readWait(client, payload, payloadLen)) { - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINTLN("][handleWebsocket] missing data!"); free(payload); clientDisconnect(client, 1002); return; @@ -344,7 +410,11 @@ void WebSockets::handleWebsocket(WSclient_t * client) { switch(opCode) { case WSop_text: - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] text: "); + WS_PRINTLN(reinterpret_cast(payload));//<<<------------------------------------------------ // no break here! case WSop_binary: messageRecived(client, opCode, payload, payloadLen); @@ -354,7 +424,12 @@ void WebSockets::handleWebsocket(WSclient_t * client) { sendFrame(client, WSop_pong, payload, payloadLen); break; case WSop_pong: - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] get pong ("); + WS_PRINT(reinterpret_cast(payload));//<<<------------------------------------------------ + WS_PRINTLN(")"); break; case WSop_close: { @@ -363,11 +438,19 @@ void WebSockets::handleWebsocket(WSclient_t * client) { reasonCode = payload[0] << 8 | payload[1]; } - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); + //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); + WS_PRINT("[WS]["); + WS_PRINT(client->num); + WS_PRINT("][handleWebsocket] get ask for close. Code: "); + WS_PRINTLN(reasonCode); if(payloadLen > 2) { - DEBUG_WEBSOCKETS(" (%s)\n", (payload+2)); + //DEBUG_WEBSOCKETS(" (%s)\n", (payload+2)); + WS_PRINT(" ("); + WS_PRINT(reinterpret_cast(payload+2));//<<<------------------------------------------------ + WS_PRINTLN(")"); } else { - DEBUG_WEBSOCKETS("\n"); + //DEBUG_WEBSOCKETS("\n"); + WS_PRINTLN(); } clientDisconnect(client, 1000); } @@ -445,17 +528,20 @@ bool WebSockets::readWait(WSclient_t * client, uint8_t *out, size_t n) { while(n > 0) { if(!client->tcp) { - DEBUG_WEBSOCKETS("[readWait] tcp is null!\n"); + //DEBUG_WEBSOCKETS("[readWait] tcp is null!\n"); + WS_PRINTLN("[readWait] tcp is null!"); return false; } if(!client->tcp->connected()) { - DEBUG_WEBSOCKETS("[readWait] not connected!\n"); + //DEBUG_WEBSOCKETS("[readWait] not connected!\n"); + WS_PRINTLN("[readWait] not connected!"); return false; } if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { - DEBUG_WEBSOCKETS("[readWait] receive TIMEOUT!\n"); + //DEBUG_WEBSOCKETS("[readWait] receive TIMEOUT!\n"); + WS_PRINTLN("[readWait] receive TIMEOUT!"); return false; } diff --git a/src/WebSockets.h b/src/WebSockets.h index ffccf80..4c6602b 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -27,13 +27,21 @@ #include -//#define DEBUG_WEBSOCKETS(...) Serial1.printf( __VA_ARGS__ ) - -#ifndef DEBUG_WEBSOCKETS -#define DEBUG_WEBSOCKETS(...) +#define DEBUG_WEBSOCKETS + +#ifdef DEBUG_WEBSOCKETS +#define WS_PRINT(x) Serial.print(x); +#define WS_PRINTLN(x) Serial.println(x); +#else +#define WS_PRINT(x) +#define WS_PRINTLN(x) #define NODEBUG_WEBSOCKETS #endif + + //Unmute to select Ethernet2 sheild library +#define W5500_H + #ifdef ESP8266 #define WEBSOCKETS_MAX_DATA_SIZE (15*1024) #define WEBSOCKETS_USE_BIG_MEM @@ -47,11 +55,14 @@ #define NETWORK_ESP8266 (1) #define NETWORK_W5100 (2) #define NETWORK_ENC28J60 (3) +#define NETWORK_W5500 (4) // select Network type based #ifdef ESP8266 #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 +#elif defined W5500_H +#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5500 #else #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 #endif @@ -80,11 +91,18 @@ #define WEBSOCKETS_NETWORK_CLASS UIPClient #define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) +#include +#include +#include +#include +#define WEBSOCKETS_NETWORK_CLASS EthernetClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer + #else #error "no network type selected!" #endif - typedef enum { WSC_NOT_CONNECTED, WSC_HEADER, @@ -116,11 +134,11 @@ typedef struct { WSclientsStatus_t status; WEBSOCKETS_NETWORK_CLASS * tcp; - +/* #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) bool isSSL; ///< run in ssl mode WiFiClientSecure * ssl; -#endif +#endif*/ String cUrl; ///< http url uint16_t cCode; ///< http code diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index d398aad..db43add 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -93,7 +93,8 @@ void WebSocketsClient::loop(void) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) if(_client.isSSL) { - DEBUG_WEBSOCKETS("[WS-Client] connect wss...\n"); + //DEBUG_WEBSOCKETS("[WS-Client] connect wss...\n"); + WS_PRINTLN("[WS-Client] connect wss..."); if(_client.ssl) { delete _client.ssl; _client.ssl = NULL; @@ -102,7 +103,8 @@ void WebSocketsClient::loop(void) { _client.ssl = new WiFiClientSecure(); _client.tcp = _client.ssl; } else { - DEBUG_WEBSOCKETS("[WS-Client] connect ws...\n"); + //DEBUG_WEBSOCKETS("[WS-Client] connect ws...\n"); + WS_PRINTLN("[WS-Client] connect ws..."); if(_client.tcp) { delete _client.tcp; _client.tcp = NULL; @@ -114,12 +116,18 @@ void WebSocketsClient::loop(void) { #endif if(!_client.tcp) { - DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + //DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + WS_PRINTLN("[WS-Client] creating Network class failed!"); return; } if(_client.tcp->connect(_host.c_str(), _port)) { - DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); + //DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); + WS_PRINT("[WS-Client] connected to "); + WS_PRINT(_host.c_str()); + WS_PRINT(":"); + WS_PRINT(_port); + WS_PRINTLN("."); _client.status = WSC_HEADER; @@ -131,7 +139,8 @@ void WebSocketsClient::loop(void) { if(_client.isSSL && _fingerprint.length()) { if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { - DEBUG_WEBSOCKETS("[WS-Client] certificate mismatch\n"); + //DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!\n"); + WS_PRINTLN("[WS-Client] creating Network class failed!"); WebSockets::clientDisconnect(&_client, 1000); return; } @@ -142,7 +151,12 @@ void WebSocketsClient::loop(void) { sendHeader(&_client); } else { - DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); + //DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); + WS_PRINT("[WS-Client] connection to "); + WS_PRINT(_host.c_str()); + WS_PRINT(":"); + WS_PRINT(_port); + WS_PRINTLN(" Faild"); delay(10); //some litle delay to not flood the server } } else { @@ -281,7 +295,8 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) { client->status = WSC_NOT_CONNECTED; - DEBUG_WEBSOCKETS("[WS-Client] client disconnected.\n"); + //DEBUG_WEBSOCKETS("[WS-Client] client disconnected.\n"); + WS_PRINTLN("[WS-Client] client disconnected."); runCbEvent(WStype_DISCONNECTED, NULL, 0); @@ -305,7 +320,8 @@ bool WebSocketsClient::clientIsConnected(WSclient_t * client) { } else { // client lost if(client->status != WSC_NOT_CONNECTED) { - DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); + //DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); + WS_PRINTLN("[WS-Client] connection lost."); // do cleanup clientDisconnect(client); } @@ -348,7 +364,8 @@ void WebSocketsClient::handleClientData(void) { */ void WebSocketsClient::sendHeader(WSclient_t * client) { - DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header...\n"); + //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header...\n"); + WS_PRINTLN("[WS-Client][sendHeader] sending header..."); uint8_t randomKey[16] = { 0 }; @@ -379,7 +396,10 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { client->tcp->write(handshake.c_str(), handshake.length()); - DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%uus).\n", (micros() - start)); + //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%uus).\n", (micros() - start)); + WS_PRINT("[WS-Client][sendHeader] sending header... Done ("); + WS_PRINT((micros() - start)); + WS_PRINTLN("us)."); } @@ -393,7 +413,9 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { headerLine.trim(); // remove \r if(headerLine.length() > 0) { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine.c_str()); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine.c_str()); + WS_PRINT("[WS-Client][handleHeader] RX: "); + WS_PRINTLN(headerLine.c_str()); if(headerLine.startsWith("HTTP/1.")) { // "HTTP/1.1 101 Switching Protocols" @@ -421,24 +443,48 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { client->cVersion = headerValue.toInt(); } } else { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + WS_PRINT("[WS-Client][handleHeader] Header error ("); + WS_PRINT(headerLine.c_str()); + WS_PRINTLN(")"); } } else { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header read fin.\n"); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Client settings:\n"); - - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cURL: %s\n", client->cUrl.c_str()); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cKey: %s\n", client->cKey.c_str()); - - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Server header:\n"); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cCode: %d\n", client->cCode); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsUpgrade: %d\n", client->cIsUpgrade); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsWebsocket: %d\n", client->cIsWebsocket); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cAccept: %s\n", client->cAccept.c_str()); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cProtocol: %s\n", client->cProtocol.c_str()); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cExtensions: %s\n", client->cExtensions.c_str()); - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cVersion: %d\n", client->cVersion); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header read fin.\n"); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Client settings:\n"); + WS_PRINTLN("[WS-Client][handleHeader] Header read fin."); + WS_PRINTLN("[WS-Client][handleHeader] Client settings:"); + + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cURL: %s\n", client->cUrl.c_str()); + WS_PRINT("[WS-Client][handleHeader] - cURL: "); + WS_PRINTLN(client->cUrl.c_str()); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cKey: %s\n", client->cKey.c_str()); + WS_PRINTLN("[WS-Client][handleHeader] - cKey: "); + WS_PRINTLN(client->cKey.c_str()); + + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Server header:\n"); + WS_PRINTLN("[WS-Client][handleHeader] Server header:"); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cCode: %d\n", client->cCode); + WS_PRINT("[WS-Client][handleHeader] - cCode: "); + WS_PRINTLN(client->cCode); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsUpgrade: %d\n", client->cIsUpgrade); + WS_PRINT("[WS-Client][handleHeader] - cIsUpgrade: "); + WS_PRINTLN(client->cIsUpgrade); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsWebsocket: %d\n", client->cIsWebsocket); + WS_PRINT("[WS-Client][handleHeader] - cIsWebsocket: "); + WS_PRINTLN(client->cIsWebsocket); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cAccept: %s\n", client->cAccept.c_str()); + WS_PRINT("[WS-Client][handleHeader] - cAccept: "); + WS_PRINTLN(client->cAccept.c_str()); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cProtocol: %s\n", client->cProtocol.c_str()); + WS_PRINT("[WS-Client][handleHeader] - cProtocol: "); + WS_PRINTLN(client->cProtocol.c_str()); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cExtensions: %s\n", client->cExtensions.c_str()); + WS_PRINT("[WS-Client][handleHeader] - cExtensions: "); + WS_PRINTLN(client->cExtensions.c_str()); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cVersion: %d\n", client->cVersion); + WS_PRINT("[WS-Client][handleHeader] - cVersion: "); + WS_PRINTLN(client->cVersion); bool ok = (client->cIsUpgrade && client->cIsWebsocket); @@ -451,7 +497,10 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { // todo handle login default: ///< Server dont unterstand requrst ok = false; - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); + WS_PRINT("[WS-Client][handleHeader] serverCode is not 101 ("); + WS_PRINT(client->cCode); + WS_PRINTLN(")"); clientDisconnect(client); break; } @@ -464,7 +513,8 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { // generate Sec-WebSocket-Accept key for check String sKey = acceptKey(client->cKey); if(sKey != client->cAccept) { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong\n"); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong\n"); + WS_PRINTLN("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong"); ok = false; } } @@ -472,14 +522,16 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { if(ok) { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Websocket connection init done.\n"); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Websocket connection init done.\n"); + WS_PRINTLN("[WS-Client][handleHeader] Websocket connection init done."); client->status = WSC_CONNECTED; runCbEvent(WStype_CONNECTED, (uint8_t *) client->cUrl.c_str(), client->cUrl.length()); } else { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] no Websocket connection close.\n"); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] no Websocket connection close.\n"); + WS_PRINTLN("[WS-Client][handleHeader] no Websocket connection close."); client->tcp->write("This is a webSocket client!"); clientDisconnect(client); } diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 5ec4eca..9a6d856 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -75,7 +75,8 @@ void WebSocketsServer::begin(void) { _server->begin(); - DEBUG_WEBSOCKETS("[WS-Server] Server Started.\n"); + //DEBUG_WEBSOCKETS("[WS-Server] Server Started.\n"); + WS_PRINTLN("[WS-Server] Server Started."); } /** @@ -322,7 +323,10 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { client->status = WSC_NOT_CONNECTED; - DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); + //DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINTLN("] client disconnected."); runCbEvent(client->num, WStype_DISCONNECTED, NULL, 0); @@ -346,7 +350,10 @@ bool WebSocketsServer::clientIsConnected(WSclient_t * client) { } else { // client lost if(client->status != WSC_NOT_CONNECTED) { - DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); + //DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINTLN("] client connection lost."); // do cleanup clientDisconnect(client); } @@ -382,7 +389,8 @@ void WebSocketsServer::handleNewClients(void) { client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available()); #endif if(!client->tcp) { - DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + //DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + WS_PRINTLN("[WS-Client] creating Network class failed!"); return; } @@ -395,9 +403,22 @@ void WebSocketsServer::handleNewClients(void) { client->status = WSC_HEADER; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) 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]); + //DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("] new client from "); + WS_PRINT(ip[0]); + WS_PRINT("."); + WS_PRINT(ip[1]); + WS_PRINT("."); + WS_PRINT(ip[2]); + WS_PRINT("."); + WS_PRINTLN(ip[3]); #else - DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); + //DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINTLN("] new client"); #endif ok = true; break; @@ -409,9 +430,18 @@ void WebSocketsServer::handleNewClients(void) { WEBSOCKETS_NETWORK_CLASS tcpClient = _server->available(); #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) IPAddress ip = client->tcp->remoteIP(); - DEBUG_WEBSOCKETS("[WS-Server] no free space new client from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); + //DEBUG_WEBSOCKETS("[WS-Server] no free space new client from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); + WS_PRINT("[WS-Server] no free space new client from "); + WS_PRINT(ip[0]); + WS_PRINT("."); + WS_PRINT(ip[1]); + WS_PRINT("."); + WS_PRINT(ip[2]); + WS_PRINT("."); + WS_PRINTLN(ip[3]); #else - DEBUG_WEBSOCKETS("[WS-Server] no free space new client\n"); + //DEBUG_WEBSOCKETS("[WS-Server] no free space new client\n"); + WS_PRINTLN("[WS-Server] no free space new client"); #endif tcpClient.stop(); } @@ -465,7 +495,11 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { headerLine.trim(); // remove \r if(headerLine.length() > 0) { - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] RX: "); + WS_PRINTLN(headerLine.c_str()); // websocket request starts allways with GET see rfc6455 if(headerLine.startsWith("GET ")) { @@ -494,19 +528,53 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { client->cExtensions = headerValue; } } else { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + WS_PRINT("[WS-Client][handleHeader] Header error ("); + WS_PRINT(headerLine.c_str()); + WS_PRINTLN(")"); } } else { - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); - - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINTLN("][handleHeader] Header read fin."); + + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - cURL: "); + WS_PRINTLN(client->cUrl.c_str()); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - cIsUpgrade: "); + WS_PRINTLN(client->cIsUpgrade); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - cIsWebsocket: "); + WS_PRINTLN(client->cIsWebsocket); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - cKey: "); + WS_PRINTLN(client->cKey.c_str()); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - cProtocol: "); + WS_PRINTLN(client->cProtocol.c_str()); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - cExtensions: "); + WS_PRINTLN(client->cExtensions.c_str()); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - cVersion: "); + WS_PRINTLN(client->cVersion); bool ok = (client->cIsUpgrade && client->cIsWebsocket); @@ -524,12 +592,19 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { if(ok) { - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINTLN("][handleHeader] Websocket connection incomming."); // generate Sec-WebSocket-Accept key String sKey = acceptKey(client->cKey); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINT("][handleHeader] - sKey: "); + WS_PRINTLN(sKey.c_str()); client->status = WSC_CONNECTED; diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index ebc76b2..4b7af63 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -97,7 +97,10 @@ class WebSocketsServer: private WebSockets { * @param client WSclient_t * ptr to the client struct */ virtual void handleNonWebsocketConnection(WSclient_t * client) { - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client->num); + WS_PRINTLN("][handleHeader] no Websocket connection close."); client->tcp->write("HTTP/1.1 400 Bad Request\r\n" "Server: arduino-WebSocket-Server\r\n" "Content-Type: text/plain\r\n" From d815a52c0d27c97373789fea7ec3a00ae55eef65 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sun, 6 May 2018 13:13:33 -0400 Subject: [PATCH 02/12] first working --- src/WebSockets.h | 3 +- src/WebSocketsServer.cpp | 151 +++++++++++++++++++++++++++++++++------ src/WebSocketsServer.h | 7 +- 3 files changed, 138 insertions(+), 23 deletions(-) diff --git a/src/WebSockets.h b/src/WebSockets.h index 4c6602b..134a17a 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -27,7 +27,7 @@ #include -#define DEBUG_WEBSOCKETS +//#define DEBUG_WEBSOCKETS #ifdef DEBUG_WEBSOCKETS #define WS_PRINT(x) Serial.print(x); @@ -134,6 +134,7 @@ typedef struct { WSclientsStatus_t status; WEBSOCKETS_NETWORK_CLASS * tcp; + WEBSOCKETS_NETWORK_CLASS _client; /* #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) bool isSSL; ///< run in ssl mode diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 9a6d856..39993ed 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -83,8 +83,32 @@ void WebSocketsServer::begin(void) { * called in arduino loop */ void WebSocketsServer::loop(void) { - handleNewClients(); - handleClientData(); + //check if client, if it is a new client + WSclient_t wsClient; + wsClient._client = _server->available(); + + if (wsClient._client) { + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + if( _clients[i]._client == wsClient._client ) { //not a new client, handle data + wsClient.num = i; + handleClientData(_clients[i]); + return; + } + } + //if you got to that point, it is a new client + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + if (!_clients[i]._client) { //if emty slot, assing new client then handle it. + _clients[i] = wsClient; + _clients[i].tcp = &_clients[i]._client; + handleNewClients(_clients[i]); + return; + } + + } + wsClient._client.stop(); //close connection is no free spot + WS_PRINTLN("[WS-Server] No free socket, connection close"); + } + //WS_PRINTLN("[WS-Server] No Client"); } /** @@ -110,9 +134,9 @@ void WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length, bo length = strlen((const char *) payload); } WSclient_t * client = &_clients[num]; - if(clientIsConnected(client)) { + //if(clientIsConnected(client)) { sendFrame(client, WSop_text, payload, length, false, true, headerToPayload); - } + //} } void WebSocketsServer::sendTXT(uint8_t num, const uint8_t * payload, size_t length) { @@ -340,16 +364,19 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { bool WebSocketsServer::clientIsConnected(WSclient_t * client) { if(!client->tcp) { + WS_PRINTLN("no tcp"); return false; } if(client->tcp->connected()) { if(client->status != WSC_NOT_CONNECTED) { + WS_PRINTLN("no connection"); return true; } } else { // client lost if(client->status != WSC_NOT_CONNECTED) { + WS_PRINTLN("other if"); //DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client->num); @@ -367,15 +394,98 @@ bool WebSocketsServer::clientIsConnected(WSclient_t * client) { return false; } +bool WebSocketsServer::clientIsConnected2(WSclient_t & client) { + + if(!client._client) { + return false; + } + + if(client._client.connected()) { + if(client.status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client.status != WSC_NOT_CONNECTED) { + //DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client.num); + WS_PRINTLN("] client connection lost."); + // do cleanup + clientDisconnect(&client); + } + } + + if(client._client) { + // do cleanup + clientDisconnect(&client); + } + + return false; +} + /** * Handle incomming Connection Request */ + +void WebSocketsServer::handleNewClients(WSclient_t & client) { + bool ok = false; +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) //not shure for ESP8266 + //while(_server->hasClient()) { ///<<----this conditionnal while make code not compile on arduino +#endif + if(!clientIsConnected2(client)) { + WS_PRINTLN("fail to make new connection"); + return; + } + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + client.isSSL = false; + client.tcp->setNoDelay(true); +#endif + // set Timeout for readBytesUntil and readStringUntil + client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); + client.status = WSC_HEADER; +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + 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]); + WS_PRINT("[WS-Server]["); + WS_PRINT(client.num); + WS_PRINT("] new client from "); + WS_PRINT(ip[0]); + WS_PRINT("."); + WS_PRINT(ip[1]); + WS_PRINT("."); + WS_PRINT(ip[2]); + WS_PRINT("."); + WS_PRINTLN(ip[3]); +#else + //------------->>>>>>to debug //DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); + WS_PRINT("[WS-Server]["); + WS_PRINT(client.num); + WS_PRINTLN("] new client"); +#endif + + ok = true; + +#ifdef ESP8266 + delay(0); +#endif +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + +#endif + +} + + + + +/* void WebSocketsServer::handleNewClients(void) { WSclient_t * client; + bool ok = false; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) while(_server->hasClient()) { -#endif - bool ok = false; +#endif // search free list entry for client for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { client = &_clients[i]; @@ -415,7 +525,7 @@ void WebSocketsServer::handleNewClients(void) { WS_PRINT("."); WS_PRINTLN(ip[3]); #else - //DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); + //------------->>>>>>to debug //DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client->num); WS_PRINTLN("] new client"); @@ -453,28 +563,29 @@ void WebSocketsServer::handleNewClients(void) { } #endif } - +*/ /** * Handel incomming data from Client */ -void WebSocketsServer::handleClientData(void) { - - WSclient_t * client; - for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; - if(clientIsConnected(client)) { - int len = client->tcp->available(); +//void WebSocketsServer::handleClientData(void) //old version +void WebSocketsServer::handleClientData(WSclient_t & client) { + + //WSclient_t * client; + //for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + //client.tcp = _clients[i].tcp; + if(clientIsConnected(&client)) { + int len = client.tcp->available(); if(len > 0) { - switch(client->status) { + switch(client.status) { case WSC_HEADER: - handleHeader(client); + handleHeader(&client); break; case WSC_CONNECTED: - WebSockets::handleWebsocket(client); + WebSockets::handleWebsocket(&client); break; default: - WebSockets::clientDisconnect(client, 1002); + WebSockets::clientDisconnect(&client, 1002); break; } } @@ -482,7 +593,7 @@ void WebSocketsServer::handleClientData(void) { #ifdef ESP8266 delay(0); #endif - } + //} } /** diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 4b7af63..35861af 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -85,9 +85,12 @@ class WebSocketsServer: private WebSockets { void clientDisconnect(WSclient_t * client); bool clientIsConnected(WSclient_t * client); + bool clientIsConnected2(WSclient_t & client); - void handleNewClients(void); - void handleClientData(void); + //void handleNewClients(void); + void handleNewClients(WSclient_t & client); + //void handleClientData(void); + void handleClientData(WSclient_t & client); void handleHeader(WSclient_t * client); From fcd88f66e424186965d83902bfae46c6bbb51988 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sat, 12 May 2018 07:22:07 -0400 Subject: [PATCH 03/12] fix client num + edit example --- examples/WebSocketServer/WebSocketServer.ino | 120 ++++++++----------- src/WebSocketsServer.cpp | 8 +- src/WebSocketsServer.h | 9 +- 3 files changed, 58 insertions(+), 79 deletions(-) diff --git a/examples/WebSocketServer/WebSocketServer.ino b/examples/WebSocketServer/WebSocketServer.ino index 795d9a6..3ac7216 100644 --- a/examples/WebSocketServer/WebSocketServer.ino +++ b/examples/WebSocketServer/WebSocketServer.ino @@ -1,86 +1,60 @@ -/* - * WebSocketServer.ino - * - * Created on: 22.05.2015 - * - */ - -#include - -#include -#include +#include #include -#include +#include -ESP8266WiFiMulti WiFiMulti; +#define USE_SERIAL Serial +byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF}; +IPAddress ip(192, 168, 0, 110); -WebSocketsServer webSocket = WebSocketsServer(81); - -#define USE_SERIAL Serial1 +WebSocketsServer webSocket = WebSocketsServer(8081); void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght) { - 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 lenght: %u\n", num, lenght); - hexdump(payload, lenght); - - // send message to client - // webSocket.sendBIN(num, payload, lenght); - break; - } - + switch (type) { + case WStype_DISCONNECTED: + USE_SERIAL << num << " Disconnected!" << endl; + break; + case WStype_CONNECTED: + { + //IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL << num << " Connected url: " << (char*)payload << endl; + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL << num << " get Text: " << (char*)payload << endl; + + // send message to client + webSocket.sendTXT(num, "message here"); + + // send data to all connected clients + webSocket.broadcastTXT("broadcast message here"); + break; + case WStype_BIN: + USE_SERIAL << num << " get binary lenght: "; + + // send message to client + webSocket.sendBIN(num, payload, lenght); + 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); + USE_SERIAL.begin(115200); + Ethernet.begin(mac, ip); + USE_SERIAL.println("\n\n"); + USE_SERIAL.println(Ethernet.localIP()); + + for (uint8_t t = 4; t > 0; t--) { + USE_SERIAL.flush(); + delay(1000); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); } void loop() { - webSocket.loop(); + webSocket.loop(); } - diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 39993ed..9e76092 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -90,7 +90,6 @@ void WebSocketsServer::loop(void) { if (wsClient._client) { for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { if( _clients[i]._client == wsClient._client ) { //not a new client, handle data - wsClient.num = i; handleClientData(_clients[i]); return; } @@ -98,6 +97,7 @@ void WebSocketsServer::loop(void) { //if you got to that point, it is a new client for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { if (!_clients[i]._client) { //if emty slot, assing new client then handle it. + wsClient.num = i; _clients[i] = wsClient; _clients[i].tcp = &_clients[i]._client; handleNewClients(_clients[i]); @@ -323,7 +323,7 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { client->ssl->flush(); client->ssl->stop(); } - delete client->ssl; + //delete client->ssl; client->ssl = NULL; client->tcp = NULL; } @@ -334,7 +334,7 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { client->tcp->flush(); client->tcp->stop(); } - delete client->tcp; + //delete client->tcp; client->tcp = NULL; } @@ -353,7 +353,7 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { WS_PRINTLN("] client disconnected."); runCbEvent(client->num, WStype_DISCONNECTED, NULL, 0); - + client->num = WEBSOCKETS_SERVER_CLIENT_MAX; } /** diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 35861af..3b66a1d 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -28,8 +28,13 @@ #include #include "WebSockets.h" -#define WEBSOCKETS_SERVER_CLIENT_MAX (5) - +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) + #define WEBSOCKETS_SERVER_CLIENT_MAX (8) +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) + #define WEBSOCKETS_SERVER_CLIENT_MAX (4) +#else + #define WEBSOCKETS_SERVER_CLIENT_MAX (5) +#endif From 25d329cd8d79d16cc84147c4d8857bcea730355a Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sat, 12 May 2018 11:08:20 -0400 Subject: [PATCH 04/12] move server pointer semantic to reference --- src/WebSockets.cpp | 2 +- src/WebSockets.h | 5 +- src/WebSocketsClient.cpp | 2 +- src/WebSocketsClient.h | 2 +- src/WebSocketsServer.cpp | 363 +++++++++++++-------------------------- src/WebSocketsServer.h | 20 +-- 6 files changed, 137 insertions(+), 257 deletions(-) diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 70604f0..32bb956 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -417,7 +417,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { WS_PRINTLN(reinterpret_cast(payload));//<<<------------------------------------------------ // no break here! case WSop_binary: - messageRecived(client, opCode, payload, payloadLen); + messageReceived(client, opCode, payload, payloadLen); break; case WSop_ping: // send pong back diff --git a/src/WebSockets.h b/src/WebSockets.h index 134a17a..c271091 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -158,9 +158,12 @@ typedef struct { class WebSockets { protected: virtual void clientDisconnect(WSclient_t * client); + virtual void clientDisconnect(WSclient_t & client); virtual bool clientIsConnected(WSclient_t * client); + virtual bool clientIsConnected(WSclient_t & client); - virtual void messageRecived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length); + virtual void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length); + virtual void messageReceived(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length); void clientDisconnect(WSclient_t * client, uint16_t code, char * reason = NULL, size_t reasonLen = 0); void sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload = NULL, size_t length = 0, bool mask = false, bool fin = true, bool headerToPayload = false); diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index db43add..1ffb569 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -242,7 +242,7 @@ void WebSocketsClient::disconnect(void) { * @param payload uint8_t * * @param lenght size_t */ -void WebSocketsClient::messageRecived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t lenght) { +void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t lenght) { WStype_t type = WStype_ERROR; switch(opcode) { diff --git a/src/WebSocketsClient.h b/src/WebSocketsClient.h index 6a2c60e..71e053b 100644 --- a/src/WebSocketsClient.h +++ b/src/WebSocketsClient.h @@ -70,7 +70,7 @@ class WebSocketsClient: private WebSockets { WebSocketClientEvent _cbEvent; - void messageRecived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length); + void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length); void clientDisconnect(WSclient_t * client); bool clientIsConnected(WSclient_t * client); diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 9e76092..865219b 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -44,26 +44,27 @@ WebSocketsServer::~WebSocketsServer() { * calles to init the Websockets server */ void WebSocketsServer::begin(void) { - WSclient_t * client; + //WSclient_t & client; // init client storage for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; + + WSclient_t & client = _clients[i]; - client->num = i; - client->status = WSC_NOT_CONNECTED; - client->tcp = NULL; + client.num = WEBSOCKETS_SERVER_CLIENT_MAX; //if MAX -> means unconnected + client.status = WSC_NOT_CONNECTED; + client.tcp = NULL; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - client->isSSL = false; - client->ssl = NULL; + client.isSSL = false; + client.ssl = NULL; #endif - client->cUrl = ""; - client->cCode = 0; - client->cKey = ""; - client->cProtocol = ""; - client->cVersion = 0; - client->cIsUpgrade = false; - client->cIsWebsocket = false; + client.cUrl = ""; + client.cCode = 0; + client.cKey = ""; + client.cProtocol = ""; + client.cVersion = 0; + client.cIsUpgrade = false; + client.cIsWebsocket = false; } #ifdef ESP8266 @@ -133,10 +134,10 @@ void WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length, bo if(length == 0) { length = strlen((const char *) payload); } - WSclient_t * client = &_clients[num]; - //if(clientIsConnected(client)) { - sendFrame(client, WSop_text, payload, length, false, true, headerToPayload); - //} + WSclient_t & client = _clients[num]; + if(clientIsConnected(client)) { + sendFrame(&client, WSop_text, payload, length, false, true, headerToPayload); + } } void WebSocketsServer::sendTXT(uint8_t num, const uint8_t * payload, size_t length) { @@ -162,15 +163,14 @@ void WebSocketsServer::sendTXT(uint8_t num, String payload) { * @param headerToPayload bool (see sendFrame for more details) */ void WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length, bool headerToPayload) { - WSclient_t * client; if(length == 0) { length = strlen((const char *) payload); } for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; + WSclient_t & client = _clients[i]; if(clientIsConnected(client)) { - sendFrame(client, WSop_text, payload, length, false, true, headerToPayload); + sendFrame(&client, WSop_text, payload, length, false, true, headerToPayload); } #ifdef ESP8266 delay(0); @@ -205,9 +205,9 @@ void WebSocketsServer::sendBIN(uint8_t num, uint8_t * payload, size_t length, bo if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { return; } - WSclient_t * client = &_clients[num]; + WSclient_t & client = _clients[num]; if(clientIsConnected(client)) { - sendFrame(client, WSop_binary, payload, length, false, true, headerToPayload); + sendFrame(&client, WSop_binary, payload, length, false, true, headerToPayload); } } @@ -222,11 +222,10 @@ void WebSocketsServer::sendBIN(uint8_t num, const uint8_t * payload, size_t leng * @param headerToPayload bool (see sendFrame for more details) */ void WebSocketsServer::broadcastBIN(uint8_t * payload, size_t length, bool headerToPayload) { - WSclient_t * client; for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; + WSclient_t & client = _clients[i]; if(clientIsConnected(client)) { - sendFrame(client, WSop_binary, payload, length, false, true, headerToPayload); + sendFrame(&client, WSop_binary, payload, length, false, true, headerToPayload); } #ifdef ESP8266 delay(0); @@ -244,9 +243,9 @@ void WebSocketsServer::broadcastBIN(const uint8_t * payload, size_t length) { void WebSocketsServer::disconnect(void) { WSclient_t * client; for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; + WSclient_t & client = _clients[i]; if(clientIsConnected(client)) { - WebSockets::clientDisconnect(client, 1000); + WebSockets::clientDisconnect(&client, 1000); } } } @@ -259,9 +258,9 @@ void WebSocketsServer::disconnect(uint8_t num) { if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { return; } - WSclient_t * client = &_clients[num]; + WSclient_t & client = _clients[num]; if(clientIsConnected(client)) { - WebSockets::clientDisconnect(client, 1000); + WebSockets::clientDisconnect(&client, 1000); } } @@ -274,7 +273,7 @@ void WebSocketsServer::disconnect(uint8_t num) { IPAddress WebSocketsServer::remoteIP(uint8_t num) { if(num < WEBSOCKETS_SERVER_CLIENT_MAX) { WSclient_t * client = &_clients[num]; - if(clientIsConnected(client)) { + if(clientIsConnected(*client)) { return client->tcp->remoteIP(); } } @@ -294,7 +293,8 @@ IPAddress WebSocketsServer::remoteIP(uint8_t num) { * @param payload uint8_t * * @param lenght size_t */ -void WebSocketsServer::messageRecived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t lenght) { + +void WebSocketsServer::messageReceived(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t lenght) { WStype_t type = WStype_ERROR; switch(opcode) { @@ -306,54 +306,61 @@ void WebSocketsServer::messageRecived(WSclient_t * client, WSopcode_t opcode, ui break; } - runCbEvent(client->num, type, payload, lenght); - + runCbEvent(client.num, type, payload, lenght); } - /** * Disconnect an client * @param client WSclient_t * ptr to the client struct */ -void WebSocketsServer::clientDisconnect(WSclient_t * client) { + +void WebSocketsServer::clientDisconnect(WSclient_t & client) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - if(client->isSSL && client->ssl) { - if(client->ssl->connected()) { - client->ssl->flush(); - client->ssl->stop(); + if(client.isSSL && client.ssl) { + if(client.ssl->connected()) { + client.ssl->flush(); + client.ssl->stop(); } - //delete client->ssl; - client->ssl = NULL; - client->tcp = NULL; + delete client->ssl; + client.ssl = NULL; + client.tcp = NULL; } #endif - if(client->tcp) { - if(client->tcp->connected()) { - client->tcp->flush(); - client->tcp->stop(); +/* if(client.tcp) { + if(client.tcp->connected()) { + client.tcp->flush(); + client.tcp->stop(); + } + //delete client->tcp; + client.tcp = NULL; + }*/ + if(client._client) { + if(client._client.connected()) { + client._client.flush(); + client._client.stop(); } //delete client->tcp; - client->tcp = NULL; + client.tcp = NULL; } - client->cUrl = ""; - client->cKey = ""; - client->cProtocol = ""; - client->cVersion = 0; - client->cIsUpgrade = false; - client->cIsWebsocket = false; + client.cUrl = ""; + client.cKey = ""; + client.cProtocol = ""; + client.cVersion = 0; + client.cIsUpgrade = false; + client.cIsWebsocket = false; - client->status = WSC_NOT_CONNECTED; + client.status = WSC_NOT_CONNECTED; //DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("] client disconnected."); - runCbEvent(client->num, WStype_DISCONNECTED, NULL, 0); - client->num = WEBSOCKETS_SERVER_CLIENT_MAX; + runCbEvent(client.num, WStype_DISCONNECTED, NULL, 0); + client.num = WEBSOCKETS_SERVER_CLIENT_MAX; } /** @@ -361,44 +368,10 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { * @param client WSclient_t * ptr to the client struct * @return true = conneted */ -bool WebSocketsServer::clientIsConnected(WSclient_t * client) { - if(!client->tcp) { - WS_PRINTLN("no tcp"); - return false; - } - - if(client->tcp->connected()) { - if(client->status != WSC_NOT_CONNECTED) { - WS_PRINTLN("no connection"); - return true; - } - } else { - // client lost - if(client->status != WSC_NOT_CONNECTED) { - WS_PRINTLN("other if"); - //DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); - WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); - WS_PRINTLN("] client connection lost."); - // do cleanup - clientDisconnect(client); - } - } - - if(client->tcp) { - // do cleanup - clientDisconnect(client); - } - - return false; -} - -bool WebSocketsServer::clientIsConnected2(WSclient_t & client) { - - if(!client._client) { - return false; - } +bool WebSocketsServer::clientIsConnected(WSclient_t & client) { + if (client.num >= WEBSOCKETS_SERVER_CLIENT_MAX) return false; + if (!client._client) return false; if(client._client.connected()) { if(client.status != WSC_NOT_CONNECTED) { @@ -412,13 +385,13 @@ bool WebSocketsServer::clientIsConnected2(WSclient_t & client) { WS_PRINT(client.num); WS_PRINTLN("] client connection lost."); // do cleanup - clientDisconnect(&client); + clientDisconnect(client); } } if(client._client) { // do cleanup - clientDisconnect(&client); + clientDisconnect(client); } return false; @@ -433,20 +406,20 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) //not shure for ESP8266 //while(_server->hasClient()) { ///<<----this conditionnal while make code not compile on arduino #endif - if(!clientIsConnected2(client)) { + if(!clientIsConnected(client)) { WS_PRINTLN("fail to make new connection"); return; } #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) client.isSSL = false; - client.tcp->setNoDelay(true); + client._client.setNoDelay(true); #endif // set Timeout for readBytesUntil and readStringUntil - client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); + client._client.setTimeout(WEBSOCKETS_TCP_TIMEOUT); client.status = WSC_HEADER; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - IPAddress ip = client.tcp->remoteIP(); + IPAddress ip = client._client.remoteIP(); //DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); @@ -477,109 +450,15 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { } - - -/* -void WebSocketsServer::handleNewClients(void) { - WSclient_t * client; - bool ok = false; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - while(_server->hasClient()) { -#endif - // search free list entry for client - for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; - - // state is not connected or tcp connection is lost - if(!clientIsConnected(client)) { -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - // store new connection - client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available()); -#else - client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available()); -#endif - if(!client->tcp) { - //DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); - WS_PRINTLN("[WS-Client] creating Network class failed!"); - return; - } - -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - client->isSSL = false; - client->tcp->setNoDelay(true); -#endif - // set Timeout for readBytesUntil and readStringUntil - client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); - client->status = WSC_HEADER; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - 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]); - WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); - WS_PRINT("] new client from "); - WS_PRINT(ip[0]); - WS_PRINT("."); - WS_PRINT(ip[1]); - WS_PRINT("."); - WS_PRINT(ip[2]); - WS_PRINT("."); - WS_PRINTLN(ip[3]); -#else - //------------->>>>>>to debug //DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); - WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); - WS_PRINTLN("] new client"); -#endif - ok = true; - break; - } - } - - if(!ok) { - // no free space to handle client - WEBSOCKETS_NETWORK_CLASS tcpClient = _server->available(); -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - IPAddress ip = client->tcp->remoteIP(); - //DEBUG_WEBSOCKETS("[WS-Server] no free space new client from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); - WS_PRINT("[WS-Server] no free space new client from "); - WS_PRINT(ip[0]); - WS_PRINT("."); - WS_PRINT(ip[1]); - WS_PRINT("."); - WS_PRINT(ip[2]); - WS_PRINT("."); - WS_PRINTLN(ip[3]); -#else - //DEBUG_WEBSOCKETS("[WS-Server] no free space new client\n"); - WS_PRINTLN("[WS-Server] no free space new client"); -#endif - tcpClient.stop(); - } - -#ifdef ESP8266 - delay(0); -#endif -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - } -#endif -} -*/ -/** - * Handel incomming data from Client - */ -//void WebSocketsServer::handleClientData(void) //old version void WebSocketsServer::handleClientData(WSclient_t & client) { - - //WSclient_t * client; - //for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - //client.tcp = _clients[i].tcp; - if(clientIsConnected(&client)) { - int len = client.tcp->available(); + if(clientIsConnected(client)) { + //int len = client.tcp->available(); + int len = client._client.available(); if(len > 0) { switch(client.status) { case WSC_HEADER: - handleHeader(&client); + handleHeader(client); break; case WSC_CONNECTED: WebSockets::handleWebsocket(&client); @@ -593,50 +472,49 @@ void WebSocketsServer::handleClientData(WSclient_t & client) { #ifdef ESP8266 delay(0); #endif - //} } /** * handle the WebSocket header reading * @param client WSclient_t * ptr to the client struct */ -void WebSocketsServer::handleHeader(WSclient_t * client) { +void WebSocketsServer::handleHeader(WSclient_t & client) { - String headerLine = client->tcp->readStringUntil('\n'); + String headerLine = client._client.readStringUntil('\n'); headerLine.trim(); // remove \r if(headerLine.length() > 0) { //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] RX: "); WS_PRINTLN(headerLine.c_str()); // websocket request starts allways with GET see rfc6455 if(headerLine.startsWith("GET ")) { // cut URL out - client->cUrl = headerLine.substring(4, headerLine.indexOf(' ', 4)); + client.cUrl = headerLine.substring(4, headerLine.indexOf(' ', 4)); } else if(headerLine.indexOf(':')) { String headerName = headerLine.substring(0, headerLine.indexOf(':')); String headerValue = headerLine.substring(headerLine.indexOf(':') + 2); if(headerName.equalsIgnoreCase("Connection")) { if(headerValue.indexOf("Upgrade") >= 0) { - client->cIsUpgrade = true; + client.cIsUpgrade = true; } } else if(headerName.equalsIgnoreCase("Upgrade")) { if(headerValue.equalsIgnoreCase("websocket")) { - client->cIsWebsocket = true; + client.cIsWebsocket = true; } } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Version")) { - client->cVersion = headerValue.toInt(); + client.cVersion = headerValue.toInt(); } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Key")) { - client->cKey = headerValue; - client->cKey.trim(); // see rfc6455 + client.cKey = headerValue; + client.cKey.trim(); // see rfc6455 } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Protocol")) { - client->cProtocol = headerValue; + client.cProtocol = headerValue; } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Extensions")) { - client->cExtensions = headerValue; + client.cExtensions = headerValue; } } else { //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); @@ -648,55 +526,55 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { } else { //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][handleHeader] Header read fin."); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - cURL: "); - WS_PRINTLN(client->cUrl.c_str()); + WS_PRINTLN(client.cUrl.c_str()); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - cIsUpgrade: "); - WS_PRINTLN(client->cIsUpgrade); + WS_PRINTLN(client.cIsUpgrade); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - cIsWebsocket: "); - WS_PRINTLN(client->cIsWebsocket); + WS_PRINTLN(client.cIsWebsocket); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - cKey: "); - WS_PRINTLN(client->cKey.c_str()); + WS_PRINTLN(client.cKey.c_str()); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - cProtocol: "); - WS_PRINTLN(client->cProtocol.c_str()); + WS_PRINTLN(client.cProtocol.c_str()); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - cExtensions: "); - WS_PRINTLN(client->cExtensions.c_str()); + WS_PRINTLN(client.cExtensions.c_str()); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - cVersion: "); - WS_PRINTLN(client->cVersion); + WS_PRINTLN(client.cVersion); - bool ok = (client->cIsUpgrade && client->cIsWebsocket); + bool ok = (client.cIsUpgrade && client.cIsWebsocket); if(ok) { - if(client->cUrl.length() == 0) { + if(client.cUrl.length() == 0) { ok = false; } - if(client->cKey.length() == 0) { + if(client.cKey.length() == 0) { ok = false; } - if(client->cVersion != 13) { + if(client.cVersion != 13) { ok = false; } } @@ -705,41 +583,41 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][handleHeader] Websocket connection incomming."); // generate Sec-WebSocket-Accept key - String sKey = acceptKey(client->cKey); + String sKey = acceptKey(client.cKey); //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleHeader] - sKey: "); WS_PRINTLN(sKey.c_str()); - client->status = WSC_CONNECTED; + client.status = WSC_CONNECTED; - client->tcp->write("HTTP/1.1 101 Switching Protocols\r\n" + client._client.write("HTTP/1.1 101 Switching Protocols\r\n" "Server: arduino-WebSocketsServer\r\n" "Upgrade: websocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Version: 13\r\n" "Sec-WebSocket-Accept: "); - client->tcp->write(sKey.c_str(), sKey.length()); - client->tcp->write("\r\n"); + client._client.write(sKey.c_str(), sKey.length()); + client._client.write("\r\n"); - if(client->cProtocol.length() > 0) { + if(client.cProtocol.length() > 0) { // TODO add api to set Protocol of Server - client->tcp->write("Sec-WebSocket-Protocol: arduino\r\n"); + client._client.write("Sec-WebSocket-Protocol: arduino\r\n"); } // header end - client->tcp->write("\r\n"); + client._client.write("\r\n"); // send ping - WebSockets::sendFrame(client, WSop_ping); + WebSockets::sendFrame(&client, WSop_ping); - runCbEvent(client->num, WStype_CONNECTED, (uint8_t *) client->cUrl.c_str(), client->cUrl.length()); + runCbEvent(client.num, WStype_CONNECTED, (uint8_t *) client.cUrl.c_str(), client.cUrl.length()); } else { handleNonWebsocketConnection(client); @@ -748,4 +626,3 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { } - diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 3b66a1d..4cfe02c 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -86,30 +86,30 @@ class WebSocketsServer: private WebSockets { WebSocketServerEvent _cbEvent; - void messageRecived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length); + void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length) { return messageReceived(*client, opcode, payload, length); };// to be deprecated + void messageReceived(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length); - void clientDisconnect(WSclient_t * client); - bool clientIsConnected(WSclient_t * client); - bool clientIsConnected2(WSclient_t & client); + void clientDisconnect(WSclient_t * client) { return clientDisconnect(*client); }; // to be deprecated + void clientDisconnect(WSclient_t & client); + bool clientIsConnected(WSclient_t * client) { return clientIsConnected(*client); };// to be deprecated + bool clientIsConnected(WSclient_t & client); - //void handleNewClients(void); void handleNewClients(WSclient_t & client); - //void handleClientData(void); void handleClientData(WSclient_t & client); - void handleHeader(WSclient_t * client); + void handleHeader(WSclient_t & client); /** * called if a non Websocket connection is comming in. * Note: can be overrided * @param client WSclient_t * ptr to the client struct */ - virtual void handleNonWebsocketConnection(WSclient_t * client) { + virtual void handleNonWebsocketConnection(WSclient_t & client) { //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); WS_PRINT("[WS-Server]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][handleHeader] no Websocket connection close."); - client->tcp->write("HTTP/1.1 400 Bad Request\r\n" + client._client.write("HTTP/1.1 400 Bad Request\r\n" "Server: arduino-WebSocket-Server\r\n" "Content-Type: text/plain\r\n" "Content-Length: 32\r\n" From 28449569ed274045d25fd4a8fa576b09375b2596 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sun, 13 May 2018 07:29:41 -0400 Subject: [PATCH 05/12] Add macro to debugguer to save memory --- src/WebSockets.cpp | 45 +++++++++++++++++++++++++++++++++------- src/WebSockets.h | 9 ++++++-- src/WebSocketsClient.cpp | 32 +++++++++++++++++++--------- src/WebSocketsServer.cpp | 44 +++++++++++++++++++++------------------ src/WebSocketsServer.h | 2 ++ 5 files changed, 92 insertions(+), 40 deletions(-) diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 32bb956..5983f54 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -87,25 +87,29 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask, bool fin, bool headerToPayload) { if(client->tcp && !client->tcp->connected()) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINTLN("][sendFrame] not Connected!?"); +#endif return; } if(client->status != WSC_CONNECTED) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINTLN("][sendFrame] not in WSC_CONNECTED state!?"); +#endif return; } - +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send massage frame -------\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client->num); - WS_PRINTLN("][sendFrame] ------- send massage frame -------"); + WS_PRINTLN("][sendFrame] ------- send message frame -------"); //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, mask, length, headerToPayload); WS_PRINT("[WS]["); WS_PRINT(client->num); @@ -119,13 +123,15 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay WS_PRINT(length); WS_PRINT(" headerToPayload: "); WS_PRINTLN(headerToPayload); - +#endif if(opcode == WSop_text) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINT("][sendFrame] text: "); WS_PRINTLN(reinterpret_cast(payload + (headerToPayload ? 14 : 0)));//<<<------------------------------------------------ +#endif } uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; @@ -154,10 +160,12 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay // only for ESP since AVR has less HEAP // try to send data in one TCP package (only if some free Heap is there) if(!headerToPayload && ((length > 0) && (length < 1400)) && (ESP.getFreeHeap() > 6000)) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINTLN("][sendFrame] pack to one TCP package..."); +#endif uint8_t * dataPtr = (uint8_t *) malloc(length + WEBSOCKETS_MAX_HEADER_SIZE); if(dataPtr) { memcpy((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length); @@ -288,12 +296,12 @@ void WebSockets::handleWebsocket(WSclient_t * client) { uint8_t maskKey[4]; uint8_t * payload = NULL; - +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINTLN("][handleWebsocket] ------- read massage frame -------"); - +#endif if(!readWait(client, buffer, 2)) { //timeout clientDisconnect(client, 1002); @@ -332,7 +340,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { payloadLen = buffer[4] << 24 | buffer[5] << 16 | buffer[6] << 8 | buffer[7]; } } - +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, fin, rsv1, rsv2, rsv3, opCode); WS_PRINT("[WS]["); WS_PRINT(client->num); @@ -353,8 +361,9 @@ void WebSockets::handleWebsocket(WSclient_t * client) { WS_PRINT(mask); WS_PRINT(" payloadLen: "); WS_PRINTLN(payloadLen); - +#endif if(payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen); WS_PRINT("[WS]["); WS_PRINT(client->num); @@ -362,6 +371,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { WS_PRINT(payloadLen); WS_PRINTLN(")"); clientDisconnect(client, 1009); +#endif return; } @@ -378,21 +388,25 @@ void WebSockets::handleWebsocket(WSclient_t * client) { payload = (uint8_t *) malloc(payloadLen + 1); if(!payload) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINT("][handleWebsocket] to less memory to handle payload "); WS_PRINT(payloadLen); WS_PRINTLN("!"); +#endif clientDisconnect(client, 1011); return; } if(!readWait(client, payload, payloadLen)) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINTLN("][handleWebsocket] missing data!"); +#endif free(payload); clientDisconnect(client, 1002); return; @@ -410,11 +424,13 @@ void WebSockets::handleWebsocket(WSclient_t * client) { switch(opCode) { case WSop_text: +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINT("][handleWebsocket] text: "); WS_PRINTLN(reinterpret_cast(payload));//<<<------------------------------------------------ +#endif // no break here! case WSop_binary: messageReceived(client, opCode, payload, payloadLen); @@ -424,12 +440,14 @@ void WebSockets::handleWebsocket(WSclient_t * client) { sendFrame(client, WSop_pong, payload, payloadLen); break; case WSop_pong: +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINT("][handleWebsocket] get pong ("); WS_PRINT(reinterpret_cast(payload));//<<<------------------------------------------------ WS_PRINTLN(")"); +#endif break; case WSop_close: { @@ -437,20 +455,25 @@ void WebSockets::handleWebsocket(WSclient_t * client) { if(payloadLen >= 2) { reasonCode = payload[0] << 8 | payload[1]; } - +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); WS_PRINT("[WS]["); WS_PRINT(client->num); WS_PRINT("][handleWebsocket] get ask for close. Code: "); WS_PRINTLN(reasonCode); +#endif if(payloadLen > 2) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS(" (%s)\n", (payload+2)); WS_PRINT(" ("); WS_PRINT(reinterpret_cast(payload+2));//<<<------------------------------------------------ WS_PRINTLN(")"); +#endif } else { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("\n"); WS_PRINTLN(); +#endif } clientDisconnect(client, 1000); } @@ -528,20 +551,26 @@ bool WebSockets::readWait(WSclient_t * client, uint8_t *out, size_t n) { while(n > 0) { if(!client->tcp) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[readWait] tcp is null!\n"); WS_PRINTLN("[readWait] tcp is null!"); +#endif return false; } if(!client->tcp->connected()) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[readWait] not connected!\n"); WS_PRINTLN("[readWait] not connected!"); +#endif return false; } if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { +#ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[readWait] receive TIMEOUT!\n"); WS_PRINTLN("[readWait] receive TIMEOUT!"); +#endif return false; } diff --git a/src/WebSockets.h b/src/WebSockets.h index c271091..603a1cf 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -29,6 +29,11 @@ //#define DEBUG_WEBSOCKETS +// those macro have been added so the lib fit on arduino UNO +//#define WS_DEBUG //unmute this to display debugprint from websockets.h and cpp +//#define WS_CLIENT_DEBUG //unmute this to display debugprint from websocketsClient.h and cpp +//#define WS_SERVER_DEBUG //unmute this to display debugprint from websocketsServer + #ifdef DEBUG_WEBSOCKETS #define WS_PRINT(x) Serial.print(x); #define WS_PRINTLN(x) Serial.println(x); @@ -81,7 +86,7 @@ #elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) #include -#include +//#include #define WEBSOCKETS_NETWORK_CLASS EthernetClient #define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer @@ -95,7 +100,7 @@ #include #include #include -#include +//#include #define WEBSOCKETS_NETWORK_CLASS EthernetClient #define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 1ffb569..38c97fe 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -294,10 +294,10 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) { client->cIsWebsocket = false; client->status = WSC_NOT_CONNECTED; - +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] client disconnected.\n"); WS_PRINTLN("[WS-Client] client disconnected."); - +#endif runCbEvent(WStype_DISCONNECTED, NULL, 0); } @@ -320,8 +320,10 @@ bool WebSocketsClient::clientIsConnected(WSclient_t * client) { } else { // client lost if(client->status != WSC_NOT_CONNECTED) { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); WS_PRINTLN("[WS-Client] connection lost."); +#endif // do cleanup clientDisconnect(client); } @@ -363,10 +365,10 @@ void WebSocketsClient::handleClientData(void) { * @param client WSclient_t * ptr to the client struct */ void WebSocketsClient::sendHeader(WSclient_t * client) { - +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header...\n"); WS_PRINTLN("[WS-Client][sendHeader] sending header..."); - +#endif uint8_t randomKey[16] = { 0 }; for(uint8_t i = 0; i < sizeof(randomKey); i++) { @@ -395,12 +397,12 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { handshake += "\r\n"; client->tcp->write(handshake.c_str(), handshake.length()); - +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%uus).\n", (micros() - start)); WS_PRINT("[WS-Client][sendHeader] sending header... Done ("); WS_PRINT((micros() - start)); WS_PRINTLN("us)."); - +#endif } /** @@ -413,10 +415,11 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { headerLine.trim(); // remove \r if(headerLine.length() > 0) { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine.c_str()); WS_PRINT("[WS-Client][handleHeader] RX: "); WS_PRINTLN(headerLine.c_str()); - +#endif if(headerLine.startsWith("HTTP/1.")) { // "HTTP/1.1 101 Switching Protocols" client->cCode = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt(); @@ -443,13 +446,16 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { client->cVersion = headerValue.toInt(); } } else { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); WS_PRINT("[WS-Client][handleHeader] Header error ("); WS_PRINT(headerLine.c_str()); WS_PRINTLN(")"); +#endif } } else { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header read fin.\n"); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Client settings:\n"); WS_PRINTLN("[WS-Client][handleHeader] Header read fin."); @@ -485,7 +491,7 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cVersion: %d\n", client->cVersion); WS_PRINT("[WS-Client][handleHeader] - cVersion: "); WS_PRINTLN(client->cVersion); - +#endif bool ok = (client->cIsUpgrade && client->cIsWebsocket); if(ok) { @@ -497,10 +503,12 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { // todo handle login default: ///< Server dont unterstand requrst ok = false; +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); WS_PRINT("[WS-Client][handleHeader] serverCode is not 101 ("); WS_PRINT(client->cCode); WS_PRINTLN(")"); +#endif clientDisconnect(client); break; } @@ -513,25 +521,29 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { // generate Sec-WebSocket-Accept key for check String sKey = acceptKey(client->cKey); if(sKey != client->cAccept) { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong\n"); WS_PRINTLN("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong"); +#endif ok = false; } } } if(ok) { - +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Websocket connection init done.\n"); WS_PRINTLN("[WS-Client][handleHeader] Websocket connection init done."); - +#endif client->status = WSC_CONNECTED; runCbEvent(WStype_CONNECTED, (uint8_t *) client->cUrl.c_str(), client->cUrl.length()); } else { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] no Websocket connection close.\n"); WS_PRINTLN("[WS-Client][handleHeader] no Websocket connection close."); +#endif client->tcp->write("This is a webSocket client!"); clientDisconnect(client); } diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 865219b..4228de0 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -75,9 +75,10 @@ void WebSocketsServer::begin(void) { #endif _server->begin(); - +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server] Server Started.\n"); WS_PRINTLN("[WS-Server] Server Started."); +#endif } /** @@ -107,9 +108,10 @@ void WebSocketsServer::loop(void) { } wsClient._client.stop(); //close connection is no free spot +#ifdef WS_SERVER_DEBUG WS_PRINTLN("[WS-Server] No free socket, connection close"); +#endif } - //WS_PRINTLN("[WS-Server] No Client"); } /** @@ -312,10 +314,8 @@ void WebSocketsServer::messageReceived(WSclient_t & client, WSopcode_t opcode, u * Disconnect an client * @param client WSclient_t * ptr to the client struct */ - void WebSocketsServer::clientDisconnect(WSclient_t & client) { - #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) if(client.isSSL && client.ssl) { if(client.ssl->connected()) { @@ -328,14 +328,6 @@ void WebSocketsServer::clientDisconnect(WSclient_t & client) { } #endif -/* if(client.tcp) { - if(client.tcp->connected()) { - client.tcp->flush(); - client.tcp->stop(); - } - //delete client->tcp; - client.tcp = NULL; - }*/ if(client._client) { if(client._client.connected()) { client._client.flush(); @@ -353,12 +345,12 @@ void WebSocketsServer::clientDisconnect(WSclient_t & client) { client.cIsWebsocket = false; client.status = WSC_NOT_CONNECTED; - +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("] client disconnected."); - +#endif runCbEvent(client.num, WStype_DISCONNECTED, NULL, 0); client.num = WEBSOCKETS_SERVER_CLIENT_MAX; } @@ -380,10 +372,12 @@ bool WebSocketsServer::clientIsConnected(WSclient_t & client) { } else { // client lost if(client.status != WSC_NOT_CONNECTED) { +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("] client connection lost."); +#endif // do cleanup clientDisconnect(client); } @@ -407,7 +401,9 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { //while(_server->hasClient()) { ///<<----this conditionnal while make code not compile on arduino #endif if(!clientIsConnected(client)) { +#ifdef WS_SERVER_DEBUG WS_PRINTLN("fail to make new connection"); +#endif return; } @@ -420,6 +416,7 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { client.status = WSC_HEADER; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) IPAddress ip = client._client.remoteIP(); +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); @@ -431,11 +428,14 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { WS_PRINT(ip[2]); WS_PRINT("."); WS_PRINTLN(ip[3]); +#endif #else //------------->>>>>>to debug //DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); +#ifdef WS_SERVER_DEBUG WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("] new client"); +#endif #endif ok = true; @@ -484,12 +484,13 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { headerLine.trim(); // remove \r if(headerLine.length() > 0) { +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] RX: "); WS_PRINTLN(headerLine.c_str()); - +#endif // websocket request starts allways with GET see rfc6455 if(headerLine.startsWith("GET ")) { // cut URL out @@ -517,13 +518,16 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { client.cExtensions = headerValue; } } else { +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); WS_PRINT("[WS-Client][handleHeader] Header error ("); WS_PRINT(headerLine.c_str()); WS_PRINTLN(")"); +#endif } } else { +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); @@ -564,7 +568,7 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { WS_PRINT(client.num); WS_PRINT("][handleHeader] - cVersion: "); WS_PRINTLN(client.cVersion); - +#endif bool ok = (client.cIsUpgrade && client.cIsWebsocket); if(ok) { @@ -580,21 +584,21 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { } if(ok) { - +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("][handleHeader] Websocket connection incomming."); - +#endif // generate Sec-WebSocket-Accept key String sKey = acceptKey(client.cKey); - +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - sKey: "); WS_PRINTLN(sKey.c_str()); - +#endif client.status = WSC_CONNECTED; client._client.write("HTTP/1.1 101 Switching Protocols\r\n" diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 4cfe02c..cb11c8e 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -105,10 +105,12 @@ class WebSocketsServer: private WebSockets { * @param client WSclient_t * ptr to the client struct */ virtual void handleNonWebsocketConnection(WSclient_t & client) { +#ifdef WS_SERVER_DEBUG //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("][handleHeader] no Websocket connection close."); +#endif client._client.write("HTTP/1.1 400 Bad Request\r\n" "Server: arduino-WebSocket-Server\r\n" "Content-Type: text/plain\r\n" From 6d92bc2425a5d78056cb9dc947fb4c79b4ce76a6 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sun, 13 May 2018 16:08:16 -0400 Subject: [PATCH 06/12] move websocket and client pointer semantic to reference --- src/WebSockets.cpp | 62 +++++++------- src/WebSockets.h | 18 ++-- src/WebSocketsClient.cpp | 178 +++++++++++++++++++-------------------- src/WebSocketsClient.h | 10 +-- src/WebSocketsServer.cpp | 22 ++--- src/WebSocketsServer.h | 3 - 6 files changed, 138 insertions(+), 155 deletions(-) diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 5983f54..265b69b 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -55,13 +55,13 @@ extern "C" { * @param reason * @param reasonLen */ -void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { +void WebSockets::clientDisconnect(WSclient_t & client, uint16_t code, char * reason, size_t reasonLen) { //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] clientDisconnect code: "); WS_PRINTLN(code); - if(client->status == WSC_CONNECTED && code) { + if(client.status == WSC_CONNECTED && code) { if(reason) { sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen); } else { @@ -84,23 +84,22 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea * @param fin bool can be used to send data in more then one frame (set fin on the last frame) * @param headerToPayload bool set true if the payload has reserved 14 Byte at the beginning to dynamically add the Header (payload neet to be in RAM!) */ -void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask, bool fin, bool headerToPayload) { - - if(client->tcp && !client->tcp->connected()) { +void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask, bool fin, bool headerToPayload) { + if(client.tcp && !client.tcp->connected()) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][sendFrame] not Connected!?"); #endif return; } - if(client->status != WSC_CONNECTED) { + if(client.status != WSC_CONNECTED) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][sendFrame] not in WSC_CONNECTED state!?"); #endif return; @@ -108,11 +107,11 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send massage frame -------\n", client->num); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][sendFrame] ------- send message frame -------"); //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, mask, length, headerToPayload); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][sendFrame] fin: "); WS_PRINT(fin); WS_PRINT(" opCode: "); @@ -128,7 +127,7 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][sendFrame] text: "); WS_PRINTLN(reinterpret_cast(payload + (headerToPayload ? 14 : 0)));//<<<------------------------------------------------ #endif @@ -163,7 +162,7 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][sendFrame] pack to one TCP package..."); #endif uint8_t * dataPtr = (uint8_t *) malloc(length + WEBSOCKETS_MAX_HEADER_SIZE); @@ -256,14 +255,14 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay // header has be added to payload // payload is forced to reserved 14 Byte but we may not need all based on the length and mask settings // offset in payload is calculatetd 14 - headerSize - client->tcp->write(&payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize)); + client.tcp->write(&payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize)); } else { // send header - client->tcp->write(&buffer[0], headerSize); + client.tcp->write(&buffer[0], headerSize); if(payloadPtr && length > 0) { // send payload - client->tcp->write(&payloadPtr[0], length); + client.tcp->write(&payloadPtr[0], length); } } @@ -281,8 +280,7 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay * handle the WebSocket stream * @param client WSclient_t * ptr to the client struct */ -void WebSockets::handleWebsocket(WSclient_t * client) { - +void WebSockets::handleWebsocket(WSclient_t & client) { uint8_t buffer[8] = { 0 }; bool fin; @@ -299,7 +297,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][handleWebsocket] ------- read massage frame -------"); #endif if(!readWait(client, buffer, 2)) { @@ -343,7 +341,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, fin, rsv1, rsv2, rsv3, opCode); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] fin: "); WS_PRINT(fin); WS_PRINT(" rsv1: "); @@ -356,7 +354,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { WS_PRINTLN(opCode); //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, mask, payloadLen); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] mask: "); WS_PRINT(mask); WS_PRINT(" payloadLen: "); @@ -366,7 +364,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] payload to big! ("); WS_PRINT(payloadLen); WS_PRINTLN(")"); @@ -391,7 +389,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] to less memory to handle payload "); WS_PRINT(payloadLen); WS_PRINTLN("!"); @@ -404,7 +402,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINTLN("][handleWebsocket] missing data!"); #endif free(payload); @@ -427,7 +425,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] text: "); WS_PRINTLN(reinterpret_cast(payload));//<<<------------------------------------------------ #endif @@ -443,7 +441,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] get pong ("); WS_PRINT(reinterpret_cast(payload));//<<<------------------------------------------------ WS_PRINTLN(")"); @@ -458,7 +456,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); WS_PRINT("[WS]["); - WS_PRINT(client->num); + WS_PRINT(client.num); WS_PRINT("][handleWebsocket] get ask for close. Code: "); WS_PRINTLN(reasonCode); #endif @@ -545,12 +543,12 @@ String WebSockets::base64_encode(uint8_t * data, size_t length) { * @param n size_t byte count * @return true if ok */ -bool WebSockets::readWait(WSclient_t * client, uint8_t *out, size_t n) { +bool WebSockets::readWait(WSclient_t & client, uint8_t *out, size_t n) { unsigned long t = millis(); size_t len; while(n > 0) { - if(!client->tcp) { + if(!client.tcp) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[readWait] tcp is null!\n"); WS_PRINTLN("[readWait] tcp is null!"); @@ -558,7 +556,7 @@ bool WebSockets::readWait(WSclient_t * client, uint8_t *out, size_t n) { return false; } - if(!client->tcp->connected()) { + if(!client.tcp->connected()) { #ifdef WS_DEBUG //DEBUG_WEBSOCKETS("[readWait] not connected!\n"); WS_PRINTLN("[readWait] not connected!"); @@ -574,14 +572,14 @@ bool WebSockets::readWait(WSclient_t * client, uint8_t *out, size_t n) { return false; } - if(!client->tcp->available()) { + if(!client.tcp->available()) { #ifdef ESP8266 delay(0); #endif continue; } - len = client->tcp->read((uint8_t*) out, n); + len = client.tcp->read((uint8_t*) out, n); if(len) { t = millis(); out += len; diff --git a/src/WebSockets.h b/src/WebSockets.h index 603a1cf..1510760 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -30,9 +30,9 @@ //#define DEBUG_WEBSOCKETS // those macro have been added so the lib fit on arduino UNO -//#define WS_DEBUG //unmute this to display debugprint from websockets.h and cpp -//#define WS_CLIENT_DEBUG //unmute this to display debugprint from websocketsClient.h and cpp -//#define WS_SERVER_DEBUG //unmute this to display debugprint from websocketsServer +//#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp +//#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp +//#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer #ifdef DEBUG_WEBSOCKETS #define WS_PRINT(x) Serial.print(x); @@ -162,21 +162,17 @@ typedef struct { class WebSockets { protected: - virtual void clientDisconnect(WSclient_t * client); virtual void clientDisconnect(WSclient_t & client); - virtual bool clientIsConnected(WSclient_t * client); virtual bool clientIsConnected(WSclient_t & client); - virtual void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length); virtual void messageReceived(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length); - void clientDisconnect(WSclient_t * client, uint16_t code, char * reason = NULL, size_t reasonLen = 0); - void sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload = NULL, size_t length = 0, bool mask = false, bool fin = true, bool headerToPayload = false); + void clientDisconnect(WSclient_t & client, uint16_t code, char * reason = NULL, size_t reasonLen = 0); + void sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * payload = NULL, size_t length = 0, bool mask = false, bool fin = true, bool headerToPayload = false); + void handleWebsocket(WSclient_t & client); - void handleWebsocket(WSclient_t * client); - - bool readWait(WSclient_t * client, uint8_t *out, size_t n); + bool readWait(WSclient_t & client, uint8_t *out, size_t n); String acceptKey(String clientKey); String base64_encode(uint8_t * data, size_t length); diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 38c97fe..6093295 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -89,12 +89,14 @@ void WebSocketsClient::beginSSL(String host, uint16_t port, String url, String f * called in arduino loop */ void WebSocketsClient::loop(void) { - if(!clientIsConnected(&_client)) { + if(!clientIsConnected(_client)) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) if(_client.isSSL) { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] connect wss...\n"); WS_PRINTLN("[WS-Client] connect wss..."); +#endif if(_client.ssl) { delete _client.ssl; _client.ssl = NULL; @@ -103,8 +105,10 @@ void WebSocketsClient::loop(void) { _client.ssl = new WiFiClientSecure(); _client.tcp = _client.ssl; } else { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] connect ws...\n"); WS_PRINTLN("[WS-Client] connect ws..."); +#endif if(_client.tcp) { delete _client.tcp; _client.tcp = NULL; @@ -122,13 +126,14 @@ void WebSocketsClient::loop(void) { } if(_client.tcp->connect(_host.c_str(), _port)) { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); WS_PRINT("[WS-Client] connected to "); WS_PRINT(_host.c_str()); WS_PRINT(":"); WS_PRINT(_port); WS_PRINTLN("."); - +#endif _client.status = WSC_HEADER; // set Timeout for readBytesUntil and readStringUntil @@ -139,8 +144,10 @@ void WebSocketsClient::loop(void) { if(_client.isSSL && _fingerprint.length()) { if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!\n"); WS_PRINTLN("[WS-Client] creating Network class failed!"); +#endif WebSockets::clientDisconnect(&_client, 1000); return; } @@ -148,15 +155,17 @@ void WebSocketsClient::loop(void) { #endif // send Header to Server - sendHeader(&_client); + sendHeader(_client); } else { +#ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); WS_PRINT("[WS-Client] connection to "); WS_PRINT(_host.c_str()); WS_PRINT(":"); WS_PRINT(_port); WS_PRINTLN(" Faild"); +#endif delay(10); //some litle delay to not flood the server } } else { @@ -183,8 +192,8 @@ void WebSocketsClient::sendTXT(uint8_t * payload, size_t length, bool headerToPa if(length == 0) { length = strlen((const char *) payload); } - if(clientIsConnected(&_client)) { - sendFrame(&_client, WSop_text, payload, length, true, true, headerToPayload); + if(clientIsConnected(_client)) { + sendFrame(_client, WSop_text, payload, length, true, true, headerToPayload); } } @@ -212,8 +221,8 @@ void WebSocketsClient::sendTXT(String payload) { * @param headerToPayload bool (see sendFrame for more details) */ void WebSocketsClient::sendBIN(uint8_t * payload, size_t length, bool headerToPayload) { - if(clientIsConnected(&_client)) { - sendFrame(&_client, WSop_binary, payload, length, true, true, headerToPayload); + if(clientIsConnected(_client)) { + sendFrame(_client, WSop_binary, payload, length, true, true, headerToPayload); } } @@ -226,8 +235,8 @@ void WebSocketsClient::sendBIN(const uint8_t * payload, size_t length) { * @param num uint8_t client id */ void WebSocketsClient::disconnect(void) { - if(clientIsConnected(&_client)) { - WebSockets::clientDisconnect(&_client, 1000); + if(clientIsConnected(_client)) { + WebSockets::clientDisconnect(_client, 1000); } } @@ -242,7 +251,7 @@ void WebSocketsClient::disconnect(void) { * @param payload uint8_t * * @param lenght size_t */ -void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t lenght) { +void WebSocketsClient::messageReceived(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length) { WStype_t type = WStype_ERROR; switch(opcode) { @@ -253,53 +262,46 @@ void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, u type = WStype_BIN; break; } - - runCbEvent(type, payload, lenght); - + runCbEvent(type, payload, length); } /** * Disconnect an client * @param client WSclient_t * ptr to the client struct */ -void WebSocketsClient::clientDisconnect(WSclient_t * client) { - +void WebSocketsClient::clientDisconnect(WSclient_t & client) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - if(client->isSSL && client->ssl) { - if(client->ssl->connected()) { - client->ssl->flush(); - client->ssl->stop(); + if(client.isSSL && client->ssl) { + if(client.ssl->connected()) { + client.ssl->flush(); + client.ssl->stop(); } - delete client->ssl; - client->ssl = NULL; - client->tcp = NULL; + delete client.ssl; + client.ssl = NULL; + client.tcp = NULL; } #endif - - if(client->tcp) { - if(client->tcp->connected()) { - client->tcp->flush(); - client->tcp->stop(); + if(client.tcp) { + if(client.tcp->connected()) { + client.tcp->flush(); + client.tcp->stop(); } - delete client->tcp; - client->tcp = NULL; + delete client.tcp; + client.tcp = NULL; } - - client->cCode = 0; - client->cKey = ""; - client->cAccept = ""; - client->cProtocol = ""; - client->cVersion = 0; - client->cIsUpgrade = false; - client->cIsWebsocket = false; - - client->status = WSC_NOT_CONNECTED; + client.cCode = 0; + client.cKey = ""; + client.cAccept = ""; + client.cProtocol = ""; + client.cVersion = 0; + client.cIsUpgrade = false; + client.cIsWebsocket = false; + client.status = WSC_NOT_CONNECTED; #ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] client disconnected.\n"); WS_PRINTLN("[WS-Client] client disconnected."); #endif runCbEvent(WStype_DISCONNECTED, NULL, 0); - } /** @@ -307,19 +309,17 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) { * @param client WSclient_t * ptr to the client struct * @return true = conneted */ -bool WebSocketsClient::clientIsConnected(WSclient_t * client) { - - if(!client->tcp) { +bool WebSocketsClient::clientIsConnected(WSclient_t & client) { + if(!client.tcp) { return false; } - - if(client->tcp->connected()) { - if(client->status != WSC_NOT_CONNECTED) { + if(client.tcp->connected()) { + if(client.status != WSC_NOT_CONNECTED) { return true; } } else { // client lost - if(client->status != WSC_NOT_CONNECTED) { + if(client.status != WSC_NOT_CONNECTED) { #ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); WS_PRINTLN("[WS-Client] connection lost."); @@ -328,12 +328,10 @@ bool WebSocketsClient::clientIsConnected(WSclient_t * client) { clientDisconnect(client); } } - - if(client->tcp) { + if(client.tcp) { // do cleanup clientDisconnect(client); } - return false; } @@ -345,13 +343,13 @@ void WebSocketsClient::handleClientData(void) { if(len > 0) { switch(_client.status) { case WSC_HEADER: - handleHeader(&_client); + handleHeader(_client); break; case WSC_CONNECTED: - WebSockets::handleWebsocket(&_client); + WebSockets::handleWebsocket(_client); break; default: - WebSockets::clientDisconnect(&_client, 1002); + WebSockets::clientDisconnect(_client, 1002); break; } } @@ -364,7 +362,7 @@ void WebSocketsClient::handleClientData(void) { * send the WebSocket header to Server * @param client WSclient_t * ptr to the client struct */ -void WebSocketsClient::sendHeader(WSclient_t * client) { +void WebSocketsClient::sendHeader(WSclient_t & client) { #ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header...\n"); WS_PRINTLN("[WS-Client][sendHeader] sending header..."); @@ -375,28 +373,28 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { randomKey[i] = random(0xFF); } - client->cKey = base64_encode(&randomKey[0], 16); + client.cKey = base64_encode(&randomKey[0], 16); #ifndef NODEBUG_WEBSOCKETS unsigned long start = micros(); #endif - String handshake = "GET " + client->cUrl + " HTTP/1.1\r\n" + String handshake = "GET " + client.cUrl + " HTTP/1.1\r\n" "Host: " + _host + "\r\n" "Upgrade: websocket\r\n" "Connection: Upgrade\r\n" "User-Agent: arduino-WebSocket-Client\r\n" "Sec-WebSocket-Version: 13\r\n" "Sec-WebSocket-Protocol: arduino\r\n" - "Sec-WebSocket-Key: " + client->cKey + "\r\n"; + "Sec-WebSocket-Key: " + client.cKey + "\r\n"; - if(client->cExtensions.length() > 0) { - handshake += "Sec-WebSocket-Extensions: " + client->cExtensions + "\r\n"; + if(client.cExtensions.length() > 0) { + handshake += "Sec-WebSocket-Extensions: " + client.cExtensions + "\r\n"; } handshake += "\r\n"; - client->tcp->write(handshake.c_str(), handshake.length()); + client.tcp->write(handshake.c_str(), handshake.length()); #ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%uus).\n", (micros() - start)); WS_PRINT("[WS-Client][sendHeader] sending header... Done ("); @@ -409,9 +407,8 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { * handle the WebSocket header reading * @param client WSclient_t * ptr to the client struct */ -void WebSocketsClient::handleHeader(WSclient_t * client) { - - String headerLine = client->tcp->readStringUntil('\n'); +void WebSocketsClient::handleHeader(WSclient_t & client) { + String headerLine = client.tcp->readStringUntil('\n'); headerLine.trim(); // remove \r if(headerLine.length() > 0) { @@ -422,28 +419,28 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { #endif if(headerLine.startsWith("HTTP/1.")) { // "HTTP/1.1 101 Switching Protocols" - client->cCode = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt(); + client.cCode = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt(); } else if(headerLine.indexOf(':')) { String headerName = headerLine.substring(0, headerLine.indexOf(':')); String headerValue = headerLine.substring(headerLine.indexOf(':') + 2); if(headerName.equalsIgnoreCase("Connection")) { if(headerValue.indexOf("Upgrade") >= 0) { - client->cIsUpgrade = true; + client.cIsUpgrade = true; } } else if(headerName.equalsIgnoreCase("Upgrade")) { if(headerValue.equalsIgnoreCase("websocket")) { - client->cIsWebsocket = true; + client.cIsWebsocket = true; } } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Accept")) { - client->cAccept = headerValue; - client->cAccept.trim(); // see rfc6455 + client.cAccept = headerValue; + client.cAccept.trim(); // see rfc6455 } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Protocol")) { - client->cProtocol = headerValue; + client.cProtocol = headerValue; } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Extensions")) { - client->cExtensions = headerValue; + client.cExtensions = headerValue; } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Version")) { - client->cVersion = headerValue.toInt(); + client.cVersion = headerValue.toInt(); } } else { #ifdef WS_CLIENT_DEBUG @@ -463,39 +460,39 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cURL: %s\n", client->cUrl.c_str()); WS_PRINT("[WS-Client][handleHeader] - cURL: "); - WS_PRINTLN(client->cUrl.c_str()); + WS_PRINTLN(client.cUrl.c_str()); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cKey: %s\n", client->cKey.c_str()); WS_PRINTLN("[WS-Client][handleHeader] - cKey: "); - WS_PRINTLN(client->cKey.c_str()); + WS_PRINTLN(client.cKey.c_str()); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Server header:\n"); WS_PRINTLN("[WS-Client][handleHeader] Server header:"); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cCode: %d\n", client->cCode); WS_PRINT("[WS-Client][handleHeader] - cCode: "); - WS_PRINTLN(client->cCode); + WS_PRINTLN(client.cCode); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsUpgrade: %d\n", client->cIsUpgrade); WS_PRINT("[WS-Client][handleHeader] - cIsUpgrade: "); - WS_PRINTLN(client->cIsUpgrade); + WS_PRINTLN(client.cIsUpgrade); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsWebsocket: %d\n", client->cIsWebsocket); WS_PRINT("[WS-Client][handleHeader] - cIsWebsocket: "); - WS_PRINTLN(client->cIsWebsocket); + WS_PRINTLN(client.cIsWebsocket); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cAccept: %s\n", client->cAccept.c_str()); WS_PRINT("[WS-Client][handleHeader] - cAccept: "); - WS_PRINTLN(client->cAccept.c_str()); + WS_PRINTLN(client.cAccept.c_str()); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cProtocol: %s\n", client->cProtocol.c_str()); WS_PRINT("[WS-Client][handleHeader] - cProtocol: "); - WS_PRINTLN(client->cProtocol.c_str()); + WS_PRINTLN(client.cProtocol.c_str()); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cExtensions: %s\n", client->cExtensions.c_str()); WS_PRINT("[WS-Client][handleHeader] - cExtensions: "); - WS_PRINTLN(client->cExtensions.c_str()); + WS_PRINTLN(client.cExtensions.c_str()); //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cVersion: %d\n", client->cVersion); WS_PRINT("[WS-Client][handleHeader] - cVersion: "); - WS_PRINTLN(client->cVersion); + WS_PRINTLN(client.cVersion); #endif - bool ok = (client->cIsUpgrade && client->cIsWebsocket); + bool ok = (client.cIsUpgrade && client.cIsWebsocket); if(ok) { - switch(client->cCode) { + switch(client.cCode) { case 101: ///< Switching Protocols break; @@ -506,7 +503,7 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { #ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); WS_PRINT("[WS-Client][handleHeader] serverCode is not 101 ("); - WS_PRINT(client->cCode); + WS_PRINT(client.cCode); WS_PRINTLN(")"); #endif clientDisconnect(client); @@ -515,12 +512,12 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { } if(ok) { - if(client->cAccept.length() == 0) { + if(client.cAccept.length() == 0) { ok = false; } else { // generate Sec-WebSocket-Accept key for check - String sKey = acceptKey(client->cKey); - if(sKey != client->cAccept) { + String sKey = acceptKey(client.cKey); + if(sKey != client.cAccept) { #ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong\n"); WS_PRINTLN("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong"); @@ -535,18 +532,17 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Websocket connection init done.\n"); WS_PRINTLN("[WS-Client][handleHeader] Websocket connection init done."); #endif - client->status = WSC_CONNECTED; + client.status = WSC_CONNECTED; - runCbEvent(WStype_CONNECTED, (uint8_t *) client->cUrl.c_str(), client->cUrl.length()); + runCbEvent(WStype_CONNECTED, (uint8_t *) client.cUrl.c_str(), client.cUrl.length()); } else { #ifdef WS_CLIENT_DEBUG //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] no Websocket connection close.\n"); WS_PRINTLN("[WS-Client][handleHeader] no Websocket connection close."); #endif - client->tcp->write("This is a webSocket client!"); + client.tcp->write("This is a webSocket client!"); clientDisconnect(client); } } -} - +} \ No newline at end of file diff --git a/src/WebSocketsClient.h b/src/WebSocketsClient.h index 71e053b..12e239b 100644 --- a/src/WebSocketsClient.h +++ b/src/WebSocketsClient.h @@ -70,16 +70,16 @@ class WebSocketsClient: private WebSockets { WebSocketClientEvent _cbEvent; - void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length); + void messageReceived(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length); - void clientDisconnect(WSclient_t * client); - bool clientIsConnected(WSclient_t * client); + void clientDisconnect(WSclient_t & client); + bool clientIsConnected(WSclient_t & client); void handleNewClients(void); void handleClientData(void); - void sendHeader(WSclient_t * client); - void handleHeader(WSclient_t * client); + void sendHeader(WSclient_t & client); + void handleHeader(WSclient_t & client); /** * called for sending a Event to the app diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 4228de0..73842ad 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -36,7 +36,6 @@ WebSocketsServer::WebSocketsServer(uint16_t port) { WebSocketsServer::~WebSocketsServer() { // disconnect all clients disconnect(); - // TODO how to close server? } @@ -44,8 +43,6 @@ WebSocketsServer::~WebSocketsServer() { * calles to init the Websockets server */ void WebSocketsServer::begin(void) { - //WSclient_t & client; - // init client storage for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { @@ -138,7 +135,7 @@ void WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length, bo } WSclient_t & client = _clients[num]; if(clientIsConnected(client)) { - sendFrame(&client, WSop_text, payload, length, false, true, headerToPayload); + sendFrame(client, WSop_text, payload, length, false, true, headerToPayload); } } @@ -172,7 +169,7 @@ void WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length, bool heade for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { WSclient_t & client = _clients[i]; if(clientIsConnected(client)) { - sendFrame(&client, WSop_text, payload, length, false, true, headerToPayload); + sendFrame(client, WSop_text, payload, length, false, true, headerToPayload); } #ifdef ESP8266 delay(0); @@ -209,7 +206,7 @@ void WebSocketsServer::sendBIN(uint8_t num, uint8_t * payload, size_t length, bo } WSclient_t & client = _clients[num]; if(clientIsConnected(client)) { - sendFrame(&client, WSop_binary, payload, length, false, true, headerToPayload); + sendFrame(client, WSop_binary, payload, length, false, true, headerToPayload); } } @@ -227,7 +224,7 @@ void WebSocketsServer::broadcastBIN(uint8_t * payload, size_t length, bool heade for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { WSclient_t & client = _clients[i]; if(clientIsConnected(client)) { - sendFrame(&client, WSop_binary, payload, length, false, true, headerToPayload); + sendFrame(client, WSop_binary, payload, length, false, true, headerToPayload); } #ifdef ESP8266 delay(0); @@ -247,7 +244,7 @@ void WebSocketsServer::disconnect(void) { for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { WSclient_t & client = _clients[i]; if(clientIsConnected(client)) { - WebSockets::clientDisconnect(&client, 1000); + WebSockets::clientDisconnect(client, 1000); } } } @@ -262,7 +259,7 @@ void WebSocketsServer::disconnect(uint8_t num) { } WSclient_t & client = _clients[num]; if(clientIsConnected(client)) { - WebSockets::clientDisconnect(&client, 1000); + WebSockets::clientDisconnect(client, 1000); } } @@ -452,7 +449,6 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { void WebSocketsServer::handleClientData(WSclient_t & client) { if(clientIsConnected(client)) { - //int len = client.tcp->available(); int len = client._client.available(); if(len > 0) { @@ -461,10 +457,10 @@ void WebSocketsServer::handleClientData(WSclient_t & client) { handleHeader(client); break; case WSC_CONNECTED: - WebSockets::handleWebsocket(&client); + WebSockets::handleWebsocket(client); break; default: - WebSockets::clientDisconnect(&client, 1002); + WebSockets::clientDisconnect(client, 1002); break; } } @@ -619,7 +615,7 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { client._client.write("\r\n"); // send ping - WebSockets::sendFrame(&client, WSop_ping); + WebSockets::sendFrame(client, WSop_ping); runCbEvent(client.num, WStype_CONNECTED, (uint8_t *) client.cUrl.c_str(), client.cUrl.length()); diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index cb11c8e..f13cd1f 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -86,12 +86,9 @@ class WebSocketsServer: private WebSockets { WebSocketServerEvent _cbEvent; - void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length) { return messageReceived(*client, opcode, payload, length); };// to be deprecated void messageReceived(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length); - void clientDisconnect(WSclient_t * client) { return clientDisconnect(*client); }; // to be deprecated void clientDisconnect(WSclient_t & client); - bool clientIsConnected(WSclient_t * client) { return clientIsConnected(*client); };// to be deprecated bool clientIsConnected(WSclient_t & client); void handleNewClients(WSclient_t & client); From 2e92bb43c1e33d483e2baf718ded4d9e22ad11bf Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sun, 13 May 2018 18:46:02 -0400 Subject: [PATCH 07/12] remove all old muted printf --- src/WebSockets.cpp | 23 ----------------------- src/WebSockets.h | 13 +++++-------- src/WebSocketsClient.cpp | 30 ------------------------------ src/WebSocketsServer.cpp | 18 ------------------ src/WebSocketsServer.h | 8 +------- 5 files changed, 6 insertions(+), 86 deletions(-) diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 265b69b..48d164a 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -56,7 +56,6 @@ extern "C" { * @param reasonLen */ void WebSockets::clientDisconnect(WSclient_t & client, uint16_t code, char * reason, size_t reasonLen) { - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] clientDisconnect code: "); @@ -87,7 +86,6 @@ void WebSockets::clientDisconnect(WSclient_t & client, uint16_t code, char * rea void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask, bool fin, bool headerToPayload) { if(client.tcp && !client.tcp->connected()) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINTLN("][sendFrame] not Connected!?"); @@ -97,7 +95,6 @@ void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * pay if(client.status != WSC_CONNECTED) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINTLN("][sendFrame] not in WSC_CONNECTED state!?"); @@ -105,11 +102,9 @@ void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * pay return; } #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send massage frame -------\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINTLN("][sendFrame] ------- send message frame -------"); - //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, mask, length, headerToPayload); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][sendFrame] fin: "); @@ -125,7 +120,6 @@ void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * pay #endif if(opcode == WSop_text) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][sendFrame] text: "); @@ -160,7 +154,6 @@ void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * pay // try to send data in one TCP package (only if some free Heap is there) if(!headerToPayload && ((length > 0) && (length < 1400)) && (ESP.getFreeHeap() > 6000)) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINTLN("][sendFrame] pack to one TCP package..."); @@ -295,7 +288,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { uint8_t * payload = NULL; #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINTLN("][handleWebsocket] ------- read massage frame -------"); @@ -339,7 +331,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { } } #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, fin, rsv1, rsv2, rsv3, opCode); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] fin: "); @@ -352,7 +343,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { WS_PRINT(rsv3); WS_PRINT(" opCode: "); WS_PRINTLN(opCode); - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, mask, payloadLen); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] mask: "); @@ -362,7 +352,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { #endif if(payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] payload to big! ("); @@ -387,7 +376,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { if(!payload) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] to less memory to handle payload "); @@ -400,7 +388,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { if(!readWait(client, payload, payloadLen)) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINTLN("][handleWebsocket] missing data!"); @@ -423,7 +410,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { switch(opCode) { case WSop_text: #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] text: "); @@ -439,7 +425,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { break; case WSop_pong: #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] get pong ("); @@ -454,7 +439,6 @@ void WebSockets::handleWebsocket(WSclient_t & client) { reasonCode = payload[0] << 8 | payload[1]; } #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); WS_PRINT("[WS]["); WS_PRINT(client.num); WS_PRINT("][handleWebsocket] get ask for close. Code: "); @@ -462,14 +446,12 @@ void WebSockets::handleWebsocket(WSclient_t & client) { #endif if(payloadLen > 2) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS(" (%s)\n", (payload+2)); WS_PRINT(" ("); WS_PRINT(reinterpret_cast(payload+2));//<<<------------------------------------------------ WS_PRINTLN(")"); #endif } else { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("\n"); WS_PRINTLN(); #endif } @@ -550,7 +532,6 @@ bool WebSockets::readWait(WSclient_t & client, uint8_t *out, size_t n) { while(n > 0) { if(!client.tcp) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[readWait] tcp is null!\n"); WS_PRINTLN("[readWait] tcp is null!"); #endif return false; @@ -558,7 +539,6 @@ bool WebSockets::readWait(WSclient_t & client, uint8_t *out, size_t n) { if(!client.tcp->connected()) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[readWait] not connected!\n"); WS_PRINTLN("[readWait] not connected!"); #endif return false; @@ -566,7 +546,6 @@ bool WebSockets::readWait(WSclient_t & client, uint8_t *out, size_t n) { if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { #ifdef WS_DEBUG - //DEBUG_WEBSOCKETS("[readWait] receive TIMEOUT!\n"); WS_PRINTLN("[readWait] receive TIMEOUT!"); #endif return false; @@ -584,9 +563,7 @@ bool WebSockets::readWait(WSclient_t & client, uint8_t *out, size_t n) { t = millis(); out += len; n -= len; - //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); } else { - //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); } #ifdef ESP8266 delay(0); diff --git a/src/WebSockets.h b/src/WebSockets.h index 1510760..f4169ff 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -30,9 +30,9 @@ //#define DEBUG_WEBSOCKETS // those macro have been added so the lib fit on arduino UNO -//#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp -//#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp -//#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer +#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp +#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp +#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer #ifdef DEBUG_WEBSOCKETS #define WS_PRINT(x) Serial.print(x); @@ -84,9 +84,8 @@ #define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer #elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) - -#include -//#include +#include +#include #define WEBSOCKETS_NETWORK_CLASS EthernetClient #define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer @@ -97,10 +96,8 @@ #define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer #elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) -#include #include #include -//#include #define WEBSOCKETS_NETWORK_CLASS EthernetClient #define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 6093295..e0a3e09 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -94,7 +94,6 @@ void WebSocketsClient::loop(void) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) if(_client.isSSL) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client] connect wss...\n"); WS_PRINTLN("[WS-Client] connect wss..."); #endif if(_client.ssl) { @@ -106,7 +105,6 @@ void WebSocketsClient::loop(void) { _client.tcp = _client.ssl; } else { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client] connect ws...\n"); WS_PRINTLN("[WS-Client] connect ws..."); #endif if(_client.tcp) { @@ -120,14 +118,12 @@ void WebSocketsClient::loop(void) { #endif if(!_client.tcp) { - //DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); WS_PRINTLN("[WS-Client] creating Network class failed!"); return; } if(_client.tcp->connect(_host.c_str(), _port)) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); WS_PRINT("[WS-Client] connected to "); WS_PRINT(_host.c_str()); WS_PRINT(":"); @@ -145,7 +141,6 @@ void WebSocketsClient::loop(void) { if(_client.isSSL && _fingerprint.length()) { if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!\n"); WS_PRINTLN("[WS-Client] creating Network class failed!"); #endif WebSockets::clientDisconnect(&_client, 1000); @@ -159,7 +154,6 @@ void WebSocketsClient::loop(void) { } else { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); WS_PRINT("[WS-Client] connection to "); WS_PRINT(_host.c_str()); WS_PRINT(":"); @@ -298,7 +292,6 @@ void WebSocketsClient::clientDisconnect(WSclient_t & client) { client.cIsWebsocket = false; client.status = WSC_NOT_CONNECTED; #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client] client disconnected.\n"); WS_PRINTLN("[WS-Client] client disconnected."); #endif runCbEvent(WStype_DISCONNECTED, NULL, 0); @@ -321,7 +314,6 @@ bool WebSocketsClient::clientIsConnected(WSclient_t & client) { // client lost if(client.status != WSC_NOT_CONNECTED) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); WS_PRINTLN("[WS-Client] connection lost."); #endif // do cleanup @@ -364,7 +356,6 @@ void WebSocketsClient::handleClientData(void) { */ void WebSocketsClient::sendHeader(WSclient_t & client) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header...\n"); WS_PRINTLN("[WS-Client][sendHeader] sending header..."); #endif uint8_t randomKey[16] = { 0 }; @@ -396,7 +387,6 @@ void WebSocketsClient::sendHeader(WSclient_t & client) { client.tcp->write(handshake.c_str(), handshake.length()); #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%uus).\n", (micros() - start)); WS_PRINT("[WS-Client][sendHeader] sending header... Done ("); WS_PRINT((micros() - start)); WS_PRINTLN("us)."); @@ -413,7 +403,6 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { if(headerLine.length() > 0) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine.c_str()); WS_PRINT("[WS-Client][handleHeader] RX: "); WS_PRINTLN(headerLine.c_str()); #endif @@ -444,7 +433,6 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { } } else { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); WS_PRINT("[WS-Client][handleHeader] Header error ("); WS_PRINT(headerLine.c_str()); WS_PRINTLN(")"); @@ -453,39 +441,25 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { } else { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header read fin.\n"); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Client settings:\n"); WS_PRINTLN("[WS-Client][handleHeader] Header read fin."); WS_PRINTLN("[WS-Client][handleHeader] Client settings:"); - - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cURL: %s\n", client->cUrl.c_str()); WS_PRINT("[WS-Client][handleHeader] - cURL: "); WS_PRINTLN(client.cUrl.c_str()); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cKey: %s\n", client->cKey.c_str()); WS_PRINTLN("[WS-Client][handleHeader] - cKey: "); WS_PRINTLN(client.cKey.c_str()); - - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Server header:\n"); WS_PRINTLN("[WS-Client][handleHeader] Server header:"); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cCode: %d\n", client->cCode); WS_PRINT("[WS-Client][handleHeader] - cCode: "); WS_PRINTLN(client.cCode); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsUpgrade: %d\n", client->cIsUpgrade); WS_PRINT("[WS-Client][handleHeader] - cIsUpgrade: "); WS_PRINTLN(client.cIsUpgrade); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsWebsocket: %d\n", client->cIsWebsocket); WS_PRINT("[WS-Client][handleHeader] - cIsWebsocket: "); WS_PRINTLN(client.cIsWebsocket); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cAccept: %s\n", client->cAccept.c_str()); WS_PRINT("[WS-Client][handleHeader] - cAccept: "); WS_PRINTLN(client.cAccept.c_str()); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cProtocol: %s\n", client->cProtocol.c_str()); WS_PRINT("[WS-Client][handleHeader] - cProtocol: "); WS_PRINTLN(client.cProtocol.c_str()); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cExtensions: %s\n", client->cExtensions.c_str()); WS_PRINT("[WS-Client][handleHeader] - cExtensions: "); WS_PRINTLN(client.cExtensions.c_str()); - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cVersion: %d\n", client->cVersion); WS_PRINT("[WS-Client][handleHeader] - cVersion: "); WS_PRINTLN(client.cVersion); #endif @@ -501,7 +475,6 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { default: ///< Server dont unterstand requrst ok = false; #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); WS_PRINT("[WS-Client][handleHeader] serverCode is not 101 ("); WS_PRINT(client.cCode); WS_PRINTLN(")"); @@ -519,7 +492,6 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { String sKey = acceptKey(client.cKey); if(sKey != client.cAccept) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong\n"); WS_PRINTLN("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong"); #endif ok = false; @@ -529,7 +501,6 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { if(ok) { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Websocket connection init done.\n"); WS_PRINTLN("[WS-Client][handleHeader] Websocket connection init done."); #endif client.status = WSC_CONNECTED; @@ -538,7 +509,6 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { } else { #ifdef WS_CLIENT_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] no Websocket connection close.\n"); WS_PRINTLN("[WS-Client][handleHeader] no Websocket connection close."); #endif client.tcp->write("This is a webSocket client!"); diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 73842ad..d1b70d4 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -73,7 +73,6 @@ void WebSocketsServer::begin(void) { _server->begin(); #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server] Server Started.\n"); WS_PRINTLN("[WS-Server] Server Started."); #endif } @@ -343,7 +342,6 @@ void WebSocketsServer::clientDisconnect(WSclient_t & client) { client.status = WSC_NOT_CONNECTED; #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("] client disconnected."); @@ -370,7 +368,6 @@ bool WebSocketsServer::clientIsConnected(WSclient_t & client) { // client lost if(client.status != WSC_NOT_CONNECTED) { #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("] client connection lost."); @@ -414,7 +411,6 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) IPAddress ip = client._client.remoteIP(); #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("] new client from "); @@ -427,7 +423,6 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { WS_PRINTLN(ip[3]); #endif #else - //------------->>>>>>to debug //DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); #ifdef WS_SERVER_DEBUG WS_PRINT("[WS-Server]["); WS_PRINT(client.num); @@ -481,7 +476,6 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { if(headerLine.length() > 0) { #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] RX: "); @@ -515,7 +509,6 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { } } else { #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); WS_PRINT("[WS-Client][handleHeader] Header error ("); WS_PRINT(headerLine.c_str()); WS_PRINTLN(")"); @@ -524,42 +517,33 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { } else { #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("][handleHeader] Header read fin."); - - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - cURL: "); WS_PRINTLN(client.cUrl.c_str()); - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - cIsUpgrade: "); WS_PRINTLN(client.cIsUpgrade); - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - cIsWebsocket: "); WS_PRINTLN(client.cIsWebsocket); - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - cKey: "); WS_PRINTLN(client.cKey.c_str()); - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - cProtocol: "); WS_PRINTLN(client.cProtocol.c_str()); - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - cExtensions: "); WS_PRINTLN(client.cExtensions.c_str()); - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - cVersion: "); @@ -581,7 +565,6 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { if(ok) { #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("][handleHeader] Websocket connection incomming."); @@ -589,7 +572,6 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { // generate Sec-WebSocket-Accept key String sKey = acceptKey(client.cKey); #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINT("][handleHeader] - sKey: "); diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index f13cd1f..073fa4f 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -103,7 +103,6 @@ class WebSocketsServer: private WebSockets { */ virtual void handleNonWebsocketConnection(WSclient_t & client) { #ifdef WS_SERVER_DEBUG - //DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("][handleHeader] no Websocket connection close."); @@ -118,7 +117,6 @@ class WebSocketsServer: private WebSockets { "This is a Websocket server only!"); clientDisconnect(client); } - /** * called for sending a Event to the app * @param num uint8_t @@ -131,9 +129,5 @@ class WebSocketsServer: private WebSockets { _cbEvent(num, type, payload, length); } } - }; - - - -#endif /* WEBSOCKETSSERVER_H_ */ +#endif /* WEBSOCKETSSERVER_H_ */ \ No newline at end of file From 9e4923b8157bef3732cd714074000eaedde3174e Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sat, 19 May 2018 09:11:56 -0400 Subject: [PATCH 08/12] add initializer list to WSclient_t --- src/WebSockets.h | 33 +++++++++++++++++++++++++-------- src/WebSocketsClient.cpp | 17 +++++++++-------- src/WebSocketsServer.cpp | 38 ++++++++++++++++++-------------------- src/WebSocketsServer.h | 2 +- 4 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/WebSockets.h b/src/WebSockets.h index f4169ff..13ee5ce 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -29,10 +29,10 @@ //#define DEBUG_WEBSOCKETS -// those macro have been added so the lib fit on arduino UNO -#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp -#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp -#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer +// those macro have been added to save program space +//#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp +//#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp +//#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer #ifdef DEBUG_WEBSOCKETS #define WS_PRINT(x) Serial.print(x); @@ -130,18 +130,35 @@ typedef enum { ///< %xB-F are reserved for further control frames } WSopcode_t; -typedef struct { +struct WSclient_t { + WSclient_t() : + num(-1), + status(WSC_NOT_CONNECTED), + tcp(NULL), + cUrl(""), + cCode(0), + cKey(""), + cProtocol(""), + cVersion(0), + cIsUpgrade(false), + cIsWebsocket(false) + { +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + client.isSSL = false; + client.ssl = NULL; +#endif + }; uint8_t num; ///< connection number WSclientsStatus_t status; WEBSOCKETS_NETWORK_CLASS * tcp; WEBSOCKETS_NETWORK_CLASS _client; -/* + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) bool isSSL; ///< run in ssl mode WiFiClientSecure * ssl; -#endif*/ +#endif String cUrl; ///< http url uint16_t cCode; ///< http code @@ -155,7 +172,7 @@ typedef struct { String cExtensions; ///< client Sec-WebSocket-Extensions uint16_t cVersion; ///< client Sec-WebSocket-Version -} WSclient_t; +}; class WebSockets { protected: diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index e0a3e09..68385b7 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -43,7 +43,7 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url) #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) _fingerprint = ""; #endif - +/* ///------ not needed anymore, initialized list _client.num = 0; _client.status = WSC_NOT_CONNECTED; _client.tcp = NULL; @@ -60,7 +60,7 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url) _client.cProtocol = ""; _client.cExtensions = ""; _client.cVersion = 0; - +*/ #ifdef ESP8266 randomSeed(RANDOM_REG32); #else @@ -271,8 +271,8 @@ void WebSocketsClient::clientDisconnect(WSclient_t & client) { client.ssl->stop(); } delete client.ssl; - client.ssl = NULL; - client.tcp = NULL; + //client.ssl = NULL; + //client.tcp = NULL; } #endif if(client.tcp) { @@ -281,16 +281,17 @@ void WebSocketsClient::clientDisconnect(WSclient_t & client) { client.tcp->stop(); } delete client.tcp; - client.tcp = NULL; + //client.tcp = NULL; } - client.cCode = 0; + /*client.cCode = 0; client.cKey = ""; client.cAccept = ""; client.cProtocol = ""; client.cVersion = 0; client.cIsUpgrade = false; client.cIsWebsocket = false; - client.status = WSC_NOT_CONNECTED; + client.status = WSC_NOT_CONNECTED;*/ + client = WSclient_t(); //reset client to 0 #ifdef WS_CLIENT_DEBUG WS_PRINTLN("[WS-Client] client disconnected."); #endif @@ -515,4 +516,4 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { clientDisconnect(client); } } -} \ No newline at end of file +} diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index d1b70d4..d200b8f 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -25,12 +25,9 @@ #include "WebSockets.h" #include "WebSocketsServer.h" -WebSocketsServer::WebSocketsServer(uint16_t port) { - _port = port; - _server = new WEBSOCKETS_NETWORK_SERVER_CLASS(port); - - _cbEvent = NULL; - +WebSocketsServer::WebSocketsServer(uint16_t port) : + _port(port), _server(new WEBSOCKETS_NETWORK_SERVER_CLASS(port)), _cbEvent(NULL) +{ } WebSocketsServer::~WebSocketsServer() { @@ -43,11 +40,9 @@ WebSocketsServer::~WebSocketsServer() { * calles to init the Websockets server */ void WebSocketsServer::begin(void) { - // init client storage - for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - + // init client storage /////////---- not needed anymore, client are already initialize when created + /* for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { WSclient_t & client = _clients[i]; - client.num = WEBSOCKETS_SERVER_CLIENT_MAX; //if MAX -> means unconnected client.status = WSC_NOT_CONNECTED; client.tcp = NULL; @@ -62,7 +57,7 @@ void WebSocketsServer::begin(void) { client.cVersion = 0; client.cIsUpgrade = false; client.cIsWebsocket = false; - } + }*/ #ifdef ESP8266 randomSeed(RANDOM_REG32); @@ -89,6 +84,7 @@ void WebSocketsServer::loop(void) { for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { if( _clients[i]._client == wsClient._client ) { //not a new client, handle data handleClientData(_clients[i]); + //todo ...---> add scedule sceck to see if client still connected ( ping pong ? ) return; } } @@ -330,24 +326,25 @@ void WebSocketsServer::clientDisconnect(WSclient_t & client) { client._client.stop(); } //delete client->tcp; - client.tcp = NULL; + //client.tcp = NULL; } - - client.cUrl = ""; + ////////////////////////////move to reset by initializer list + /*client.cUrl = ""; client.cKey = ""; client.cProtocol = ""; client.cVersion = 0; client.cIsUpgrade = false; client.cIsWebsocket = false; - client.status = WSC_NOT_CONNECTED; + client.status = WSC_NOT_CONNECTED;*/ #ifdef WS_SERVER_DEBUG WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("] client disconnected."); #endif runCbEvent(client.num, WStype_DISCONNECTED, NULL, 0); - client.num = WEBSOCKETS_SERVER_CLIENT_MAX; + //client.num = WEBSOCKETS_SERVER_CLIENT_MAX; + client = WSclient_t(); //reset client to 0 } /** @@ -358,7 +355,10 @@ void WebSocketsServer::clientDisconnect(WSclient_t & client) { bool WebSocketsServer::clientIsConnected(WSclient_t & client) { if (client.num >= WEBSOCKETS_SERVER_CLIENT_MAX) return false; - if (!client._client) return false; + if (!client._client) { + clientDisconnect(client); + return false; + } if(client._client.connected()) { if(client.status != WSC_NOT_CONNECTED) { @@ -392,7 +392,7 @@ bool WebSocketsServer::clientIsConnected(WSclient_t & client) { void WebSocketsServer::handleNewClients(WSclient_t & client) { bool ok = false; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) //not shure for ESP8266 - //while(_server->hasClient()) { ///<<----this conditionnal while make code not compile on arduino + while(_server->hasClient()) { #endif if(!clientIsConnected(client)) { #ifdef WS_SERVER_DEBUG @@ -606,5 +606,3 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { } } } - - diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 073fa4f..f5b5b56 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -130,4 +130,4 @@ class WebSocketsServer: private WebSockets { } } }; -#endif /* WEBSOCKETSSERVER_H_ */ \ No newline at end of file +#endif /* WEBSOCKETSSERVER_H_ */ From 56722349a25932c09d780d418c92d790d34fdd9e Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sat, 26 May 2018 08:54:37 -0400 Subject: [PATCH 09/12] fix newclient status --- src/WebSockets.h | 8 ++++---- src/WebSocketsClient.cpp | 4 ++++ src/WebSocketsServer.cpp | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/WebSockets.h b/src/WebSockets.h index 13ee5ce..77ff082 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -27,12 +27,12 @@ #include -//#define DEBUG_WEBSOCKETS +#define DEBUG_WEBSOCKETS // those macro have been added to save program space -//#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp -//#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp -//#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer +#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp +#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp +#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer #ifdef DEBUG_WEBSOCKETS #define WS_PRINT(x) Serial.print(x); diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 68385b7..f1e1947 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -332,17 +332,21 @@ bool WebSocketsClient::clientIsConnected(WSclient_t & client) { * Handel incomming data from Client */ void WebSocketsClient::handleClientData(void) { + WS_PRINTLN("handle client data"); int len = _client.tcp->available(); if(len > 0) { switch(_client.status) { case WSC_HEADER: handleHeader(_client); + WS_PRINTLN("data:handleHeader"); break; case WSC_CONNECTED: WebSockets::handleWebsocket(_client); + WS_PRINTLN("data: handle WS"); break; default: WebSockets::clientDisconnect(_client, 1002); + WS_PRINTLN("data: disc"); break; } } diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index d200b8f..db5e5c7 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -391,6 +391,7 @@ bool WebSocketsServer::clientIsConnected(WSclient_t & client) { void WebSocketsServer::handleNewClients(WSclient_t & client) { bool ok = false; + client.status = WSC_HEADER; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) //not shure for ESP8266 while(_server->hasClient()) { #endif @@ -407,7 +408,7 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { #endif // set Timeout for readBytesUntil and readStringUntil client._client.setTimeout(WEBSOCKETS_TCP_TIMEOUT); - client.status = WSC_HEADER; + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) IPAddress ip = client._client.remoteIP(); #ifdef WS_SERVER_DEBUG From 08b717ccad680efadf8f3b3867503ba1e25537d5 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sat, 26 May 2018 09:20:29 -0400 Subject: [PATCH 10/12] add client lost timeout --- src/WebSocketsServer.cpp | 9 +++++++++ src/WebSocketsServer.h | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index db5e5c7..45009d8 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -80,6 +80,15 @@ void WebSocketsServer::loop(void) { WSclient_t wsClient; wsClient._client = _server->available(); + //monitor for lost connect to clear socket + if ( timeOutCounter > timeoutClient ) { + for (uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + clientIsConnected(_clients[i]); + } + timeOutCounter = 0; + } + timeOutCounter++; + if (wsClient._client) { for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { if( _clients[i]._client == wsClient._client ) { //not a new client, handle data diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index f5b5b56..c46ad6d 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -36,6 +36,8 @@ #define WEBSOCKETS_SERVER_CLIENT_MAX (5) #endif +#define timeoutClient (uint32_t)120000 + class WebSocketsServer: private WebSockets { @@ -129,5 +131,7 @@ class WebSocketsServer: private WebSockets { _cbEvent(num, type, payload, length); } } +private: + uint32_t timeOutCounter = 0; }; #endif /* WEBSOCKETSSERVER_H_ */ From a51f34383cc30f8db46c51960504d019a6386c58 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Sun, 27 May 2018 08:30:03 -0400 Subject: [PATCH 11/12] finish migrate ptr to ref + add wsclient operator== + cleanup --- .../WebSocketClient.ino | 80 +++++++++++++++++ src/WebSockets.cpp | 15 ++-- src/WebSockets.h | 17 +++- src/WebSocketsClient.cpp | 70 ++++----------- src/WebSocketsServer.cpp | 87 ++++++------------- src/WebSocketsServer.h | 10 +-- 6 files changed, 144 insertions(+), 135 deletions(-) create mode 100644 examples/WebSocketClientEthernet2/WebSocketClient.ino diff --git a/examples/WebSocketClientEthernet2/WebSocketClient.ino b/examples/WebSocketClientEthernet2/WebSocketClient.ino new file mode 100644 index 0000000..477aa98 --- /dev/null +++ b/examples/WebSocketClientEthernet2/WebSocketClient.ino @@ -0,0 +1,80 @@ +/* + * WebSocketClient.ino + * + * Created on: 27.05.2018 + * + */ +#include +#include +#include + +WebSocketsClient webSocket; + +byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF}; +IPAddress ip(192, 168, 0, 110); +#define USE_SERIAL Serial + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t lenght) { + + + switch(type) { + case WStype_DISCONNECTED: + //USE_SERIAL.printf("[WSc] Disconnected!\n"); + USE_SERIAL << "[WSc] Disconnected!" << endl; + break; + case WStype_CONNECTED: + { + //USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + USE_SERIAL << "[WSc] Connected to url: " << (char*)payload << endl; + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + //USE_SERIAL.printf("[WSc] get text: %s\n", payload); + USE_SERIAL << "[WSc] get text: " << (char*)payload << endl; + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + //USE_SERIAL.printf("[WSc] get binary lenght: %u\n", lenght); + USE_SERIAL << "[WSc] get binary lenght: " << lenght << endl; + //hexdump(payload, lenght); + + // send data to server + // webSocket.sendBIN(payload, lenght); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + 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 << "[SETUP] BOOT WAIT " << t << "..." << endl; + USE_SERIAL.flush(); + delay(1000); + } + + Ethernet.begin(mac,ip); + USE_SERIAL << Ethernet.localIP() << endl; + + + + //webSocket.begin("wss://echo.websocket.org", 443); + webSocket.begin("ws://echo.websocket.org", 80); + webSocket.onEvent(webSocketEvent); + +} + +void loop() { + webSocket.loop(); +} \ No newline at end of file diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 48d164a..2b38aaf 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -84,7 +84,7 @@ void WebSockets::clientDisconnect(WSclient_t & client, uint16_t code, char * rea * @param headerToPayload bool set true if the payload has reserved 14 Byte at the beginning to dynamically add the Header (payload neet to be in RAM!) */ void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask, bool fin, bool headerToPayload) { - if(client.tcp && !client.tcp->connected()) { + if(client.tcp && !client.tcp.connected()) { #ifdef WS_DEBUG WS_PRINT("[WS]["); WS_PRINT(client.num); @@ -248,18 +248,17 @@ void WebSockets::sendFrame(WSclient_t & client, WSopcode_t opcode, uint8_t * pay // header has be added to payload // payload is forced to reserved 14 Byte but we may not need all based on the length and mask settings // offset in payload is calculatetd 14 - headerSize - client.tcp->write(&payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize)); + client.tcp.write(&payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize)); } else { // send header - client.tcp->write(&buffer[0], headerSize); + client.tcp.write(&buffer[0], headerSize); if(payloadPtr && length > 0) { // send payload - client.tcp->write(&payloadPtr[0], length); + client.tcp.write(&payloadPtr[0], length); } } - ////////////DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%uus).\n", client->num, (micros() - start)); #ifdef WEBSOCKETS_USE_BIG_MEM if(useInternBuffer && payloadPtr) { @@ -537,7 +536,7 @@ bool WebSockets::readWait(WSclient_t & client, uint8_t *out, size_t n) { return false; } - if(!client.tcp->connected()) { + if(!client.tcp.connected()) { #ifdef WS_DEBUG WS_PRINTLN("[readWait] not connected!"); #endif @@ -551,14 +550,14 @@ bool WebSockets::readWait(WSclient_t & client, uint8_t *out, size_t n) { return false; } - if(!client.tcp->available()) { + if(!client.tcp.available()) { #ifdef ESP8266 delay(0); #endif continue; } - len = client.tcp->read((uint8_t*) out, n); + len = client.tcp.read((uint8_t*) out, n); if(len) { t = millis(); out += len; diff --git a/src/WebSockets.h b/src/WebSockets.h index 77ff082..ea43a87 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -105,6 +105,14 @@ #error "no network type selected!" #endif +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) + #define WEBSOCKETS_SERVER_CLIENT_MAX (8) +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) + #define WEBSOCKETS_SERVER_CLIENT_MAX (4) +#else + #define WEBSOCKETS_SERVER_CLIENT_MAX (5) +#endif + typedef enum { WSC_NOT_CONNECTED, WSC_HEADER, @@ -143,17 +151,17 @@ struct WSclient_t { cIsUpgrade(false), cIsWebsocket(false) { + tcp = WEBSOCKETS_NETWORK_CLASS(); #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - client.isSSL = false; - client.ssl = NULL; + client.isSSL = false; + client.ssl = NULL; #endif }; uint8_t num; ///< connection number WSclientsStatus_t status; - WEBSOCKETS_NETWORK_CLASS * tcp; - WEBSOCKETS_NETWORK_CLASS _client; + WEBSOCKETS_NETWORK_CLASS tcp; #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) bool isSSL; ///< run in ssl mode @@ -171,6 +179,7 @@ struct WSclient_t { String cProtocol; ///< client Sec-WebSocket-Protocol String cExtensions; ///< client Sec-WebSocket-Extensions uint16_t cVersion; ///< client Sec-WebSocket-Version + bool operator==(const WSclient_t ws) { return num < WEBSOCKETS_SERVER_CLIENT_MAX && tcp == ws.tcp;}; }; diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index f1e1947..c29f3f4 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -43,24 +43,7 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url) #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) _fingerprint = ""; #endif -/* ///------ not needed anymore, initialized list - _client.num = 0; - _client.status = WSC_NOT_CONNECTED; - _client.tcp = NULL; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - _client.isSSL = false; - _client.ssl = NULL; -#endif - _client.cUrl = url; - _client.cCode = 0; - _client.cIsUpgrade = false; - _client.cIsWebsocket = true; - _client.cKey = ""; - _client.cAccept = ""; - _client.cProtocol = ""; - _client.cExtensions = ""; - _client.cVersion = 0; -*/ + #ifdef ESP8266 randomSeed(RANDOM_REG32); #else @@ -99,30 +82,16 @@ void WebSocketsClient::loop(void) { if(_client.ssl) { delete _client.ssl; _client.ssl = NULL; - _client.tcp = NULL; } _client.ssl = new WiFiClientSecure(); - _client.tcp = _client.ssl; } else { #ifdef WS_CLIENT_DEBUG WS_PRINTLN("[WS-Client] connect ws..."); #endif - if(_client.tcp) { - delete _client.tcp; - _client.tcp = NULL; - } - _client.tcp = new WiFiClient(); } -#else - _client.tcp = new WEBSOCKETS_NETWORK_CLASS(); #endif - if(!_client.tcp) { - WS_PRINTLN("[WS-Client] creating Network class failed!"); - return; - } - - if(_client.tcp->connect(_host.c_str(), _port)) { + if(_client.tcp.connect(_host.c_str(), _port)) { #ifdef WS_CLIENT_DEBUG WS_PRINT("[WS-Client] connected to "); WS_PRINT(_host.c_str()); @@ -133,10 +102,10 @@ void WebSocketsClient::loop(void) { _client.status = WSC_HEADER; // set Timeout for readBytesUntil and readStringUntil - _client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); + _client.tcp.setTimeout(WEBSOCKETS_TCP_TIMEOUT); #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - _client.tcp->setNoDelay(true); + _client.tcp.setNoDelay(true); if(_client.isSSL && _fingerprint.length()) { if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { @@ -271,26 +240,15 @@ void WebSocketsClient::clientDisconnect(WSclient_t & client) { client.ssl->stop(); } delete client.ssl; - //client.ssl = NULL; - //client.tcp = NULL; } #endif if(client.tcp) { - if(client.tcp->connected()) { - client.tcp->flush(); - client.tcp->stop(); + if(client.tcp.connected()) { + client.tcp.flush(); + client.tcp.stop(); } - delete client.tcp; - //client.tcp = NULL; } - /*client.cCode = 0; - client.cKey = ""; - client.cAccept = ""; - client.cProtocol = ""; - client.cVersion = 0; - client.cIsUpgrade = false; - client.cIsWebsocket = false; - client.status = WSC_NOT_CONNECTED;*/ + client = WSclient_t(); //reset client to 0 #ifdef WS_CLIENT_DEBUG WS_PRINTLN("[WS-Client] client disconnected."); @@ -307,7 +265,7 @@ bool WebSocketsClient::clientIsConnected(WSclient_t & client) { if(!client.tcp) { return false; } - if(client.tcp->connected()) { + if(client.tcp.connected()) { if(client.status != WSC_NOT_CONNECTED) { return true; } @@ -332,8 +290,10 @@ bool WebSocketsClient::clientIsConnected(WSclient_t & client) { * Handel incomming data from Client */ void WebSocketsClient::handleClientData(void) { +#ifdef WS_CLIENT_DEBUG WS_PRINTLN("handle client data"); - int len = _client.tcp->available(); +#endif + int len = _client.tcp.available(); if(len > 0) { switch(_client.status) { case WSC_HEADER: @@ -390,7 +350,7 @@ void WebSocketsClient::sendHeader(WSclient_t & client) { handshake += "\r\n"; - client.tcp->write(handshake.c_str(), handshake.length()); + client.tcp.write(handshake.c_str(), handshake.length()); #ifdef WS_CLIENT_DEBUG WS_PRINT("[WS-Client][sendHeader] sending header... Done ("); WS_PRINT((micros() - start)); @@ -403,7 +363,7 @@ void WebSocketsClient::sendHeader(WSclient_t & client) { * @param client WSclient_t * ptr to the client struct */ void WebSocketsClient::handleHeader(WSclient_t & client) { - String headerLine = client.tcp->readStringUntil('\n'); + String headerLine = client.tcp.readStringUntil('\n'); headerLine.trim(); // remove \r if(headerLine.length() > 0) { @@ -516,7 +476,7 @@ void WebSocketsClient::handleHeader(WSclient_t & client) { #ifdef WS_CLIENT_DEBUG WS_PRINTLN("[WS-Client][handleHeader] no Websocket connection close."); #endif - client.tcp->write("This is a webSocket client!"); + client.tcp.write("This is a webSocket client!"); clientDisconnect(client); } } diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 45009d8..215dfc0 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -40,24 +40,6 @@ WebSocketsServer::~WebSocketsServer() { * calles to init the Websockets server */ void WebSocketsServer::begin(void) { - // init client storage /////////---- not needed anymore, client are already initialize when created - /* for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - WSclient_t & client = _clients[i]; - client.num = WEBSOCKETS_SERVER_CLIENT_MAX; //if MAX -> means unconnected - client.status = WSC_NOT_CONNECTED; - client.tcp = NULL; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - client.isSSL = false; - client.ssl = NULL; -#endif - client.cUrl = ""; - client.cCode = 0; - client.cKey = ""; - client.cProtocol = ""; - client.cVersion = 0; - client.cIsUpgrade = false; - client.cIsWebsocket = false; - }*/ #ifdef ESP8266 randomSeed(RANDOM_REG32); @@ -70,6 +52,7 @@ void WebSocketsServer::begin(void) { #ifdef WS_SERVER_DEBUG WS_PRINTLN("[WS-Server] Server Started."); #endif + } /** @@ -78,7 +61,7 @@ void WebSocketsServer::begin(void) { void WebSocketsServer::loop(void) { //check if client, if it is a new client WSclient_t wsClient; - wsClient._client = _server->available(); + wsClient.tcp = _server->available(); //monitor for lost connect to clear socket if ( timeOutCounter > timeoutClient ) { @@ -89,26 +72,24 @@ void WebSocketsServer::loop(void) { } timeOutCounter++; - if (wsClient._client) { + if (wsClient.tcp) { for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - if( _clients[i]._client == wsClient._client ) { //not a new client, handle data + if( _clients[i] == wsClient ) {//not a new client, handle data handleClientData(_clients[i]); - //todo ...---> add scedule sceck to see if client still connected ( ping pong ? ) return; } } //if you got to that point, it is a new client for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - if (!_clients[i]._client) { //if emty slot, assing new client then handle it. + if (_clients[i].num >= WEBSOCKETS_SERVER_CLIENT_MAX) { //if emty slot, assing new client then handle it. wsClient.num = i; _clients[i] = wsClient; - _clients[i].tcp = &_clients[i]._client; handleNewClients(_clients[i]); return; } } - wsClient._client.stop(); //close connection is no free spot + wsClient.tcp.stop(); //close connection is no free spot #ifdef WS_SERVER_DEBUG WS_PRINTLN("[WS-Server] No free socket, connection close"); #endif @@ -244,7 +225,6 @@ void WebSocketsServer::broadcastBIN(const uint8_t * payload, size_t length) { * disconnect all clients */ void WebSocketsServer::disconnect(void) { - WSclient_t * client; for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { WSclient_t & client = _clients[i]; if(clientIsConnected(client)) { @@ -275,9 +255,9 @@ void WebSocketsServer::disconnect(uint8_t num) { */ IPAddress WebSocketsServer::remoteIP(uint8_t num) { if(num < WEBSOCKETS_SERVER_CLIENT_MAX) { - WSclient_t * client = &_clients[num]; - if(clientIsConnected(*client)) { - return client->tcp->remoteIP(); + WSclient_t & client = clients[num]; + if(clientIsConnected(client)) { + return client.tcp.remoteIP(); } } @@ -325,34 +305,23 @@ void WebSocketsServer::clientDisconnect(WSclient_t & client) { } delete client->ssl; client.ssl = NULL; - client.tcp = NULL; } #endif - if(client._client) { - if(client._client.connected()) { - client._client.flush(); - client._client.stop(); + if(client.tcp) { + if(client.tcp.connected()) { + client.tcp.flush(); + client.tcp.stop(); } - //delete client->tcp; - //client.tcp = NULL; } - ////////////////////////////move to reset by initializer list - /*client.cUrl = ""; - client.cKey = ""; - client.cProtocol = ""; - client.cVersion = 0; - client.cIsUpgrade = false; - client.cIsWebsocket = false; - - client.status = WSC_NOT_CONNECTED;*/ + #ifdef WS_SERVER_DEBUG WS_PRINT("[WS-Server]["); WS_PRINT(client.num); WS_PRINTLN("] client disconnected."); #endif + runCbEvent(client.num, WStype_DISCONNECTED, NULL, 0); - //client.num = WEBSOCKETS_SERVER_CLIENT_MAX; client = WSclient_t(); //reset client to 0 } @@ -364,12 +333,12 @@ void WebSocketsServer::clientDisconnect(WSclient_t & client) { bool WebSocketsServer::clientIsConnected(WSclient_t & client) { if (client.num >= WEBSOCKETS_SERVER_CLIENT_MAX) return false; - if (!client._client) { + if (!client.tcp) { clientDisconnect(client); return false; } - if(client._client.connected()) { + if(client.tcp.connected()) { if(client.status != WSC_NOT_CONNECTED) { return true; } @@ -386,7 +355,7 @@ bool WebSocketsServer::clientIsConnected(WSclient_t & client) { } } - if(client._client) { + if(client.tcp) { // do cleanup clientDisconnect(client); } @@ -413,13 +382,13 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) client.isSSL = false; - client._client.setNoDelay(true); + client.tcp.setNoDelay(true); #endif // set Timeout for readBytesUntil and readStringUntil - client._client.setTimeout(WEBSOCKETS_TCP_TIMEOUT); + client.tcp.setTimeout(WEBSOCKETS_TCP_TIMEOUT); #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - IPAddress ip = client._client.remoteIP(); + IPAddress ip = client.tcp.remoteIP(); #ifdef WS_SERVER_DEBUG WS_PRINT("[WS-Server]["); WS_PRINT(client.num); @@ -454,7 +423,7 @@ void WebSocketsServer::handleNewClients(WSclient_t & client) { void WebSocketsServer::handleClientData(WSclient_t & client) { if(clientIsConnected(client)) { - int len = client._client.available(); + int len = client.tcp.available(); if(len > 0) { switch(client.status) { @@ -481,7 +450,7 @@ void WebSocketsServer::handleClientData(WSclient_t & client) { */ void WebSocketsServer::handleHeader(WSclient_t & client) { - String headerLine = client._client.readStringUntil('\n'); + String headerLine = client.tcp.readStringUntil('\n'); headerLine.trim(); // remove \r if(headerLine.length() > 0) { @@ -589,22 +558,22 @@ void WebSocketsServer::handleHeader(WSclient_t & client) { #endif client.status = WSC_CONNECTED; - client._client.write("HTTP/1.1 101 Switching Protocols\r\n" + client.tcp.write("HTTP/1.1 101 Switching Protocols\r\n" "Server: arduino-WebSocketsServer\r\n" "Upgrade: websocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Version: 13\r\n" "Sec-WebSocket-Accept: "); - client._client.write(sKey.c_str(), sKey.length()); - client._client.write("\r\n"); + client.tcp.write(sKey.c_str(), sKey.length()); + client.tcp.write("\r\n"); if(client.cProtocol.length() > 0) { // TODO add api to set Protocol of Server - client._client.write("Sec-WebSocket-Protocol: arduino\r\n"); + client.tcp.write("Sec-WebSocket-Protocol: arduino\r\n"); } // header end - client._client.write("\r\n"); + client.tcp.write("\r\n"); // send ping WebSockets::sendFrame(client, WSop_ping); diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index c46ad6d..6f6ee41 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -28,14 +28,6 @@ #include #include "WebSockets.h" -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) - #define WEBSOCKETS_SERVER_CLIENT_MAX (8) -#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) - #define WEBSOCKETS_SERVER_CLIENT_MAX (4) -#else - #define WEBSOCKETS_SERVER_CLIENT_MAX (5) -#endif - #define timeoutClient (uint32_t)120000 @@ -109,7 +101,7 @@ class WebSocketsServer: private WebSockets { WS_PRINT(client.num); WS_PRINTLN("][handleHeader] no Websocket connection close."); #endif - client._client.write("HTTP/1.1 400 Bad Request\r\n" + client.tcp.write("HTTP/1.1 400 Bad Request\r\n" "Server: arduino-WebSocket-Server\r\n" "Content-Type: text/plain\r\n" "Content-Length: 32\r\n" From b8ba56a1f5cd3c05700991f86a1f2760195cfc31 Mon Sep 17 00:00:00 2001 From: NitrofMtl Date: Tue, 31 Jul 2018 08:46:02 -0400 Subject: [PATCH 12/12] move to ethernet2.0 lib --- src/WebSockets.h | 38 ++++++++++++++++++++++++-------------- src/WebSocketsServer.cpp | 5 +---- src/WebSocketsServer.h | 4 ++-- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/WebSockets.h b/src/WebSockets.h index ea43a87..c250621 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -27,12 +27,12 @@ #include -#define DEBUG_WEBSOCKETS +//#define DEBUG_WEBSOCKETS // those macro have been added to save program space -#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp -#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp -#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer +//#define WS_DEBUG //unmute this to display debug print from websockets.h and cpp +//#define WS_CLIENT_DEBUG //unmute this to display debug print from websocketsClient.h and cpp +//#define WS_SERVER_DEBUG //unmute this to display debug print from websocketsServer #ifdef DEBUG_WEBSOCKETS #define WS_PRINT(x) Serial.print(x); @@ -45,7 +45,7 @@ //Unmute to select Ethernet2 sheild library -#define W5500_H +//#define W5500_H //remove with ethernet library 2.0 #ifdef ESP8266 #define WEBSOCKETS_MAX_DATA_SIZE (15*1024) @@ -58,18 +58,22 @@ #define WEBSOCKETS_TCP_TIMEOUT (1500) #define NETWORK_ESP8266 (1) -#define NETWORK_W5100 (2) +//#define NETWORK_W5100 (2) //replace with ethernet library 2.0 +#define NETWORK_W5X00 (2) #define NETWORK_ENC28J60 (3) -#define NETWORK_W5500 (4) +//#define NETWORK_W5500 (4) //replace with ethernet library 2.0 + // select Network type based #ifdef ESP8266 #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 -#elif defined W5500_H +/*#elif defined W5500_H #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5500 #else -#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 +#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100*/ +#else +#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5X00 //replace with ethernet library 2.0 #endif @@ -83,7 +87,8 @@ #define WEBSOCKETS_NETWORK_CLASS WiFiClient #define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer -#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) +//#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) //replace with ethernet library 2.0 +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5X00) #include #include #define WEBSOCKETS_NETWORK_CLASS EthernetClient @@ -95,20 +100,25 @@ #define WEBSOCKETS_NETWORK_CLASS UIPClient #define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer -#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) +/* +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) //remove with ethernet library 2.0 #include #include #define WEBSOCKETS_NETWORK_CLASS EthernetClient #define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer +*/ #else -#error "no network type selected!" +//#error "no network type selected!" #endif -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) +/* +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5500) //replace with ethernet library 2.0 #define WEBSOCKETS_SERVER_CLIENT_MAX (8) #elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) - #define WEBSOCKETS_SERVER_CLIENT_MAX (4) + #define WEBSOCKETS_SERVER_CLIENT_MAX (4)*/ +#ifdef MAX_SOCK_NUM + #define WEBSOCKETS_SERVER_CLIENT_MAX (MAX_SOCK_NUM) #else #define WEBSOCKETS_SERVER_CLIENT_MAX (5) #endif diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 215dfc0..5d02257 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -247,7 +247,6 @@ void WebSocketsServer::disconnect(uint8_t num) { } } -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) /** * get an IP for a client * @param num uint8_t client id @@ -255,15 +254,13 @@ void WebSocketsServer::disconnect(uint8_t num) { */ IPAddress WebSocketsServer::remoteIP(uint8_t num) { if(num < WEBSOCKETS_SERVER_CLIENT_MAX) { - WSclient_t & client = clients[num]; + WSclient_t & client = _clients[num]; if(clientIsConnected(client)) { return client.tcp.remoteIP(); } } - return IPAddress(); } -#endif //################################################################################# //################################################################################# diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 6f6ee41..3867d6a 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -67,9 +67,9 @@ class WebSocketsServer: private WebSockets { void disconnect(void); void disconnect(uint8_t num); -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +//#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) IPAddress remoteIP(uint8_t num); -#endif +//#endif protected: uint16_t _port;