From 1275914c868d64e0cbf043d2e41826881228e60d Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 24 Jan 2016 00:52:23 +0100 Subject: [PATCH] first parts of client working --- src/WebSocketsClient.cpp | 118 ++++++++++++++++++++++++++++++--------- src/WebSocketsClient.h | 12 ++++ src/WebSocketsServer.h | 5 +- 3 files changed, 107 insertions(+), 28 deletions(-) diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 2f703ef..af74819 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -67,6 +67,8 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url) // todo find better seed randomSeed(millis()); #endif + + asyncConnect(); } void WebSocketsClient::begin(String host, uint16_t port, String url) { @@ -85,11 +87,12 @@ void WebSocketsClient::beginSSL(String host, uint16_t port, String url, String f } #endif + +#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) /** * called in arduino loop */ void WebSocketsClient::loop(void) { -#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) if(!clientIsConnected(&_client)) { #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) @@ -120,37 +123,16 @@ void WebSocketsClient::loop(void) { } if(_client.tcp->connect(_host.c_str(), _port)) { - DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); - - _client.status = WSC_HEADER; - - // set Timeout for readBytesUntil and readStringUntil - _client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); - -#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) - _client.tcp->setNoDelay(true); - - if(_client.isSSL && _fingerprint.length()) { - if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { - DEBUG_WEBSOCKETS("[WS-Client] certificate mismatch\n"); - WebSockets::clientDisconnect(&_client, 1000); - return; - } - } -#endif - - // send Header to Server - sendHeader(&_client); - + connectedCb(); } else { - DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); + connectFailedCb(); delay(10); //some little delay to not flood the server } } else { handleClientData(); } -#endif } +#endif /** * set callback function @@ -511,3 +493,89 @@ void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) { } } +void WebSocketsClient::connectedCb() { + + DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _client.tcp->onDisconnect(std::bind([](WebSocketsClient * c, AsyncTCPbuffer * obj, WSclient_t * client) -> bool { + DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num); + client->status = WSC_NOT_CONNECTED; + client->tcp = NULL; + + // reconnect + // c->asyncConnect(); + + return true; + }, this, std::placeholders::_1, &_client)); +#endif + + _client.status = WSC_HEADER; + +#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + // set Timeout for readBytesUntil and readStringUntil + _client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); +#endif + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + _client.tcp->setNoDelay(true); + + if(_client.isSSL && _fingerprint.length()) { + if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { + DEBUG_WEBSOCKETS("[WS-Client] certificate mismatch\n"); + WebSockets::clientDisconnect(&_client, 1000); + return; + } + } +#endif + + // send Header to Server + sendHeader(&_client); + +} + + +void WebSocketsClient::connectFailedCb() { + DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Faild\n", _host.c_str(), _port); +} + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + +void WebSocketsClient::asyncConnect() { + + AsyncClient * tcpclient = new AsyncClient(); + + + if(!tcpclient) { + DEBUG_WEBSOCKETS("[WS-Client] creating AsyncClient class failed!"); + return; + } + + tcpclient->onConnect(std::bind([](WebSocketsClient * ws , AsyncClient * tcp) { + ws->_client.tcp = new AsyncTCPbuffer(tcp); + if(!ws->_client.tcp) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + ws->connectFailedCb(); + return; + } + ws->connectedCb(); + }, this, std::placeholders::_2)); + + tcpclient->onError(std::bind([](WebSocketsClient * ws , AsyncClient * tcp) { + ws->connectFailedCb(); + + // reconnect + ws->asyncConnect(); + }, this, std::placeholders::_2)); + + if(!tcpclient->connect(_host.c_str(), _port)) { + connectFailedCb(); + delete tcpclient; + } + +} + +#endif + + + diff --git a/src/WebSocketsClient.h b/src/WebSocketsClient.h index 719da66..cfecf39 100644 --- a/src/WebSocketsClient.h +++ b/src/WebSocketsClient.h @@ -44,7 +44,12 @@ class WebSocketsClient: private WebSockets { void beginSSL(String host, uint16_t port, String url = "/", String fingerprint = ""); #endif +#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) void loop(void); +#else + // Async interface not need a loop call + void loop(void) __attribute__ ((deprecated)) {} +#endif void onEvent(WebSocketClientEvent cbEvent); @@ -82,6 +87,13 @@ class WebSocketsClient: private WebSockets { void sendHeader(WSclient_t * client); void handleHeader(WSclient_t * client, String * headerLine); + void connectedCb(); + void connectFailedCb(); + +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + void asyncConnect(); +#endif + /** * called for sending a Event to the app * @param type WStype_t diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 34036dd..3b25373 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -42,13 +42,12 @@ public: ~WebSocketsServer(void); void begin(void); + #if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) void loop(void); #else // Async interface not need a loop call - void loop(void) __attribute__ ((deprecated)) { - - } + void loop(void) __attribute__ ((deprecated)) {} #endif void onEvent(WebSocketServerEvent cbEvent);