From dd623244f4d8bb8ac02342bf9a4d0ba64df51151 Mon Sep 17 00:00:00 2001 From: pierdr Date: Tue, 23 Jan 2018 11:26:08 -0800 Subject: [PATCH 1/6] MKR1000 Websocket server, first attempt, Disconnection Loop still there --- .gitignore | 5 ++ src/WebSockets.cpp | 145 +++++++++++++++++++++++++++++---------- src/WebSockets.h | 21 ++++-- src/WebSocketsClient.cpp | 52 ++++++++++---- src/WebSocketsClient.h | 0 src/WebSocketsServer.cpp | 98 +++++++++++++++++++------- src/WebSocketsServer.h | 9 ++- 7 files changed, 245 insertions(+), 85 deletions(-) mode change 100644 => 100755 src/WebSockets.cpp mode change 100644 => 100755 src/WebSockets.h mode change 100644 => 100755 src/WebSocketsClient.cpp mode change 100644 => 100755 src/WebSocketsClient.h mode change 100644 => 100755 src/WebSocketsServer.cpp mode change 100644 => 100755 src/WebSocketsServer.h diff --git a/.gitignore b/.gitignore index 44b2c85..3964c76 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,8 @@ *.out *.app /tests/webSocketServer/node_modules + +.DS_Store +*/.DS_Store +*/**/.DS_Store + diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp old mode 100644 new mode 100755 index 4ec9a1f..1e6735b --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -55,8 +55,16 @@ extern "C" { * @param reason * @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); +void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); + #else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][handleWebsocket] clientDisconnect code:"); + DEBUG_WEBSOCKETS(code); + DEBUG_WEBSOCKETS("\n"); + #endif if(client->status == WSC_CONNECTED && code) { if(reason) { sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen); @@ -82,21 +90,48 @@ 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); + if(client->tcp && !client->tcp->connected()) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); + #else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][sendFrame] not Connected!?\n"); + #endif return; } - if(client->status != WSC_CONNECTED) { - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); + if(client->status != WSC_CONNECTED) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); + #else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][sendFrame] not in WSC_CONNECTED state!?\n"); + #endif + 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); - - if(opcode == WSop_text) { - DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + 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); + #else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][sendFrame] ------- send massage frame -------\n"); + #endif + + + if(opcode == WSop_text) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); + #else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][sendFrame] text:"); + //DEBUG_WEBSOCKETS(String(payload + (headerToPayload ? 14 : 0))); + DEBUG_WEBSOCKETS("\n"); + #endif } uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; @@ -125,7 +160,14 @@ 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); + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); + #else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][sendFrame] pack to one TCP package...\n"); + #endif uint8_t * dataPtr = (uint8_t *) malloc(length + WEBSOCKETS_MAX_HEADER_SIZE); if(dataPtr) { memcpy((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length); @@ -226,9 +268,16 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay client->tcp->write(&payloadPtr[0], length); } } - +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%uus).\n", client->num, (micros() - start)); - +#else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][sendFrame] sending Frame Done ("); + DEBUG_WEBSOCKETS((micros() - start)); + DEBUG_WEBSOCKETS("\n"); +#endif + #ifdef WEBSOCKETS_USE_BIG_MEM if(useInternBuffer && payloadPtr) { free(payloadPtr); @@ -257,8 +306,14 @@ void WebSockets::handleWebsocket(WSclient_t * client) { uint8_t * payload = NULL; - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); - + + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); + #else + DEBUG_WEBSOCKETS("[WS]["); + DEBUG_WEBSOCKETS(client->num); + DEBUG_WEBSOCKETS("][handleWebsocket] ------- read massage frame -------\n"); + #endif if(!readWait(client, buffer, 2)) { //timeout clientDisconnect(client, 1002); @@ -297,12 +352,14 @@ void WebSockets::handleWebsocket(WSclient_t * client) { payloadLen = buffer[4] << 24 | buffer[5] << 16 | buffer[6] << 8 | buffer[7]; } } - - 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); - - if(payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen); + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + 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); + #endif + if(payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen); + #endif clientDisconnect(client, 1009); return; } @@ -319,14 +376,18 @@ void WebSockets::handleWebsocket(WSclient_t * client) { // if text data we need one more payload = (uint8_t *) malloc(payloadLen + 1); - if(!payload) { - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen); + if(!payload) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen); + #endif clientDisconnect(client, 1011); return; } - if(!readWait(client, payload, payloadLen)) { - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); + if(!readWait(client, payload, payloadLen)) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); + #endif free(payload); clientDisconnect(client, 1002); return; @@ -343,8 +404,10 @@ void WebSockets::handleWebsocket(WSclient_t * client) { } switch(opCode) { - case WSop_text: - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + case WSop_text: + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + #endif // no break here! case WSop_binary: messageRecived(client, opCode, payload, payloadLen); @@ -353,8 +416,10 @@ void WebSockets::handleWebsocket(WSclient_t * client) { // send pong back sendFrame(client, WSop_pong, payload, payloadLen); break; - case WSop_pong: - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); + case WSop_pong: + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); + #endif break; case WSop_close: { @@ -362,12 +427,18 @@ void WebSockets::handleWebsocket(WSclient_t * client) { if(payloadLen >= 2) { reasonCode = payload[0] << 8 | payload[1]; } - - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); - if(payloadLen > 2) { - DEBUG_WEBSOCKETS(" (%s)\n", (payload+2)); - } else { - DEBUG_WEBSOCKETS("\n"); + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); + #endif + + if(payloadLen > 2) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS(" (%s)\n", (payload+2)); + #endif + } else { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("\n"); + #endif } clientDisconnect(client, 1000); } diff --git a/src/WebSockets.h b/src/WebSockets.h old mode 100644 new mode 100755 index ffccf80..44c798c --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -26,9 +26,12 @@ #define WEBSOCKETS_H_ #include +#include + //#define DEBUG_WEBSOCKETS(...) Serial1.printf( __VA_ARGS__ ) - +//#define DEBUG_WEBSOCKETS(...) Serial.print( __VA_ARGS__ ) +#define DEBUG_WEBSOCKETS(A) Serial.print(A) #ifndef DEBUG_WEBSOCKETS #define DEBUG_WEBSOCKETS(...) #define NODEBUG_WEBSOCKETS @@ -46,14 +49,15 @@ #define NETWORK_ESP8266 (1) #define NETWORK_W5100 (2) -#define NETWORK_ENC28J60 (3) +#define NETWORK_ENC28J60 (3) +#define NETWORK_WIFI101 (4) // select Network type based #ifdef ESP8266 #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 #else -#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 +#define WEBSOCKETS_NETWORK_TYPE NETWORK_WIFI101 #endif @@ -69,7 +73,7 @@ #elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) -#include +#include #include #define WEBSOCKETS_NETWORK_CLASS EthernetClient #define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer @@ -78,8 +82,15 @@ #include #define WEBSOCKETS_NETWORK_CLASS UIPClient -#define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer +#define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer +#elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_WIFI101) + +#include +#include +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + #else #error "no network type selected!" #endif diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp old mode 100644 new mode 100755 index d398aad..bc86d99 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -118,9 +118,16 @@ void WebSocketsClient::loop(void) { return; } - if(_client.tcp->connect(_host.c_str(), _port)) { + if(_client.tcp->connect(_host.c_str(), _port)) { +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); - +#else + DEBUG_WEBSOCKETS("[WS-Client] connected to"); + DEBUG_WEBSOCKETS( _host.c_str()); + DEBUG_WEBSOCKETS(":"); + DEBUG_WEBSOCKETS(_port); + DEBUG_WEBSOCKETS("\n"); +#endif _client.status = WSC_HEADER; // set Timeout for readBytesUntil and readStringUntil @@ -142,7 +149,16 @@ void WebSocketsClient::loop(void) { sendHeader(&_client); } else { - DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); +#else + DEBUG_WEBSOCKETS("[WS-Client] connection to"); + DEBUG_WEBSOCKETS( _host.c_str()); + DEBUG_WEBSOCKETS(":"); + DEBUG_WEBSOCKETS(_port); + DEBUG_WEBSOCKETS(" Failed\n"); +#endif delay(10); //some litle delay to not flood the server } } else { @@ -378,9 +394,9 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { handshake += "\r\n"; client->tcp->write(handshake.c_str(), handshake.length()); - - DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%uus).\n", (micros() - start)); - + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%uus).\n", (micros() - start)); + #endif } /** @@ -392,9 +408,10 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { String headerLine = client->tcp->readStringUntil('\n'); headerLine.trim(); // remove \r - if(headerLine.length() > 0) { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine.c_str()); - + if(headerLine.length() > 0) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine.c_str()); + #endif if(headerLine.startsWith("HTTP/1.")) { // "HTTP/1.1 101 Switching Protocols" client->cCode = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt(); @@ -420,11 +437,14 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Version")) { client->cVersion = headerValue.toInt(); } - } else { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + } else { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + #endif } - } else { + } else { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header read fin.\n"); DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Client settings:\n"); @@ -439,7 +459,7 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { 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); - + #endif bool ok = (client->cIsUpgrade && client->cIsWebsocket); if(ok) { @@ -450,8 +470,10 @@ void WebSocketsClient::handleHeader(WSclient_t * client) { case 403: ///< Forbidden // todo handle login default: ///< Server dont unterstand requrst - ok = false; - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); + ok = false; + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); + #endif clientDisconnect(client); break; } diff --git a/src/WebSocketsClient.h b/src/WebSocketsClient.h old mode 100644 new mode 100755 diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp old mode 100644 new mode 100755 index 5ec4eca..b44b7b6 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -321,9 +321,13 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { client->cIsWebsocket = false; client->status = WSC_NOT_CONNECTED; - +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); - +#else + DEBUG_WEBSOCKETS("[WS-Server]["); + DEBUG_WEBSOCKETS(client->num); + DEBUG_WEBSOCKETS("] client disconnected.\n"); +#endif runCbEvent(client->num, WStype_DISCONNECTED, NULL, 0); } @@ -345,8 +349,15 @@ 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); + if(client->status != WSC_NOT_CONNECTED) { +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); +#else + DEBUG_WEBSOCKETS("[WS-Server]["); + DEBUG_WEBSOCKETS(client->num); + DEBUG_WEBSOCKETS("] client connection lost.\n"); +#endif + // do cleanup clientDisconnect(client); } @@ -364,10 +375,11 @@ bool WebSocketsServer::clientIsConnected(WSclient_t * client) { * Handle incomming Connection Request */ void WebSocketsServer::handleNewClients(void) { - WSclient_t * client; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - while(_server->hasClient()) { -#endif + WSclient_t * client; +// Serial.println("handling new client"); +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + while(_server-> ->hasClient()) { +#endif bool ok = false; // search free list entry for client for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { @@ -379,7 +391,8 @@ void WebSocketsServer::handleNewClients(void) { // store new connection client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available()); #else - client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available()); + client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available()); + #endif if(!client->tcp) { DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); @@ -396,8 +409,10 @@ void WebSocketsServer::handleNewClients(void) { #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]); -#else - DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); +#else + DEBUG_WEBSOCKETS("[WS-Server]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("] new client\n"); #endif ok = true; break; @@ -419,16 +434,16 @@ void WebSocketsServer::handleNewClients(void) { #ifdef ESP8266 delay(0); #endif -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) } -#endif +#endif } /** * Handel incomming data from Client */ void WebSocketsServer::handleClientData(void) { - +// Serial.println("handling client data"); WSclient_t * client; for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { client = &_clients[i]; @@ -442,9 +457,12 @@ void WebSocketsServer::handleClientData(void) { break; case WSC_CONNECTED: WebSockets::handleWebsocket(client); + break; + case WSC_NOT_CONNECTED: + WebSockets::clientDisconnect(client, 1002); break; default: - WebSockets::clientDisconnect(client, 1002); + break; } } @@ -464,9 +482,16 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { String headerLine = client->tcp->readStringUntil('\n'); headerLine.trim(); // remove \r - if(headerLine.length() > 0) { - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); - + if(headerLine.length() > 0) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); + #else + DEBUG_WEBSOCKETS("[WS-Server]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][handleHeader] RX:"); + DEBUG_WEBSOCKETS(headerLine.c_str()); + DEBUG_WEBSOCKETS("\n"); + #endif // websocket request starts allways with GET see rfc6455 if(headerLine.startsWith("GET ")) { // cut URL out @@ -493,11 +518,18 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Extensions")) { client->cExtensions = headerValue; } - } else { - DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + } else { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine.c_str()); + #else + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error ("); + DEBUG_WEBSOCKETS( headerLine.c_str()); + DEBUG_WEBSOCKETS(")\n"); + #endif } - } else { + } else { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) 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()); @@ -507,7 +539,7 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { 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); - + #endif bool ok = (client->cIsUpgrade && client->cIsWebsocket); if(ok) { @@ -523,14 +555,28 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { } if(ok) { - - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num); + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num); + #else + DEBUG_WEBSOCKETS("[WS-Server]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][handleHeader] Websocket connection incomming.\n"); + #endif + // generate Sec-WebSocket-Accept key String sKey = acceptKey(client->cKey); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); - + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); +#else + DEBUG_WEBSOCKETS("[WS-Server]["); + DEBUG_WEBSOCKETS( client->num); + DEBUG_WEBSOCKETS("][handleHeader] - sKey: "); + DEBUG_WEBSOCKETS( sKey.c_str()); + DEBUG_WEBSOCKETS("\n"); +#endif client->status = WSC_CONNECTED; client->tcp->write("HTTP/1.1 101 Switching Protocols\r\n" diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h old mode 100644 new mode 100755 index ebc76b2..71b05bc --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -96,8 +96,13 @@ class WebSocketsServer: private WebSockets { * Note: can be overrided * @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); + virtual void handleNonWebsocketConnection(WSclient_t * client) { + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); +#else + DEBUG_WEBSOCKETS("[WS-Server][handleHeader] no Websocket connection close.\n"); +#endif + client->tcp->write("HTTP/1.1 400 Bad Request\r\n" "Server: arduino-WebSocket-Server\r\n" "Content-Type: text/plain\r\n" From b43f514ca3881ce923328119fd6aee9d43111e91 Mon Sep 17 00:00:00 2001 From: pierdr Date: Tue, 23 Jan 2018 13:08:40 -0800 Subject: [PATCH 2/6] debugging printl on handleNewClients - starting line 377 WSS.cpp --- src/WebSocketsServer.cpp | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index b44b7b6..a607b27 100755 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -378,20 +378,35 @@ void WebSocketsServer::handleNewClients(void) { WSclient_t * client; // Serial.println("handling new client"); #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - while(_server-> ->hasClient()) { + while(_server-> ->hasClient()) { +#else +// WiFiClient clientContainer = _server->available(); +// while(clientContainer){ #endif bool ok = false; - // search free list entry for client + // search free list entry for client + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + DEBUG_WEBSOCKETS("[WS-Server]["); + DEBUG_WEBSOCKETS(i); + DEBUG_WEBSOCKETS("] this client is connected: "); + DEBUG_WEBSOCKETS(clientIsConnected(client)); + DEBUG_WEBSOCKETS("\n"); + } for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; - + client = &_clients[i]; + + DEBUG_WEBSOCKETS("looping for "); + DEBUG_WEBSOCKETS(i); + DEBUG_WEBSOCKETS(" times\n"); // 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()); +#else + + client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available());//&clientContainer ; #endif if(!client->tcp) { @@ -405,14 +420,17 @@ void WebSocketsServer::handleNewClients(void) { #endif // set Timeout for readBytesUntil and readStringUntil client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); - client->status = WSC_HEADER; -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + client->status = WSC_HEADER; IPAddress ip = client->tcp->remoteIP(); +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); #else DEBUG_WEBSOCKETS("[WS-Server]["); DEBUG_WEBSOCKETS( client->num); - DEBUG_WEBSOCKETS("] new client\n"); + DEBUG_WEBSOCKETS("] new client from:"); + DEBUG_WEBSOCKETS(ip); + DEBUG_WEBSOCKETS("\n"); #endif ok = true; break; @@ -435,7 +453,9 @@ void WebSocketsServer::handleNewClients(void) { delay(0); #endif #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - } + } +#else + //} #endif } From fa5223271f2de1bbbdb5935c942e1a27502c283e Mon Sep 17 00:00:00 2001 From: pierdr Date: Tue, 23 Jan 2018 23:40:31 -0800 Subject: [PATCH 3/6] ws server works with one client - to be tested with more --- src/WebSocketsServer.cpp | 62 +++++++++++++++++++++++++++++++--------- src/WebSocketsServer.h | 2 +- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index a607b27..be4bd4f 100755 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -378,21 +378,48 @@ void WebSocketsServer::handleNewClients(void) { WSclient_t * client; // Serial.println("handling new client"); #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - while(_server-> ->hasClient()) { + while(_server->hasClient()) { #else -// WiFiClient clientContainer = _server->available(); -// while(clientContainer){ + WiFiClient clientContainer = _server->available(); + while(clientContainer){ + + IPAddress ipContainer = clientContainer.remoteIP(); + + int firstNum = ipContainer[0]; + int secondNum = ipContainer[1]; + int thirdNum = ipContainer[2]; + int fourthNum = ipContainer[3]; + DEBUG_WEBSOCKETS("[Client ip Address]["); + DEBUG_WEBSOCKETS(firstNum); + DEBUG_WEBSOCKETS("."); + DEBUG_WEBSOCKETS(secondNum); + DEBUG_WEBSOCKETS("."); + DEBUG_WEBSOCKETS(thirdNum); + DEBUG_WEBSOCKETS("."); + DEBUG_WEBSOCKETS(fourthNum); + DEBUG_WEBSOCKETS("]\n"); + + + + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(client->tcp) + { + IPAddress ipContainer = client->tcp->remoteIP(); + if(ipContainer[0]==firstNum && ipContainer[1]==secondNum && ipContainer[2]==thirdNum && ipContainer[3]==fourthNum) + { + DEBUG_WEBSOCKETS("already present"); + return; + } + } + } + + +// while(_server->hasClient()) { #endif bool ok = false; // search free list entry for client - for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { - client = &_clients[i]; - DEBUG_WEBSOCKETS("[WS-Server]["); - DEBUG_WEBSOCKETS(i); - DEBUG_WEBSOCKETS("] this client is connected: "); - DEBUG_WEBSOCKETS(clientIsConnected(client)); - DEBUG_WEBSOCKETS("\n"); - } + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { client = &_clients[i]; @@ -407,7 +434,13 @@ void WebSocketsServer::handleNewClients(void) { #else client->tcp = new WEBSOCKETS_NETWORK_CLASS(_server->available());//&clientContainer ; - +// client->tcp = new WEBSOCKETS_NETWORK_CLASS(clientContainer ); + IPAddress ip = client->tcp->remoteIP(); + if(ip[0]==0 && ip[1]==0 && ip[2]==0 && ip[3]==0) + { + + return; + } #endif if(!client->tcp) { DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); @@ -421,7 +454,8 @@ void WebSocketsServer::handleNewClients(void) { // set Timeout for readBytesUntil and readStringUntil client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); client->status = WSC_HEADER; - IPAddress ip = client->tcp->remoteIP(); + //IPAddress ip = client->tcp->remoteIP(); + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); @@ -455,7 +489,7 @@ void WebSocketsServer::handleNewClients(void) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) } #else - //} + } #endif } diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 71b05bc..f51a6dd 100755 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -28,7 +28,7 @@ #include #include "WebSockets.h" -#define WEBSOCKETS_SERVER_CLIENT_MAX (5) +#define WEBSOCKETS_SERVER_CLIENT_MAX (3) From 47b7a15b470c23af7cec4d1c295630bb39070bac Mon Sep 17 00:00:00 2001 From: pierdr Date: Wed, 24 Jan 2018 11:53:54 -0800 Subject: [PATCH 4/6] websocket server running on MKR1000 - to be tested with multiple clients --- .../WebSocketServerMKR1000.ino | 108 ++++++++++++++++++ src/WebSocketsServer.cpp | 34 +++--- src/WebSocketsServer.h | 6 +- 3 files changed, 130 insertions(+), 18 deletions(-) create mode 100644 examples/WebSocketServerMKR1000/WebSocketServerMKR1000.ino diff --git a/examples/WebSocketServerMKR1000/WebSocketServerMKR1000.ino b/examples/WebSocketServerMKR1000/WebSocketServerMKR1000.ino new file mode 100644 index 0000000..f7f7117 --- /dev/null +++ b/examples/WebSocketServerMKR1000/WebSocketServerMKR1000.ino @@ -0,0 +1,108 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include + + +char ssid[] = ""; // your network SSID (name) +char pass[] = ""; // your network password +int keyIndex = 0; + +WebSocketsServer webSocket = WebSocketsServer(8003); + +#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.print(num); + // USE_SERIAL.println(" Disconnected!\n"); + break; + case WStype_CONNECTED: + { + //IPAddress ip = webSocket.remoteIP(num); + //USE_SERIAL.println("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + USE_SERIAL.println("connected"); + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.print((char*)payload); + USE_SERIAL.println(" received"); + + // 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.println("got some binary"); +// USE_SERIAL.println("[%u] get binary lenght: %u\n", num, lenght); +// hexdump(payload, 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.print(t); + USE_SERIAL.println(" ... [SETUP] BOOT WAIT ...\n"); + USE_SERIAL.flush(); + delay(1000); + } + ///CONNECT TO WIFI + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("NOT PRESENT"); + return; // don't continue + } + Serial.println("WIFI MODULE DETECTED"); + // attempt to connect to Wifi network: + while ( WiFi.status() != WL_CONNECTED) { + + Serial.print("Attempting to connect to Network named: "); + Serial.println(ssid); // print the network name (SSID); + + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + WiFi.begin(ssid, pass); + // wait 10 seconds for connection: + delay(10000); + } + Serial.print("Connected to "); + Serial.print(ssid); + Serial.print(" with IP:"); + IPAddress ip = WiFi.localIP(); + Serial.println(ip); + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); + delay(200); +} + diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index be4bd4f..5d33bc1 100755 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -383,21 +383,21 @@ void WebSocketsServer::handleNewClients(void) { WiFiClient clientContainer = _server->available(); while(clientContainer){ - IPAddress ipContainer = clientContainer.remoteIP(); + tempIpAddressNewClient = clientContainer.remoteIP(); - int firstNum = ipContainer[0]; - int secondNum = ipContainer[1]; - int thirdNum = ipContainer[2]; - int fourthNum = ipContainer[3]; - DEBUG_WEBSOCKETS("[Client ip Address]["); - DEBUG_WEBSOCKETS(firstNum); - DEBUG_WEBSOCKETS("."); - DEBUG_WEBSOCKETS(secondNum); - DEBUG_WEBSOCKETS("."); - DEBUG_WEBSOCKETS(thirdNum); - DEBUG_WEBSOCKETS("."); - DEBUG_WEBSOCKETS(fourthNum); - DEBUG_WEBSOCKETS("]\n"); +// int firstNum = ipContainer[0]; +// int secondNum = ipContainer[1]; +// int thirdNum = ipContainer[2]; +// int fourthNum = ipContainer[3]; +// DEBUG_WEBSOCKETS("[Client ip Address]["); +// DEBUG_WEBSOCKETS(firstNum); +// DEBUG_WEBSOCKETS("."); +// DEBUG_WEBSOCKETS(secondNum); +// DEBUG_WEBSOCKETS("."); +// DEBUG_WEBSOCKETS(thirdNum); +// DEBUG_WEBSOCKETS("."); +// DEBUG_WEBSOCKETS(fourthNum); +// DEBUG_WEBSOCKETS("]\n"); @@ -406,9 +406,9 @@ void WebSocketsServer::handleNewClients(void) { if(client->tcp) { IPAddress ipContainer = client->tcp->remoteIP(); - if(ipContainer[0]==firstNum && ipContainer[1]==secondNum && ipContainer[2]==thirdNum && ipContainer[3]==fourthNum) + if(ipContainer[0]==tempIpAddressNewClient[0] && ipContainer[1]==tempIpAddressNewClient[1] && ipContainer[2]==tempIpAddressNewClient[2] && ipContainer[3]==tempIpAddressNewClient[3]) { - DEBUG_WEBSOCKETS("already present"); + return; } } @@ -443,7 +443,7 @@ void WebSocketsServer::handleNewClients(void) { } #endif if(!client->tcp) { - DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!\n"); return; } diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index f51a6dd..3d29412 100755 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -72,7 +72,11 @@ class WebSocketsServer: private WebSockets { IPAddress remoteIP(uint8_t num); #endif -protected: +protected: + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_WIFI101) + IPAddress tempIpAddressNewClient; + + #endif uint16_t _port; WEBSOCKETS_NETWORK_SERVER_CLASS * _server; From a24eba07532ca7600c690b54defbe92824b09a85 Mon Sep 17 00:00:00 2001 From: pierdr Date: Thu, 25 Jan 2018 09:13:20 -0800 Subject: [PATCH 5/6] cleanup --- src/WebSocketsServer.cpp | 25 +++---------------------- tests/webSocket.html | 2 +- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 5d33bc1..dd5c8a2 100755 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -376,31 +376,14 @@ bool WebSocketsServer::clientIsConnected(WSclient_t * client) { */ void WebSocketsServer::handleNewClients(void) { WSclient_t * client; -// Serial.println("handling new client"); + #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) while(_server->hasClient()) { #else WiFiClient clientContainer = _server->available(); - while(clientContainer){ - + while(clientContainer){ tempIpAddressNewClient = clientContainer.remoteIP(); - -// int firstNum = ipContainer[0]; -// int secondNum = ipContainer[1]; -// int thirdNum = ipContainer[2]; -// int fourthNum = ipContainer[3]; -// DEBUG_WEBSOCKETS("[Client ip Address]["); -// DEBUG_WEBSOCKETS(firstNum); -// DEBUG_WEBSOCKETS("."); -// DEBUG_WEBSOCKETS(secondNum); -// DEBUG_WEBSOCKETS("."); -// DEBUG_WEBSOCKETS(thirdNum); -// DEBUG_WEBSOCKETS("."); -// DEBUG_WEBSOCKETS(fourthNum); -// DEBUG_WEBSOCKETS("]\n"); - - - + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { client = &_clients[i]; if(client->tcp) @@ -414,8 +397,6 @@ void WebSocketsServer::handleNewClients(void) { } } - -// while(_server->hasClient()) { #endif bool ok = false; // search free list entry for client diff --git a/tests/webSocket.html b/tests/webSocket.html index 1760886..a1ceaf5 100644 --- a/tests/webSocket.html +++ b/tests/webSocket.html @@ -2,7 +2,7 @@