mirror of
https://github.com/danieldemus/openhab-addons
synced 2026-07-29 12:34:21 +02:00
[freeathome] Fix periodic WebSocket disconnect in ping keep-alive mode (#21065)
The bridge sends a WebSocket ping every 10 seconds but only refreshed its liveness timestamp on incoming text frames. Pong replies were never seen because the handler did not implement WebSocketPingPongListener, so on an idle SysAP the 90 second watchdog closed a healthy connection and the binding reconnected in a loop. Implement WebSocketPingPongListener and update lastReceivedTime on every pong, so ping/pong keeps the connection alive while a genuinely dead peer is still detected once pongs stop. Signed-off-by: Danilo Bürger <info@danilobuerger.de>
This commit is contained in:
+15
-2
@@ -50,6 +50,7 @@ import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
|||||||
import org.eclipse.jetty.websocket.api.Session;
|
import org.eclipse.jetty.websocket.api.Session;
|
||||||
import org.eclipse.jetty.websocket.api.StatusCode;
|
import org.eclipse.jetty.websocket.api.StatusCode;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketListener;
|
import org.eclipse.jetty.websocket.api.WebSocketListener;
|
||||||
|
import org.eclipse.jetty.websocket.api.WebSocketPingPongListener;
|
||||||
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
|
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
|
||||||
import org.eclipse.jetty.websocket.client.WebSocketClient;
|
import org.eclipse.jetty.websocket.client.WebSocketClient;
|
||||||
import org.openhab.binding.freeathome.internal.FreeAtHomeDiscoveryService;
|
import org.openhab.binding.freeathome.internal.FreeAtHomeDiscoveryService;
|
||||||
@@ -82,7 +83,7 @@ import com.google.gson.stream.JsonReader;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSocketListener {
|
public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSocketListener, WebSocketPingPongListener {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(FreeAtHomeBridgeHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(FreeAtHomeBridgeHandler.class);
|
||||||
|
|
||||||
@@ -607,7 +608,7 @@ public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSoc
|
|||||||
/**
|
/**
|
||||||
* Method to connect the WebSocket session.
|
* Method to connect the WebSocket session.
|
||||||
* Attempts to establish a WebSocket connection to the SysAP and handles authentication.
|
* Attempts to establish a WebSocket connection to the SysAP and handles authentication.
|
||||||
*
|
*
|
||||||
* @return true if the connection attempt is initiated successfully, false otherwise
|
* @return true if the connection attempt is initiated successfully, false otherwise
|
||||||
*/
|
*/
|
||||||
public boolean connectWebsocketSession() {
|
public boolean connectWebsocketSession() {
|
||||||
@@ -1148,6 +1149,18 @@ public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSoc
|
|||||||
logger.warn("Binary message received via websocket - It shall not happen with the free@home SysAp");
|
logger.warn("Binary message received via websocket - It shall not happen with the free@home SysAp");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNullByDefault({})
|
||||||
|
public void onWebSocketPong(ByteBuffer payload) {
|
||||||
|
lastReceivedTime = System.currentTimeMillis();
|
||||||
|
logger.debug("WebSocket pong received");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNullByDefault({})
|
||||||
|
public void onWebSocketPing(ByteBuffer payload) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Text message received. Processing will be started
|
* Text message received. Processing will be started
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user