From 1df658b7eb99c6d2b3884379cd9692b8e5745277 Mon Sep 17 00:00:00 2001 From: Heath Volmer Date: Mon, 10 Sep 2018 20:23:57 -0600 Subject: [PATCH] Added close handlers to catch legit shutdowns from servers --- .../AppServer/CotijaSystemController.cs | 73 ++++++++++++------- 1 file changed, 46 insertions(+), 27 deletions(-) diff --git a/PepperDashEssentials/AppServer/CotijaSystemController.cs b/PepperDashEssentials/AppServer/CotijaSystemController.cs index c7856753..79a4ba46 100644 --- a/PepperDashEssentials/AppServer/CotijaSystemController.cs +++ b/PepperDashEssentials/AppServer/CotijaSystemController.cs @@ -86,9 +86,9 @@ namespace PepperDash.Essentials CrestronConsole.AddNewConsoleCommand(PrintActionDictionaryPaths, "mobileshowactionpaths", "Prints the paths in teh Action Dictionary", ConsoleAccessLevelEnum.AccessOperator); - CrestronConsole.AddNewConsoleCommand(s => ConnectStreamClient(), "mobileconnect", + CrestronConsole.AddNewConsoleCommand(s => ConnectWebsocketClient(), "mobileconnect", "Forces connect of websocket", ConsoleAccessLevelEnum.AccessOperator); - CrestronConsole.AddNewConsoleCommand(s => DisconnectWebsocketClient(), "mobiledisco", + CrestronConsole.AddNewConsoleCommand(s => CleanUpWebsocketClient(), "mobiledisco", "Disconnects websocket", ConsoleAccessLevelEnum.AccessOperator); CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); @@ -100,15 +100,15 @@ namespace PepperDash.Essentials /// /// /// - void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs ethernetEventArgs) + void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs args) { Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Ethernet status change, port {0}: {1}", - ethernetEventArgs.EthernetAdapter, ethernetEventArgs.EthernetEventType); + args.EthernetAdapter, args.EthernetEventType); - //if (ethernetEventArgs.EthernetEventType == eEthernetEventType.LinkDown) - //{ - // LinkUp = false; - //} + if (args.EthernetEventType == eEthernetEventType.LinkDown && WSClient != null && args.EthernetAdapter == WSClient.EthernetAdapter) + { + CleanUpWebsocketClient(); + } } /// @@ -119,7 +119,7 @@ namespace PepperDash.Essentials { if (programEventType == eProgramStatusEventType.Stopping && WSClient.Connected) { - DisconnectWebsocketClient(); + CleanUpWebsocketClient(); } } @@ -299,7 +299,7 @@ namespace PepperDash.Essentials /// URL of the server, including the port number, if not 80. Format: "serverUrlOrIp:port" void RegisterSystemToServer() { - ConnectStreamClient(); + ConnectWebsocketClient(); return; //var ready = RegisterLockEvent.Wait(20000); @@ -401,14 +401,14 @@ namespace PepperDash.Essentials /// Connects the Websocket Client /// /// - void ConnectStreamClient() + void ConnectWebsocketClient() { Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Initializing Stream client to server."); if (WSClient != null) { Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Cleaning up previous socket"); - DisconnectWebsocketClient(); + CleanUpWebsocketClient(); } SystemUuid = ConfigReader.ConfigObject.SystemUuid; @@ -508,15 +508,19 @@ namespace PepperDash.Essentials /// Disconnects the SSE Client and stops the heartbeat timer /// /// - void DisconnectWebsocketClient() + void CleanUpWebsocketClient() { Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Disconnecting websocket"); if (WSClient != null) { - WSClient.Disconnect(); WSClient.SendCallBack = null; WSClient.ReceiveCallBack = null; WSClient.ConnectionCallBack = null; + WSClient.DisconnectCallBack = null; + if (WSClient.Connected) + { + WSClient.Disconnect(); + } WSClient = null; } } @@ -557,7 +561,7 @@ namespace PepperDash.Essentials ServerHeartbeatCheckTimer.Stop(); ServerHeartbeatCheckTimer = null; } - DisconnectWebsocketClient(); + CleanUpWebsocketClient(); StartServerReconnectTimer(); } @@ -568,14 +572,15 @@ namespace PepperDash.Essentials /// void ResetOrStartHearbeatTimer() { - if (ServerHeartbeatCheckTimer == null) - { + if (ServerHeartbeatCheckTimer == null) + { ServerHeartbeatCheckTimer = new CTimer(HeartbeatExpiredTimerCallback, null, ServerHeartbeatInterval, ServerHeartbeatInterval); - - Debug.Console(1, this, "Heartbeat Timer Started."); - } - - ServerHeartbeatCheckTimer.Reset(ServerHeartbeatInterval, ServerHeartbeatInterval); + Debug.Console(1, this, "Heartbeat Timer Started."); + } + else + { + ServerHeartbeatCheckTimer.Reset(ServerHeartbeatInterval, ServerHeartbeatInterval); + } } /// @@ -583,7 +588,7 @@ namespace PepperDash.Essentials /// void ReconnectStreamClient() { - new CTimer(o => ConnectStreamClient(), 2000); + new CTimer(o => ConnectWebsocketClient(), 2000); } /// @@ -668,10 +673,24 @@ namespace PepperDash.Essentials int Websocket_ReceiveCallback(byte[] data, uint length, WebSocketClient.WEBSOCKET_PACKET_TYPES opcode, WebSocketClient.WEBSOCKET_RESULT_CODES err) { - var rx = System.Text.Encoding.UTF8.GetString(data, 0, (int)length); - if(rx.Length > 0) - ParseStreamRx(rx); - WSClient.ReceiveAsync(); + if (opcode == WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__TEXT_FRAME) + { + var rx = System.Text.Encoding.UTF8.GetString(data, 0, (int)length); + if (rx.Length > 0) + ParseStreamRx(rx); + WSClient.ReceiveAsync(); + } + + else if (opcode == WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__CLOSE) + { + Debug.Console(1, this, "Websocket disconnect received from remote"); + CleanUpWebsocketClient(); + } + else + { + Debug.Console(1, this, "websocket rx opcode/err {0}/{1}", opcode, err); + WSClient.ReceiveAsync(); + } return 0; }