You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

248 lines
6.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using JwKdsV.Core.SocketMessage;
using NLog;
using POSV.Common;
using POSV.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WebSocket4Net;
namespace JwKdsV.Core
{
public class WebSocketEnter
{
private Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static WebSocketEx websocket;
private static WebSocketEnter _instance;
private System.Timers.Timer _reconnectTimer;
public static WebSocketEnter Instance
{
get
{
if(_instance == null)
{
_instance = new WebSocketEnter();
}
return _instance;
}
}
public void Init()
{
if(_reconnectTimer == null)
{
_reconnectTimer = new System.Timers.Timer();
}
//设置定时间隔(毫秒为单位)
this._reconnectTimer.Interval = 40000;
//设置执行一次false还是一直执行(true)
this._reconnectTimer.AutoReset = true;
//设置是否执行System.Timers.Timer.Elapsed事件
this._reconnectTimer.Enabled = true;
//绑定Elapsed事件
this._reconnectTimer.Elapsed -= ReconnectCallback;
this._reconnectTimer.Elapsed += ReconnectCallback;
//第一次直接连接
Reconnect();
}
private void ReconnectCallback(object sender, System.Timers.ElapsedEventArgs e)
{
if (websocket != null)
{
logger.Info("websocket连接状态<{0}>", websocket.State);
if (websocket.State != WebSocketState.Open)
{
logger.Info("websocket重新连接...");
websocket = null;
this.Reconnect();
}
}
else
{
//未初始化,初始化
logger.Info("websocket初始化...");
this.Reconnect();
}
}
/// <summary>
/// 打开websocket
/// </summary>
public void Reconnect()
{
if(websocket == null)
{
var ip = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_BUSINESS_SERVICECENTER_IP);
var port = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_BUSINESS_SERVICECENTER_PORT);
if(!string.IsNullOrEmpty(ip) && !string.IsNullOrEmpty(port))
{
var url = string.Format("ws://{0}:{1}/{2}", ip, port, "KDS-" + Global.Instance.StoreInfo.PosNo);
websocket = new WebSocketEx(url);
websocket.EnableAutoSendPing = true;
websocket.AutoSendPingInterval = 5;
websocket.Opened -= websocket_Opened;
websocket.Opened += websocket_Opened;
websocket.Error -= Websocket_Error;
websocket.Error += Websocket_Error;
websocket.Closed -= websocket_Closed;
websocket.Closed += websocket_Closed;
websocket.Open();
//订阅主题
SubScriptions();
}
else
{
logger.Error("服务中心地址未配置websocket未开启");
}
}
}
private void Websocket_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
{
logger.Error("websocket异常" + e.Exception);
}
/// <summary>
/// 获取连接服务中心状态
/// </summary>
/// <returns></returns>
public string GetWebSocketStatus()
{
var result = "离线";
if(websocket != null)
{
if(websocket.State == WebSocketState.Open)
{
result = "正常";
}
else
{
result = "离线";
}
}
return result;
}
public void SubScriptions()
{
this.On<string>(CommandName.NEWORDER, NEWORDER.OnNewOrder);
this.On<string>(CommandName.KDSHUACAI, KdsHuacaiNotify.OnKdsHuacaiNotify);
}
/// <summary>
/// 发送链式消息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="name"></param>
/// <param name="content"></param>
/// <param name="executor"></param>
/// <returns></returns>
public string Query<T>(string name, object content, Action<T> executor)
{
if (websocket != null)
{
if (websocket.State == WebSocketState.Open)
{
return websocket.Query<T>(name, content, executor);
}
else
{
return null;
}
}
else
{
return null;
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="name"></param>
/// <param name="content"></param>
public void Send(string name, object content)
{
if (websocket != null)
{
if (websocket.State == WebSocketState.Open)
{
websocket.Send(name, content);
}
}
}
public void On<T>(string name, Action<JsonWebSocket, T> executor)
{
if(websocket != null)
{
if(websocket.State == WebSocketState.Open)
{
websocket.On<T>(name, executor);
}
else
{
}
}
else
{
}
}
public void On<T>(string name, Action<T> executor)
{
if (websocket != null)
{
websocket.On<T>(name, executor);
}
else
{
}
}
void websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
{
//this.Invoke(new Action(() => {
// this.textBox1.Text = e.Message;
//}));
//this.textBox1.Invoke(new EventHandler(ShowMessage) , e.Message);
logger.Info("收到的消息 ==》" + e.Message);
}
void websocket_Closed(object sender, EventArgs e)
{
logger.Error("websocket关闭");
}
void websocket_Opened(object sender, EventArgs e)
{
logger.Info("websocket已打开");
}
void ShowMessage(object sender, EventArgs e)
{
//this.textBox1.Text = sender.ToString();
}
}
}