@@ -67,6 +67,8 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url)
67
67
// todo find better seed
68
68
randomSeed (millis ());
69
69
#endif
70
+
71
+ asyncConnect ();
70
72
}
71
73
72
74
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
85
87
}
86
88
#endif
87
89
90
+
91
+ #if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
88
92
/* *
89
93
* called in arduino loop
90
94
*/
91
95
void WebSocketsClient::loop (void ) {
92
- #if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
93
96
if (!clientIsConnected (&_client)) {
94
97
95
98
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
@@ -120,37 +123,16 @@ void WebSocketsClient::loop(void) {
120
123
}
121
124
122
125
if (_client.tcp ->connect (_host.c_str (), _port)) {
123
- DEBUG_WEBSOCKETS (" [WS-Client] connected to %s:%u.\n " , _host.c_str (), _port);
124
-
125
- _client.status = WSC_HEADER;
126
-
127
- // set Timeout for readBytesUntil and readStringUntil
128
- _client.tcp ->setTimeout (WEBSOCKETS_TCP_TIMEOUT);
129
-
130
- #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
131
- _client.tcp ->setNoDelay (true);
132
-
133
- if (_client.isSSL && _fingerprint.length ()) {
134
- if (!_client.ssl ->verify (_fingerprint.c_str (), _host.c_str ())) {
135
- DEBUG_WEBSOCKETS (" [WS-Client] certificate mismatch\n " );
136
- WebSockets::clientDisconnect (&_client, 1000 );
137
- return ;
138
- }
139
- }
140
- #endif
141
-
142
- // send Header to Server
143
- sendHeader (&_client);
144
-
126
+ connectedCb ();
145
127
} else {
146
- DEBUG_WEBSOCKETS ( " [WS-Client] connection to %s:%u Faild \n " , _host. c_str (), _port );
128
+ connectFailedCb ( );
147
129
delay (10 ); // some little delay to not flood the server
148
130
}
149
131
} else {
150
132
handleClientData ();
151
133
}
152
- #endif
153
134
}
135
+ #endif
154
136
155
137
/* *
156
138
* set callback function
@@ -511,3 +493,89 @@ void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) {
511
493
}
512
494
}
513
495
496
+ void WebSocketsClient::connectedCb () {
497
+
498
+ DEBUG_WEBSOCKETS (" [WS-Client] connected to %s:%u.\n " , _host.c_str (), _port);
499
+
500
+ #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
501
+ _client.tcp ->onDisconnect (std::bind ([](WebSocketsClient * c, AsyncTCPbuffer * obj, WSclient_t * client) -> bool {
502
+ DEBUG_WEBSOCKETS (" [WS-Server][%d] Disconnect client\n " , client->num );
503
+ client->status = WSC_NOT_CONNECTED;
504
+ client->tcp = NULL ;
505
+
506
+ // reconnect
507
+ // c->asyncConnect();
508
+
509
+ return true ;
510
+ }, this , std::placeholders::_1, &_client));
511
+ #endif
512
+
513
+ _client.status = WSC_HEADER;
514
+
515
+ #if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
516
+ // set Timeout for readBytesUntil and readStringUntil
517
+ _client.tcp ->setTimeout (WEBSOCKETS_TCP_TIMEOUT);
518
+ #endif
519
+
520
+ #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
521
+ _client.tcp ->setNoDelay (true );
522
+
523
+ if (_client.isSSL && _fingerprint.length ()) {
524
+ if (!_client.ssl ->verify (_fingerprint.c_str (), _host.c_str ())) {
525
+ DEBUG_WEBSOCKETS (" [WS-Client] certificate mismatch\n " );
526
+ WebSockets::clientDisconnect (&_client, 1000 );
527
+ return ;
528
+ }
529
+ }
530
+ #endif
531
+
532
+ // send Header to Server
533
+ sendHeader (&_client);
534
+
535
+ }
536
+
537
+
538
+ void WebSocketsClient::connectFailedCb () {
539
+ DEBUG_WEBSOCKETS (" [WS-Client] connection to %s:%u Faild\n " , _host.c_str (), _port);
540
+ }
541
+
542
+ #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
543
+
544
+ void WebSocketsClient::asyncConnect () {
545
+
546
+ AsyncClient * tcpclient = new AsyncClient ();
547
+
548
+
549
+ if (!tcpclient) {
550
+ DEBUG_WEBSOCKETS (" [WS-Client] creating AsyncClient class failed!" );
551
+ return ;
552
+ }
553
+
554
+ tcpclient->onConnect (std::bind ([](WebSocketsClient * ws , AsyncClient * tcp) {
555
+ ws->_client .tcp = new AsyncTCPbuffer (tcp);
556
+ if (!ws->_client .tcp ) {
557
+ DEBUG_WEBSOCKETS (" [WS-Client] creating Network class failed!" );
558
+ ws->connectFailedCb ();
559
+ return ;
560
+ }
561
+ ws->connectedCb ();
562
+ }, this , std::placeholders::_2));
563
+
564
+ tcpclient->onError (std::bind ([](WebSocketsClient * ws , AsyncClient * tcp) {
565
+ ws->connectFailedCb ();
566
+
567
+ // reconnect
568
+ ws->asyncConnect ();
569
+ }, this , std::placeholders::_2));
570
+
571
+ if (!tcpclient->connect (_host.c_str (), _port)) {
572
+ connectFailedCb ();
573
+ delete tcpclient;
574
+ }
575
+
576
+ }
577
+
578
+ #endif
579
+
580
+
581
+
0 commit comments