using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using NLog; using POSV.ShoppingCart; using WebSocket4Net; using POSV.Bean; namespace POSV.Utils { public class WSSE { private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); private static object _lock = new object(); private System.Timers.Timer _reconnectTimer; private static WSSE _instance = null; private WebSocketEx _websocket = null; private bool _connected = false; public static WSSE Instance { get { if (_instance == null) { lock (_lock) { _instance = new WSSE(); _instance.InitWebSocket(); logger.Info("初始化服务......"); } } return _instance; } } private void InitWebSocket() { try { //是否启用服务中心 var enable = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_SERVICECENTER_ENABLE, false); var ip = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SERVICECENTER_IP); var port = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SERVICECENTER_PORT); var enableKds = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_KITCHEN_DISPLAY_ENABLE, false); if (enable && !string.IsNullOrEmpty(ip) && !string.IsNullOrEmpty(port)) { if (enableKds) { var url = string.Format("ws://{0}:{1}/{2}", ip, port, "pos-" + Global.Instance.Authc.PosNo); //var url = string.Format("ws://{0}:{1}/{2}", ip, port, "websocket"); this._websocket = new WebSocketEx(url); this._websocket.EnableAutoSendPing = true; this._websocket.AutoSendPingInterval = 5; this._websocket.Opened -= WebSocketOpened; this._websocket.Opened += WebSocketOpened; this._websocket.Error -= WebSocketError; this._websocket.Error += WebSocketError; this._websocket.Closed -= WebSocketClosed; this._websocket.Closed += WebSocketClosed; if (_reconnectTimer == null) { _reconnectTimer = new System.Timers.Timer(40000); } _reconnectTimer.AutoReset = true; _reconnectTimer.Enabled = true; _reconnectTimer.Elapsed -= ReconnectTimerCallback; _reconnectTimer.Elapsed += ReconnectTimerCallback; _reconnectTimer.Start(); } else { logger.Error("未启用厨显,不启用websocket服务"); } } else { logger.Error("未配置或未启用服务中心"); } } catch (Exception ex) { logger.Debug(ex, "InitWebSocket"); } } public void Query(string name, object content, Action executor) { if (this._websocket != null) { this._websocket.Query(name, content, executor); } } //public void On(string name , Action executor) //{ // if(this._websocket != null) // { // } //} public void On(string name, Action executor) { logger.Info("收到消息" + name); if (this._websocket != null) { this._websocket.On(name, executor); } } private void WebSocketClosed(object sender, EventArgs e) { this._connected = false; } private void WebSocketError(object sender, SuperSocket.ClientEngine.ErrorEventArgs e) { this._connected = false; } private void WebSocketOpened(object sender, EventArgs e) { this._connected = true; } /// /// 重新连接服务中心 /// public void RestartConnect() { //停止自动重连任务 if (_reconnectTimer != null) { _reconnectTimer.Close(); } //关闭连接 if (this._websocket != null && this._websocket.State != WebSocketState.Closed) { this._websocket.Close(); } //重新连接 StartConnect(); } void StartConnect() { this._websocket = null; InitWebSocket(); if (this._websocket != null) { this._websocket.Open(); } } private void ReconnectTimerCallback(object sender, System.Timers.ElapsedEventArgs e) { try { //already open or openning if (this._websocket.State == WebSocketState.Connecting || this._websocket.State == WebSocketState.Open) { return; } logger.Info("尝试连接服务中心……"); StartConnect(); } catch (Exception ex) { logger.Error(ex, "连接服务中心错误"); } } } }