Merge pull request #401 from mcarlton00/websocket-fix
Implement proper keepalives for websocket
This commit is contained in:
@@ -33,11 +33,11 @@ class WebSocketClient(threading.Thread):
|
|||||||
|
|
||||||
self.__dict__ = self._shared_state
|
self.__dict__ = self._shared_state
|
||||||
self.monitor = xbmc.Monitor()
|
self.monitor = xbmc.Monitor()
|
||||||
self.retry_count = 0
|
|
||||||
|
|
||||||
self.device_id = get_device_id()
|
self.device_id = get_device_id()
|
||||||
|
|
||||||
self._library_monitor = library_change_monitor
|
self._library_monitor = library_change_monitor
|
||||||
|
self.websocket_error = False
|
||||||
|
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
@@ -230,11 +230,16 @@ class WebSocketClient(threading.Thread):
|
|||||||
xbmc.executebuiltin(builtin[command])
|
xbmc.executebuiltin(builtin[command])
|
||||||
|
|
||||||
def on_open(self, ws):
|
def on_open(self, ws):
|
||||||
|
# Wait to make sure previous keepalive cycle has ended
|
||||||
|
if self.websocket_error:
|
||||||
|
time.sleep(30)
|
||||||
|
self.websocket_error = False
|
||||||
log.debug("Connected")
|
log.debug("Connected")
|
||||||
self.retry_count = 0
|
|
||||||
self.post_capabilities()
|
self.post_capabilities()
|
||||||
|
self.send_keepalive(ws)
|
||||||
|
|
||||||
def on_error(self, ws, error):
|
def on_error(self, ws, error):
|
||||||
|
self.websocket_error = True
|
||||||
log.debug("Error: {0}".format(error))
|
log.debug("Error: {0}".format(error))
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
@@ -269,7 +274,7 @@ class WebSocketClient(threading.Thread):
|
|||||||
|
|
||||||
while not self.monitor.abortRequested():
|
while not self.monitor.abortRequested():
|
||||||
|
|
||||||
self._client.run_forever(ping_interval=5, reconnect=13, ping_timeout=2)
|
self._client.run_forever(reconnect=30)
|
||||||
|
|
||||||
if self._stop_websocket:
|
if self._stop_websocket:
|
||||||
break
|
break
|
||||||
@@ -278,8 +283,6 @@ class WebSocketClient(threading.Thread):
|
|||||||
# Abort was requested, exit
|
# Abort was requested, exit
|
||||||
break
|
break
|
||||||
|
|
||||||
if self.retry_count < 12:
|
|
||||||
self.retry_count += 1
|
|
||||||
log.debug("Reconnecting WebSocket")
|
log.debug("Reconnecting WebSocket")
|
||||||
|
|
||||||
log.debug("WebSocketClient Stopped")
|
log.debug("WebSocketClient Stopped")
|
||||||
@@ -303,3 +306,22 @@ class WebSocketClient(threading.Thread):
|
|||||||
)
|
)
|
||||||
|
|
||||||
api.post_capabilities()
|
api.post_capabilities()
|
||||||
|
|
||||||
|
def send_keepalive(self, ws):
|
||||||
|
# Stop the keepalive cycle if an error has been detected
|
||||||
|
if self.websocket_error:
|
||||||
|
return
|
||||||
|
keepalive_payload = json.dumps({"MessageType": "KeepAlive", "Data": 30})
|
||||||
|
# Send the keepalive, or register an error
|
||||||
|
try:
|
||||||
|
ws.send(keepalive_payload)
|
||||||
|
except:
|
||||||
|
self.websocket_error = True
|
||||||
|
return
|
||||||
|
# Schedule the next message
|
||||||
|
self.schedule_keepalive(ws)
|
||||||
|
|
||||||
|
def schedule_keepalive(self, ws):
|
||||||
|
# Schedule a keepalive message in 30 seconds
|
||||||
|
timer = threading.Timer(30, self.send_keepalive, kwargs={'ws': ws})
|
||||||
|
timer.start()
|
||||||
|
|||||||
Reference in New Issue
Block a user