@@ -30,6 +30,9 @@ WebSocketsServer::WebSocketsServer(uint16_t port, String origin, String protocol
30
30
_origin = origin;
31
31
_protocol = protocol;
32
32
_runnning = false ;
33
+ _pingInterval = 0 ;
34
+ _pongTimeout = 0 ;
35
+ _disconnectTimeoutCount = 0 ;
33
36
34
37
_server = new WEBSOCKETS_NETWORK_SERVER_CLASS (port);
35
38
@@ -91,6 +94,10 @@ void WebSocketsServer::begin(void) {
91
94
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
92
95
client->cHttpLine = " " ;
93
96
#endif
97
+
98
+ client->pingInterval = _pingInterval;
99
+ client->pongTimeout = _pongTimeout;
100
+ client->disconnectTimeoutCount = _disconnectTimeoutCount;
94
101
}
95
102
96
103
#ifdef ESP8266
@@ -486,6 +493,12 @@ bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) {
486
493
client->tcp ->readStringUntil (' \n ' , &(client->cHttpLine ), std::bind (&WebSocketsServer::handleHeader, this , client, &(client->cHttpLine )));
487
494
#endif
488
495
496
+ client->pingInterval = _pingInterval;
497
+ client->pongTimeout = _pongTimeout;
498
+ client->disconnectTimeoutCount = _disconnectTimeoutCount;
499
+ client->lastPing = millis ();
500
+ client->pongReceived = false ;
8000
501
+
489
502
return true ;
490
503
break ;
491
504
}
@@ -677,6 +690,9 @@ void WebSocketsServer::handleClientData(void) {
677
690
break ;
678
691
}
679
692
}
693
+
694
+ handleHBPing (client);
695
+ handleHBTimeout (client);
680
696
}
681
697
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
682
698
delay (0 );
@@ -854,3 +870,50 @@ void WebSocketsServer::handleHeader(WSclient_t * client, String * headerLine) {
854
870
}
855
871
}
856
872
}
873
+
874
+ /* *
875
+ * send heartbeat ping to server in set intervals
876
+ */
877
+ void WebSocketsServer::handleHBPing (WSclient_t * client) {
878
+ if (client->pingInterval == 0 )
879
+ return ;
880
+ uint32_t pi = millis () - client->lastPing ;
881
+ if (pi > client->pingInterval ) {
882
+ DEBUG_WEBSOCKETS (" [WS-Server][%d] sending HB ping\n " , client->num );
883
+ if (sendPing (client->num )) {
884
+ client->lastPing = millis ();
885
+ client->pongReceived = false ;
886
+ }
887
+ }
888
+ }
889
+
890
+ /* *
891
+ * enable ping/pong heartbeat process
892
+ * @param pingInterval uint32_t how often ping will be sent
893
+ * @param pongTimeout uint32_t millis after which pong should timout if not received
894
+ * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect
895
+ */
896
+ void WebSocketsServer::enableHeartbeat (uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) {
897
+ _pingInterval = pingInterval;
898
+ _pongTimeout = pongTimeout;
899
+ _disconnectTimeoutCount = disconnectTimeoutCount;
900
+
901
+ WSclient_t * client;
902
+ for (uint8_t i = 0 ; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) {
903
+ client = &_clients[i];
904
+ WebSockets::enableHeartbeat (client, pingInterval, pongTimeout, disconnectTimeoutCount);
905
+ }
906
+ }
907
+
908
+ /* *
909
+ * disable ping/pong heartbeat process
910
+ */
911
+ void WebSocketsServer::disableHeartbeat () {
912
+ _pingInterval = 0 ;
913
+
914
+ WSclient_t * client;
915
+ for (uint8_t i = 0 ; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) {
916
+ client = &_clients[i];
917
+ client->pingInterval = 0 ;
918
+ }
919
+ }
0 commit comments