151 lines
5.8 KiB
C#
151 lines
5.8 KiB
C#
using HandyControl.Controls;
|
|
using Newtonsoft.Json;
|
|
using Ping9719.WpfEx;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using TouchSocket.Core;
|
|
using TouchSocket.Http.WebSockets;
|
|
using TouchSocket.Sockets;
|
|
using WCS.Model.WebSocketModel;
|
|
|
|
namespace 货架标准上位机
|
|
{
|
|
public static class WebSocket
|
|
{
|
|
public static WebSocketClient client = null;
|
|
public static void InitWebSocket()
|
|
{
|
|
client = new WebSocketClient();
|
|
client.Setup(new TouchSocketConfig()
|
|
.SetRemoteIPHost("ws://127.0.0.1:7789/ws")
|
|
.ConfigureContainer(a =>
|
|
{
|
|
a.AddConsoleLogger();
|
|
})
|
|
.ConfigurePlugins(a =>
|
|
{
|
|
a.Add<WebSocketClientPlugin>();
|
|
//配置心跳
|
|
a.UseWebSocketHeartbeat()//使用心跳插件
|
|
.SetTick(TimeSpan.FromSeconds(5));//每5秒ping一次。
|
|
//配置断线重连
|
|
a.UseReconnection(-1, true, 1000);//-1表示一直重连
|
|
}));
|
|
client.Connect();
|
|
}
|
|
}
|
|
public class WebSocketClientPlugin : PluginBase, IWebSocketReceivedPlugin
|
|
{
|
|
private readonly ILog m_logger;
|
|
|
|
public WebSocketClientPlugin(ILog logger)
|
|
{
|
|
this.m_logger = logger;
|
|
}
|
|
public async Task OnWebSocketReceived(IWebSocket client, WSDataFrameEventArgs e)
|
|
{
|
|
switch (e.DataFrame.Opcode)
|
|
{
|
|
case WSDataType.Cont:
|
|
m_logger.Info($"收到中间数据,长度为:{e.DataFrame.PayloadLength}");
|
|
return;
|
|
|
|
case WSDataType.Text:
|
|
m_logger.Info(e.DataFrame.ToText());
|
|
if (!client.Client.IsClient)
|
|
{
|
|
client.Send("已收到");
|
|
}
|
|
//返回的报警信息 出入库盘点等日志信息
|
|
else
|
|
{
|
|
try
|
|
{
|
|
var message = e.DataFrame.ToText();
|
|
var warning = JsonConvert.DeserializeObject<WebSocketMessageModel>(message);
|
|
if (warning != null)
|
|
{
|
|
//通知类的
|
|
if (warning.IsWarning == false)
|
|
{
|
|
switch (warning.WarningType)
|
|
{
|
|
case WarningTypeEnum.通知刷新出库:
|
|
OutVentoryView.viewModel.RefreshDataGridItemSource();
|
|
client.Send(e.DataFrame.ToText());
|
|
break;
|
|
case WarningTypeEnum.通知刷新盘点:
|
|
StockTakingView.viewModel.RefreshDataGridItemSource();
|
|
client.Send(e.DataFrame.ToText());
|
|
break;
|
|
case WarningTypeEnum.恢复正常:
|
|
var SolvedGuids = warning.SolvedGuids;
|
|
SolvedGuids.ForEach(guid =>
|
|
{
|
|
WarningManager.RemoveWarning(guid);
|
|
});
|
|
TextBoxLog.AddLog(warning.WarningMessage, "InstoreLog", DateTime.Now);
|
|
client.Send(e.DataFrame.ToText());
|
|
break;
|
|
default: break;
|
|
}
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
|
|
Application.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
WarningManager.AddWarning(warning);
|
|
TextBoxLog.AddLog(warning.WarningMessage, "InstoreLog", DateTime.Now);
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
client.Send(e.DataFrame.ToText());
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
|
|
}
|
|
return;
|
|
|
|
case WSDataType.Binary:
|
|
if (e.DataFrame.FIN)
|
|
{
|
|
m_logger.Info($"收到二进制数据,长度为:{e.DataFrame.PayloadLength}");
|
|
}
|
|
else
|
|
{
|
|
m_logger.Info($"收到未结束的二进制数据,长度为:{e.DataFrame.PayloadLength}");
|
|
}
|
|
return;
|
|
|
|
case WSDataType.Close:
|
|
{
|
|
m_logger.Info("远程请求断开");
|
|
client.Close("断开");
|
|
}
|
|
return;
|
|
|
|
case WSDataType.Ping:
|
|
client.Pong();
|
|
break;
|
|
case WSDataType.Pong:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
await e.InvokeNext();
|
|
}
|
|
}
|
|
}
|