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/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/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..3901288 --- 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,12 +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 +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 +#elif defined(ARDUINO_SAMD_MKR1000) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_WIFI101 #else #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 #endif @@ -69,7 +75,7 @@ #elif (WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) -#include +#include #include #define WEBSOCKETS_NETWORK_CLASS EthernetClient #define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer @@ -78,8 +84,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..dd5c8a2 --- 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,25 +375,56 @@ 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; + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + while(_server->hasClient()) { +#else + WiFiClient clientContainer = _server->available(); + while(clientContainer){ + tempIpAddressNewClient = clientContainer.remoteIP(); + + 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]==tempIpAddressNewClient[0] && ipContainer[1]==tempIpAddressNewClient[1] && ipContainer[2]==tempIpAddressNewClient[2] && ipContainer[3]==tempIpAddressNewClient[3]) + { + + return; + } + } + } + +#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]; - + 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 ; +// 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!"); + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!\n"); return; } @@ -392,12 +434,18 @@ void WebSocketsServer::handleNewClients(void) { #endif // set Timeout for readBytesUntil and readStringUntil client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); - client->status = WSC_HEADER; + client->status = WSC_HEADER; + //IPAddress ip = client->tcp->remoteIP(); + #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 from:"); + DEBUG_WEBSOCKETS(ip); + DEBUG_WEBSOCKETS("\n"); #endif ok = true; break; @@ -419,16 +467,18 @@ void WebSocketsServer::handleNewClients(void) { #ifdef ESP8266 delay(0); #endif -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - } -#endif +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + } +#else + } +#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 +492,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 +517,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 +553,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 +574,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 +590,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..3d29412 --- 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) @@ -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; @@ -96,8 +100,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" 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 @@