Files
wcs/货架标准上位机/WebSocket.cs
hehaibing-1996 adb0367a83 1.解决TCP添加失败问题
2.所有搜索记录倒叙排
3.优化:出入记录、库存记录增加货架类型分类查询
4.权限
5.优化下载app二维码
2024-07-02 09:05:21 +08:00

204 lines
8.9 KiB
C#

using HandyControl.Controls;
using Newtonsoft.Json;
using Ping9719.WpfEx;
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using TouchSocket.Core;
using TouchSocket.Http.WebSockets;
using TouchSocket.Sockets;
using WCS.Model.WebSocketModel;
using .Views.Controls;
namespace
{
public static class WebSocket
{
public static WebSocketClient client = null;
public static void InitWebSocket()
{
client = new WebSocketClient();
client.Setup(new TouchSocketConfig()
.SetRemoteIPHost(LocalFile.Config.WebSocketUrl)
.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();
//自定义实现心跳和重连
Task.Run(async () =>
{
while (true)
{
await Task.Delay(4000);
try
{
WebSocket.client.Ping();
await Task.Delay(200);
if (WebSocket.client.LastReceivedTime < DateTime.Now.AddSeconds(-10))
{
WebSocket.client.TryConnect();
}
}
catch (Exception ex)
{
}
}
});
}
}
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.:
if (LocalFile.Config.IsMx)
MXOutInventoryView.viewModel.RefreshDataGridItemSource();
else
OutVentoryView.viewModel.RefreshDataGridItemSource();
client.Send(e.DataFrame.ToText());
break;
case WarningTypeEnum.:
if (LocalFile.Config.IsMx)
MXOutInventoryView.viewModel.RefreshOutOrderList(MXOutInventoryView.viewModel.SelectedOutOrderNumber);
else
OutVentoryView.viewModel.RefreshOutOrderList(MXOutInventoryView.viewModel.SelectedOutOrderNumber);
client.Send(e.DataFrame.ToText());
break;
case WarningTypeEnum.:
StockTakingView.viewModel.RefreshDataGridItemSource();
client.Send(e.DataFrame.ToText());
break;
case WarningTypeEnum.:
MXPDView.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;
case WarningTypeEnum.:
var scanner = ScannerManager.Scanners.Where(t => t.IsInstoreMode && t.ShelfCode == warning.ShelfCode && t.IsInstoreModeTime < warning.CreateTime)
.FirstOrDefault();
if (scanner != null)
{
scanner.IsInstoreMode = false;
scanner.ShelfCode = string.Empty;
scanner.ModulesStr = string.Empty;
scanner.ScannerDisplayControl.RefreshValues(string.Empty, string.Empty);
}
break;
case WarningTypeEnum.:
TextBoxLog.AddLog(warning.WarningMessage, "selfCheck", warning.CreateTime);
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();
}
}
}