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.

1556 lines
70 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 CatLib;
using Highway.Assemble.common;
using Highway.Assemble.Common;
using Highway.Assemble.EquipClient;
using Highway.Assemble.Sql;
using Highway.Assemble.SqlSugar.serviceImpl;
using Highway.SocketServer;
using HighWayAssemble.Protocol;
using Mesnac.DeviceAdapter;
using RRQMCore.XREF.Newtonsoft.Json.Serialization;
using RRQMSocket;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Http;
using TouchSocket.Rpc;
using TouchSocket.Sockets;
using static System.Net.Mime.MediaTypeNames;
using IPHost = TouchSocket.Sockets.IPHost;
using SocketClient = TouchSocket.Sockets.SocketClient;
namespace HighWayAssemble
{
public class FrmDisplayModel
{
int DeleteLogIntervel = 6;
string RFID_1_1 = "";
string RFID_1_2 = "";
string RFID_2_1 = "";
string RFID_2_2 = "";
int IsOPCFlag;
OPCControls.OPCControlsData opc;
ISql Sql = null;
// IConfigInfo configInfo = null;
ISoftInfo SoftInfo = null;
public static IAsyncSocketServer SocketServer = null;
public static MesHttpClient MesHttpClient = null;
IBoxDB m_BoxDB = null;
IEquipClient m_EquipClient = null;
private List<IOInfo> IO_Infolist = new List<IOInfo>();
private List<IOInfo> IO_OUTfolist = new List<IOInfo>();
private List<TcpSessionClient> onLineClient;
private SimpleTcpService tcpService;
private TcpService m_service;
List<byte[]> bufferlit = new List<byte[]>();
private class IOInfo
{
public int id;
public byte[] state;
public DateTime time;
}
public FrmDisplayModel()
{
OnRegister();//绑定回调函数
}
/// <summary>
/// 初始化创建服务端
/// </summary>
void Init()
{
try
{
SoftInfo = App.Make<ISoftInfo>();
SoftInfo.CollectInfo = new Collect();
// configInfo = App.Make<IConfigInfo>();
m_BoxDB = App.Make<IBoxDB>();
GetConfiginfo();
Sql = App.Make<ISql>(SoftInfo.CollectInfo.sqlstring);
GetSoftInfo();
m_EquipClient = App.Make<IEquipClient>();
InitEquipClient();
//创建webapi
var t = Task.Run(async delegate
{
await Task.Delay(10);
CreateTcp();
MesHttpClient = new MesHttpClient();
MesHttpClient.init();
var service = new HttpService();
await service.SetupAsync(new TouchSocketConfig()
.SetListenIPHosts(SoftInfo.CollectInfo.Port)
.ConfigureContainer(a =>
{
////添加跨域服务
//a.AddCors(corsOption =>
//{
// //添加跨域策略后续使用policyName即可应用跨域策略。
// corsOption.Add("cors", corsBuilder =>
// {
// corsBuilder.AllowAnyMethod()
// .AllowAnyOrigin();
// });
//});
a.AddConsoleLogger();
a.AddRpcStore(store =>
{
store.RegisterServer<ApiServer>();//注册服务
});
})
.ConfigurePlugins(a =>
{
a.UseWebApi()
.ConfigureConverter(converter =>
{
converter.AddJsonSerializerFormatter(new Newtonsoft.Json.JsonSerializerSettings() { Formatting = Newtonsoft.Json.Formatting.None });
});
//此插件是http的兜底插件应该最后添加。作用是当所有路由不匹配时返回404.且内部也会处理Option请求。可以更好的处理来自浏览器的跨域探测。
a.UseDefaultHttpServicePlugin();
}
));
await service.StartAsync();
await m_service.StartAsync();//启动
//CreatSocketServer();
if (IsOPCFlag == 1)
{
LoadOPCInfo();
}
FrmDisplayView.LogInfo.Info("创建SockteSvr成功");
});
Task.Run(async delegate
{
while (true)
{//每十分钟将软件状态插入数据库
Sql.InsertCollectState(SoftInfo.CollectInfo.collectID, 1);
await Task.Delay(1000 * 60 * 10);
}
});
//if (SoftInfo.mode == Mode.Triangle)
//{
// Task.Run(async delegate
// {
// await Task.Delay(1000);
// //SendHeard();
// });
// //Thread th = new Thread(SendHeard);
// //th.Start();
//}
//DealProcessReceive();
DeleteLogFile();
}
catch (Exception ex)
{
}
}
private Object obj = new object();
//消息队列 用于独立线程
private List<MsgInfo> m_Msg2EquipClient = new List<MsgInfo>(1024);
private List<MsgInfo> Msg2EquipClient
{
get
{
lock (obj)
{
return m_Msg2EquipClient;
}
}
set
{
lock (obj)
{
m_Msg2EquipClient = value;
}
}
}
private Object obj1 = new object();
//消息队列 用于独立线程
private List<MsgInfo> m_MsgInfolist = new List<MsgInfo>(1024);
/// <summary>
/// 数据处理服务类
/// </summary>
class MsgInfo
{
public DateTime datetime;
public int Length;
public byte[] data;
public long time;
internal TcpSessionClient SocketClient;
}
/// <summary>
/// 创建OPC客户端
/// </summary>
private void LoadOPCInfo()
{
try
{
opc = new OPCControls.OPCControlsData();
opc.ValuesChangedWithTimeStamp += new OPCControls.OPCControlsData.ValuesChangedWithTimeStampEventHandler(ValuesChangedWithTimeStampEventHandler);
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.Fatal("初始化OPC异常!空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
}
}
/// <summary>
/// OPC点位监控实现
/// </summary>
/// <param name="Tag"></param>
/// <param name="Value"></param>
/// <param name="Quality"></param>
/// <param name="TimeStamp"></param>
private void ValuesChangedWithTimeStampEventHandler(string Tag, object Value, bool Quality, DateTime TimeStamp)
{
try
{
FrmDisplayView.LogInfo.Info(string.Format("》》》收到OPC点位信号,Tag:{0},消息内容:{1},时间:{2}", Tag, (int)Value, TimeStamp));
switch (Tag)
{
//胶架已上小车用该点值变成1触发RFID上面天线读取胶架号
case @"\\172.18.19.21\HMMLZD.No1_IntoStack_RubberOK.Value":
if ((int)Value == 1)
{
var sensorInfo = SoftInfo.SensorList.Find((x) => { return x.combineid == RFID_1_1; });
string INput = m_EquipClient.ReadEPCData(int.Parse(sensorInfo.combineid));
if (INput != "")
{
string strTag = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RFIDMessage.Value", 1);
opc.WriteTag(strTag, INput);
}
}
break;
//小车已到指定栈道请求校验定位是否准确用该点值变成1触发RFID侧面天线读取栈道入口处芯片
case @"\\172.18.19.21\HMMLZD.No1_IntoStack_Request.Value":
if ((int)Value == 1)
{
var sensorInfo = SoftInfo.SensorList.Find((x) => { return x.combineid == RFID_1_2; });
string INput = m_EquipClient.ReadEPCData(int.Parse(sensorInfo.combineid));
if (INput != "")
{
string strTag = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RealStack.Value", 1);
opc.WriteTag(strTag, INput);
}
}
break;
//胶架已上小车用该点值变成1触发RFID上面天线读取胶架号
case @"\\172.18.19.21\HMMLZD.No2_IntoStack_RubberOK.Value":
if ((int)Value == 1)
{
var sensorInfo = SoftInfo.SensorList.Find((x) => { return x.combineid == RFID_2_1; });
string INput = m_EquipClient.ReadEPCData(int.Parse(sensorInfo.combineid));
if (INput != "")
{
string strTag = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RFIDMessage.Value", 2);
opc.WriteTag(strTag, INput);
}
}
break;
//小车已到指定栈道请求校验定位是否准确用该点值变成1触发RFID侧面天线读取栈道入口处芯片
case @"\\172.18.19.21\HMMLZD.No2_IntoStack_Request.Value":
if ((int)Value == 1)
{
var sensorInfo = SoftInfo.SensorList.Find((x) => { return x.combineid == RFID_2_2; });
string INput = m_EquipClient.ReadEPCData(int.Parse(sensorInfo.combineid));
if (INput != "")
{
string strTag = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RealStack.Value", 2);
opc.WriteTag(strTag, INput);
}
}
break;
}
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.Fatal("接收OPC数据异常!空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
}
}
/// <summary>
/// 加载配置文件信息
/// </summary>
void GetConfiginfo()
{
try
{
SoftInfo.CollectInfo.sqlstring = System.Configuration.ConfigurationManager.AppSettings["SqlString"];
SoftInfo.CollectInfo.collectID = System.Configuration.ConfigurationManager.AppSettings["CollectID"];
SoftInfo.CollectInfo.UpdateUrl = System.Configuration.ConfigurationManager.AppSettings["UpdateUrl"];
DeleteLogIntervel = int.Parse(System.Configuration.ConfigurationManager.AppSettings["DeleteLogIntervel"]);
IsOPCFlag = int.Parse(System.Configuration.ConfigurationManager.AppSettings["IsOPCFlag"]);
RFID_1_1 = System.Configuration.ConfigurationManager.AppSettings["1_RFID_1"];
RFID_1_2 = System.Configuration.ConfigurationManager.AppSettings["1_RFID_2"];
RFID_2_1 = System.Configuration.ConfigurationManager.AppSettings["2_RFID_1"];
RFID_2_2 = System.Configuration.ConfigurationManager.AppSettings["2_RFID_2"];
if (string.IsNullOrEmpty(SoftInfo.CollectInfo.collectID))
{
App.TriggerHalt(EventSystem.LoadCollectID);
}
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.Fatal("读取配置文件异常!空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
}
}
/// <summary>
/// 设备信息初始化加载
/// </summary>
void InitEquipClient()
{
//发送设备信息表
m_EquipClient.EquipInfo(SoftInfo.EquipList);
//FrmDisplayView.LogInfo.Debug("》》》InitEquipClient:初始化加载设备");
//发送传感器
m_EquipClient.SensorInfo(SoftInfo.SensorList);
m_EquipClient.Init();
//设备状态回调
m_EquipClient.RecEquipState(async (state) =>
{
App.TriggerHalt(EventSystem.updateEquipListInfo, state);
for (int i = 0; i < state.Count; i++)
{
//add by 2024-08-26 OPC新增设备断线后写入空格
//if (state[i].m_ConnectState == 2)
//{
// if (state[i].m_iDeviceId == 30101)
// {
// string strTag1 = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RFIDMessage.Value", 1);
// opc.WriteTag(strTag1, "NoRead");
// string strTag2 = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RealStack.Value", 1);
// opc.WriteTag(strTag2, "NoRead");
// }
// if (state[i].m_iDeviceId == 30102)
// {
// string strTag = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RFIDMessage.Value", 2);
// opc.WriteTag(strTag, "NoRead");
// string strTag2 = string.Format(@"\\172.18.19.21\HMMLZD.No{0}_IntoStack_RealStack.Value", 2);
// opc.WriteTag(strTag2, "NoRead");
// }
//}
//Sql.InsertEquipState(state[i].m_iDeviceId.ToString(), state[i].m_ConnectState);
await InsertDeviceState(state[i].m_iDeviceId, state[i].m_ConnectState);
}
});
// 返回读取到的数据 125+4
m_EquipClient.RetReadData(async (id, data) =>
{
if (IsOPCFlag == 1)
{
string info = "";
if (data == null)
{
info = "NoData";
}
else
{
//info = MsgUtil.bytesToHexStr(data, data.Length);
}
App.TriggerHalt(EventSystem.updateSensorListInfo, id, info);
//Sql.InsertReadData(id.ToString(), info, 0);
await InsertRealWorkData(id.ToString(), info, 0);
}
else
{
//Head head = new Head();
//head.start = 0x56;
//short addr = GetMESCallback(id);
//head.addr = addr;
//head.mstaseq = 241;
//head.control = 125 + 4;
byte[] dataInfo;
string info = "";
if (data == null)
{
if (SoftInfo.mode == Mode.Triangle)
{
info = "NoData";
dataInfo = Encoding.ASCII.GetBytes(info);
}
else
{
dataInfo = new byte[0];
}
}
else
{
//data = data.Where((x, i) => data.FindIndex(z => z.EPCstring == x.EPCstring) == i).ToList();
if (data != null && data.Any())
{
info = string.Join(",", data.Select(item => item.EPCstring));
}
else
{
info = "NoData"; // 处理空集合的情况
}
//dataInfo = data;
// dataInfo = Encoding.ASCII.GetBytes(MsgUtil.bytesToHexStr(data, data.Length));//dataInfo = data;
//info = MsgUtil.bytesToHexStr(data, data.Length);
//info = Encoding.ASCII.GetString(data, 0, data.Length);
}
//var num = BitConverter.GetBytes(id);
//head.length = (Int16)(4 + dataInfo.Length);
//var headbuf = MsgUtil.StructToBytes(head);
//byte[] sendbuf = new byte[7 + 4 + dataInfo.Length + 3];
//Array.Copy(headbuf, 0, sendbuf, 0, headbuf.Length);
//Array.Copy(num, 0, sendbuf, 7, num.Length);
//Array.Copy(dataInfo, 0, sendbuf, 7 + 4, dataInfo.Length);
//byte[] Verify = MsgUtil.CalculateVerify(sendbuf, sendbuf.Length - 3);
//Array.Copy(Verify, 0, sendbuf, sendbuf.Length - 3, 2);
//sendbuf[sendbuf.Length - 1] = 0x86;
App.TriggerHalt(EventSystem.updateSensorListInfo, id, info);
//var token = SendMessageToClient(addr, sendbuf);
//FrmDisplayView.LogInfo.Info(string.Format("发送MES主动读取到的数据 MES地址:{0},消息内容:{1} --{2}", addr, MsgUtil.bytesToHexStr(sendbuf, sendbuf.Length), token == null ? "MES断开" : ""));
//2022-11-17 添加注释等待时间10s
//Sql.InsertReadData(id.ToString(), info, 0);
await InsertRealWorkData(id.ToString(), info, 0);
}
});
//传感器数据回调 主动读取EPC 125+3
m_EquipClient.RecSendData(async (id, data) =>
{
//Head head = new Head();
//head.start = 0x56;
//short addr = GetMESCallback(id);
//head.addr = addr;
//head.mstaseq = 241;
//head.control = 125 + 3;
byte[] dataInfo;
string info = "";
if (data == null)
{
if (SoftInfo.mode == Mode.Triangle)
{
info = "NoData";
dataInfo = Encoding.ASCII.GetBytes(info);
}
else
{
dataInfo = new byte[0];
}
}
else
{
//data = data.Where((x, i) => data.FindIndex(z => z.EPCstring == x.EPCstring) == i).ToList();
if (data != null && data.Any())
{
info = string.Join(",", data.Select(item => item.EPCstring));
}
else
{
info = "NoData"; // 处理空集合的情况
}
//dataInfo = data;// dataInfo = Encoding.ASCII.GetBytes(MsgUtil.bytesToHexStr(data, data.Length));//dataInfo = data;
//info = MsgUtil.bytesToHexStr(data, data.Length);
//info = Encoding.ASCII.GetString(data, 0, data.Length);
}
//var num = BitConverter.GetBytes(id);
//// byte[] dataInfo = Encoding.ASCII.GetBytes(data);
//head.length = (Int16)(4 + dataInfo.Length);
//var headbuf = MsgUtil.StructToBytes(head);
//byte[] sendbuf = new byte[7 + 4 + dataInfo.Length + 3];
//Array.Copy(headbuf, 0, sendbuf, 0, headbuf.Length);
//Array.Copy(num, 0, sendbuf, 7, num.Length);
//Array.Copy(dataInfo, 0, sendbuf, 7 + 4, dataInfo.Length);
//byte[] Verify = MsgUtil.CalculateVerify(sendbuf, sendbuf.Length - 3);
//Array.Copy(Verify, 0, sendbuf, sendbuf.Length - 3, 2);
//sendbuf[sendbuf.Length - 1] = 0x86;
App.TriggerHalt(EventSystem.updateSensorListInfo, id, info);
//var token = SendMessageToClient(addr, sendbuf);
//FrmDisplayView.LogInfo.Info(string.Format("发送MES触发读取数据 MES地址:{0},消息内容:{1} --{2}", addr, MsgUtil.bytesToHexStr(sendbuf, sendbuf.Length), token == null ? "MES断开" : ""));
//2022-11-17 添加注释等待时间10s
//Sql.InsertReadData(id.ToString(), info, 2);
MesParaData mesParaData = new MesParaData();
mesParaData.EQUID = id.ToString();
mesParaData.EPCID = info;
mesParaData.READSTATUS = info == "NoData" ? "1" : "0";
mesParaData.READTIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
MesHttpClient.autoread(mesParaData);
await InsertRealWorkData(id.ToString(), info, 2);
});
//自报数据回调
m_EquipClient.RecAutoData(async (id, data) =>
{
//MesHttpClient.autoread();
string info = "";
byte[] dataInfo;
if (data == null)
{
if (SoftInfo.mode == Mode.Triangle)
{
info = "NoData";
dataInfo = Encoding.ASCII.GetBytes(info);
}
else
{
dataInfo = new byte[0];
}
}
else
{
dataInfo = data; //Encoding.ASCII.GetBytes(MsgUtil.bytesToHexStr(data, data.Length));//dataInfo = data;
info = MsgUtil.bytesToHexStr(data, data.Length);
}
App.TriggerHalt(EventSystem.updateSensorListInfo, id, info);
if (info == "FF")
{//这里是IO的信息
var sensorInfo = SoftInfo.SensorList.Find((x) => { return x.sensorid == id.ToString(); });
if (sensorInfo == null)
{
return;
}
else
{
if (sensorInfo.returnImm.Equals("1"))//
{
//这里默认是IO类型数据
if (sensorInfo.DelayTime > 0)//回调延时
{
var t = Task.Run(async delegate
{
await Task.Delay(sensorInfo.DelayTime);
m_EquipClient.ReadEPC(MsgUtil.ParseToInt(sensorInfo.CallCombineID));
});
}
else
{
m_EquipClient.ReadEPC(MsgUtil.ParseToInt(sensorInfo.CallCombineID));
}
}
else
{//获取到回调读写器的信息
var sensor = SoftInfo.SensorList.Find((x) => { return x.sensorid == sensorInfo.CallCombineID; });
if (sensor == null)
{
return;
}
//var t = Task.Run(async delegate
//{
// await Task.Delay(1);
// m_EquipClient.Device_BeginIdentify(MsgUtil.ParseToInt(sensorInfo.CallCombineID));//设置读写器连续读
//});
Thread m_bgwWaitingForData = new Thread(() => m_EquipClient.Device_BeginIdentify(sensorInfo.CallCombineID));
m_bgwWaitingForData.IsBackground = true;
m_bgwWaitingForData.Start();
//m_EquipClient.Device_BeginIdentify(MsgUtil.ParseToInt(sensorInfo.CallCombineID));//设置读写器连续读
//Task.Run(async delegate
//{
// await Task.Delay(MsgUtil.ParseToInt(sensorInfo.timeout) + 500);
// if (IdentifyReadData != null)
// {
// dataInfo = new byte[IdentifyReadData.Length];
// Array.Copy(IdentifyReadData, 0, dataInfo, 0, IdentifyReadData.Length);
// }
// else
// {
// dataInfo = Encoding.ASCII.GetBytes("NoData");
// }
//});
}
}
}
Head head = new Head();
head.start = 0x56;
short addr = GetMESCallback(id);
head.addr = addr;
head.mstaseq = 241;
head.control = 125 + 6;
var num = BitConverter.GetBytes(id);//合并编号
// byte[] dataInfo = data;// Encoding.ASCII.GetBytes(data);
var len = dataInfo.Length;
head.length = (Int16)(4 + dataInfo.Length + (len == 0 ? 0 : 1));//数据长度
var headbuf = MsgUtil.StructToBytes(head);
var sendbuf = new byte[7 + 4 + (len == 0 ? 0 : 1) + len + 3];
Array.Copy(headbuf, 0, sendbuf, 0, headbuf.Length);
Array.Copy(num, 0, sendbuf, 7, num.Length);
sendbuf[7 + 4] = (byte)len;
Array.Copy(dataInfo, 0, sendbuf, 7 + 4 + 1, dataInfo.Length);
byte[] Verify = MsgUtil.CalculateVerify(sendbuf, sendbuf.Length - 3);
Array.Copy(Verify, 0, sendbuf, sendbuf.Length - 3, 2);
sendbuf[sendbuf.Length - 1] = 0x86;
var token = SendMessageToClient(addr, sendbuf);
FrmDisplayView.LogInfo.Info(string.Format("发送MES自报数据 MES地址:{0},消息内容:{1} --{2}", addr, MsgUtil.bytesToHexStr(sendbuf, sendbuf.Length), token == false ? "MES断开" : ""));
//2022-11-17 添加注释等待时间10s
//Sql.InsertReadData(id.ToString(), info, 1);
await InsertRealWorkData(id.ToString(), info, 1);
});
/// 写入的数据是否成功反馈
m_EquipClient.RecGetData(async (id, data, state) =>
{
switch (state)
{
case 3:
App.TriggerHalt(EventSystem.updateSensorListInfo, id, "常亮");
break;
case 4:
App.TriggerHalt(EventSystem.updateSensorListInfo, id, "熄灭");
break;
case 5:
App.TriggerHalt(EventSystem.updateSensorListInfo, id, "常亮后自动关闭");
break;
case 6:
App.TriggerHalt(EventSystem.updateSensorListInfo, id, "闪亮");
break;
}
RecWrite recWrite = new RecWrite();
recWrite.head.start = 0x56;
recWrite.head.control = 125 + 5;
recWrite.head.mstaseq = 241;
short addr = GetMESCallback(id);
recWrite.head.addr = addr;
recWrite.num = id;
recWrite.head.length = 5;
recWrite.state = (byte)data;
var sendbuf = MsgUtil.StructToBytes(recWrite);
byte[] Verify = MsgUtil.CalculateVerify(sendbuf, sendbuf.Length - 3);
Array.Copy(Verify, 0, sendbuf, sendbuf.Length - 3, 2);
sendbuf[sendbuf.Length - 1] = 0x86;
var token = SendMessageToClient(addr, sendbuf);
FrmDisplayView.LogInfo.Info(string.Format("发送MES 写入的数据{0} MES地址:{1},消息内容:{2} --{3}", data == 1 ? "成功" : "失败", addr, MsgUtil.bytesToHexStr(sendbuf, sendbuf.Length), token == false ? "MES断开" : ""));
//Sql.InsertReadData(id.ToString(), recWrite.state.ToString(), state);
await InsertRealWorkData(id.ToString(), recWrite.state.ToString(), state);
});
//Baogq add by 2019年12月2日 09:06:38新加连接线程
Task.Run(async delegate
{
await Task.Delay(100);
m_EquipClient.CreatEquipClient();
});
//Thread th1 = new Thread(m_EquipClient.CreatEquipClient);
//th1.Start();
}
/// <summary>
/// 设备状态插库
/// </summary>
/// <param name="deviceid">设备编号</param>
/// <param name="devicestate">设备状态</param>
/// <returns></returns>
public async Task<int> InsertDeviceState(int deviceid,int devicestate)
{
try
{
DeviceState device = new DeviceState();
device.deviceId = deviceid;
device.deviceState = devicestate;
device.deviceTime = DateTime.Now;
return await new BaseServices<DeviceState>().Add(device);
}
catch (Exception ex)
{
return 0;
}
}
/// <summary>
/// 设备数据数据插库
/// </summary>
/// <param name="CombID">合并编号</param>
/// <param name="data">标签数据</param>
/// <param name="type">上传类型</param>
/// <returns></returns>
public async Task<bool> InsertRealWorkData(string CombID, string data, int type)
{
try
{
RealWorkdata realWorkdata = new RealWorkdata();
realWorkdata.Combineid = CombID.ToString();
realWorkdata.Data = data;
realWorkdata.Reportmode = type;
realWorkdata.Tm = DateTime.Now;
realWorkdata.Edittime = DateTime.Now;
realWorkdata.Deleteflag = 0;
var MaterialTypeList = await new BaseServices<RealWorkdata>().Add(realWorkdata);
return true;
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.Fatal("插入数据失败" + ex.ToString());
return false;
}
}
public bool InsertRealMesData(string CombID, string data,string response, int type)
{
try
{
RealMesdata realWorkdata = new RealMesdata();
realWorkdata.Combineid = CombID.ToString();
realWorkdata.Data = data;
realWorkdata.Response = response;
realWorkdata.Reportmode = type;
realWorkdata.Tm = DateTime.Now;
realWorkdata.Edittime = DateTime.Now;
realWorkdata.Deleteflag = 0;
var MaterialTypeList = new BaseServices<RealMesdata>().Add1(realWorkdata);
return true;
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.Fatal("插入数据失败" + ex.ToString());
return false;
}
}
/// <summary>
/// 获取汇集软件、适配软件、设备信息数据
/// </summary>
public void GetSoftInfo()
{
SoftInfo.mesSoftList = Sql.GetMesEquipList(SoftInfo.CollectInfo.collectID);
SoftInfo.EquipList = Sql.GetEquipList(SoftInfo.CollectInfo.collectID);
var collectInfo = Sql.GetCollectInfo(SoftInfo.CollectInfo.collectID);
SoftInfo.CollectInfo.collectName = collectInfo.collectName;
SoftInfo.CollectInfo.Port = collectInfo.Port;
if (SoftInfo.EquipList != null && SoftInfo.EquipList.Count > 0)
{
if (SoftInfo.SensorList == null)
{
SoftInfo.SensorList = new List<Sensor>();
}
for (int i = 0; i < SoftInfo.EquipList.Count; i++)
{
var sensorInfo = Sql.GetSensorList(SoftInfo.EquipList[i].deviceId);
if (sensorInfo != null)
{
SoftInfo.SensorList.AddRange(sensorInfo);
}
}
}
InsetData2Box();
App.Trigger(EventSystem.UpdateViewList, SoftInfo);
}
byte[] Heartbuf = new byte[10];
/// <summary>
/// 主动发送心跳函数
/// </summary>
void SendHeard()
{
//#if !DEBUG
while (true)
{
try
{
Heart heart = new Heart();
heart.head.start = 0x56;
heart.head.addr = 101;
heart.head.control = 101;
heart.head.length = 0;
heart.head.mstaseq = 241;
byte[] headbuf = MsgUtil.StructToBytes(heart.head);
Array.Copy(headbuf, 0, Heartbuf, 0, headbuf.Length);
byte[] Verify = MsgUtil.CalculateVerify(headbuf, headbuf.Length);
Array.Copy(Verify, 0, Heartbuf, 7, Verify.Length);
Heartbuf[9] = 0x86;
var tokens = onLineClient.ToList();
if (tokens != null)
FrmDisplayView.LogInfo.Error("当前MES连接数" + tokens.Count);
//判断是否有重复的软件编号
for (int i = 0; i < tokens.Count; i++)
{
if (tokens[i].MainSocket != null)
{
bool isRepeat = onLineClient.GroupBy(x => x.Id).Any(g => g.Count() > 1);
if (isRepeat)
{
//存在重复编号连接移除第0个
var findflag = onLineClient.FindIndex((x) => { return x.Id == tokens[i].Id; });
onLineClient.Remove(onLineClient[findflag]);
FrmDisplayView.LogInfo.ErrorFormat("存在重复MES软件连接移除上次MES软件地址{0}, IP:{1}:{2}, 成功!", onLineClient[findflag].Id, onLineClient[findflag].IP, onLineClient[findflag].Port);
//RemoveMesSocketClientbyFlag(tokens[i].Id);
}
else
{
tokens[i].SendAsync(Heartbuf);
FrmDisplayView.LogInfo.ErrorFormat("已连接MES软件编号" + tokens[i].Id + ",MES软件地址{0} ,端口号:{1},发送MES软件心跳报文:{2}", tokens[i].IP, tokens[i].Port, MsgUtil.bytesToHexStr(Heartbuf, Heartbuf.Length));
}
}
}
}
//#endif
catch (Exception ex)
{
FrmDisplayView.LogInfo.FatalFormat("空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
}
Thread.Sleep(1000 * 5);
}
}
/// <summary>
/// 加载本地数据库数据
/// </summary>
void InsetData2Box()
{
var ConfigDB = m_BoxDB.GetAutoBox().Select<Collect>("from Collect");
var MesSoftDB = m_BoxDB.GetAutoBox().Select<mesSoft>("from MesSoft");
var EquipDB = m_BoxDB.GetAutoBox().Select<Equip>("from Equip");
var SensorDB = m_BoxDB.GetAutoBox().Select<Sensor>("from Sensor");
if (SoftInfo.CollectInfo.Port != 0)
{
if (ConfigDB.Count > 0)
{
for (int i = 0; i < ConfigDB.Count; i++)
{
m_BoxDB.GetAutoBox().Delete("Collect", ConfigDB[i].index);//
}
}
m_BoxDB.Insert("Collect", SoftInfo.CollectInfo);
}
else
{
SoftInfo.CollectInfo.collectName = ConfigDB.Count == 0 ? "请设置正确的软件编号" : ConfigDB[0].collectName + "(初始未连接到数据库)";
SoftInfo.CollectInfo.Port = ConfigDB.Count == 0 ? 6099 : ConfigDB[0].Port;// m_BoxDB.GetAutoBox().Select<mesSoft>("from MesSoft");
}
if (SoftInfo.mesSoftList != null && SoftInfo.mesSoftList.Count != 0)
{
if (MesSoftDB.Count > 0)
{
for (int i = 0; i < MesSoftDB.Count; i++)
{
m_BoxDB.GetAutoBox().Delete("MesSoft", MesSoftDB[i].index);//
}
}
for (int i = 0; i < SoftInfo.mesSoftList.Count; i++)
{
m_BoxDB.Insert("MesSoft", SoftInfo.mesSoftList[i]);
}
}
else
{//auto.Select<PlayerInfo>("from PlayerInfo Age ==?",15)
SoftInfo.mesSoftList = MesSoftDB;// m_BoxDB.GetAutoBox().Select<mesSoft>("from MesSoft");
}
if (SoftInfo.EquipList != null && SoftInfo.EquipList.Count != 0)
{
if (EquipDB.Count > 0)
{
for (int i = 0; i < EquipDB.Count; i++)
{
m_BoxDB.GetAutoBox().Delete("Equip", EquipDB[i].index);//
}
}
for (int i = 0; i < SoftInfo.EquipList.Count; i++)
{
m_BoxDB.Insert("Equip", SoftInfo.EquipList[i]);
}
}
else
{
SoftInfo.EquipList = EquipDB;
}
if (SoftInfo.SensorList != null && SoftInfo.SensorList.Count != 0)
{
if (SensorDB.Count > 0)
{
for (int i = 0; i < SensorDB.Count; i++)
{
m_BoxDB.GetAutoBox().Delete("Sensor", SensorDB[i].index);//
}
}
for (int i = 0; i < SoftInfo.SensorList.Count; i++)
{
m_BoxDB.Insert("Sensor", SoftInfo.SensorList[i]);
}
}
else
{
SoftInfo.SensorList = SensorDB;
}
}
//根据传感器编号 获取MES ID
/// <summary>
/// 获取回调MES编号
/// </summary>
/// <param name="id">传感器编号</param>
/// <returns></returns>
short GetMESCallback(int id)
{
var sensorInfo = SoftInfo.SensorList.Find((x) => { return x.sensorid == id.ToString(); });
if (sensorInfo == null)
{
return 0;
}
return (short)MsgUtil.ParseToInt(sensorInfo.mesID);
}
/// <summary>
/// 注册插件服务
/// </summary>
void OnRegister()
{
App.On(EventSystem.GetSqlSvrData, GetSoftInfo);
App.Listen(EventSystem.UpdateMesListSQL, () =>
{
SoftInfo.mesSoftList = Sql.GetMesEquipList(SoftInfo.CollectInfo.collectID);
return SoftInfo.mesSoftList;
});
App.Listen(EventSystem.updateEquipListInfoSQL, () =>
{
SoftInfo.EquipList = Sql.GetEquipList(SoftInfo.CollectInfo.collectID);
return SoftInfo.EquipList;
});
App.Listen(EventSystem.updateSensorListInfoSQL, () =>
{
SoftInfo.SensorList = Sql.GetSensorList(SoftInfo.CollectInfo.collectID);
return SoftInfo.SensorList;
});
App.On(EventSystem.StartLoad, () =>
{
Init();
});
App.On(EventSystem.AppClosed, () =>
{
Sql.InsertCollectState(SoftInfo.CollectInfo.collectID, 0);
});
}
/// <summary>
/// 判断该传感器是否已维护
/// </summary>
/// <param name="Senor">传感器编号</param>
/// <returns></returns>
bool FindSenor(string Senor)
{
bool bResult = false;
try
{
for (int i = 0; i < SoftInfo.SensorList.Count; i++)
{
if (Senor == SoftInfo.SensorList[i].sensorid)
{
bResult = true;
break;
}
else
{
bResult = false;
}
}
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.Info(Senor + "传感器编号异常," + ex);
bResult = false;
}
return bResult;
}
/// <summary>
/// 判断读写器是否立即返回
/// </summary>
/// <param name="Senor"></param>
/// <returns></returns>
bool FindSenorType(string Senor)
{
bool bResult = false;
try
{
for (int i = 0; i < SoftInfo.SensorList.Count; i++)
{
if (Senor == SoftInfo.SensorList[i].sensorid)
{
if (SoftInfo.SensorList[i].returnImm == "1")
{
bResult = true;
break;
}
else
{
bResult = false;
}
}
}
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.Info(Senor + "传感器编号异常," + ex);
bResult = false;
}
return bResult;
}
/// <summary>
/// 删除30天前的日志
/// </summary>
void DeleteLogFile()
{
var t = Task.Run(async delegate
{
while (true)
{
if (DateTime.Now.Hour == 6)
{
//文件夹路径
string strFolderPath = Environment.CurrentDirectory + "\\Log\\异常信息日志";
DirectoryInfo dyInfo = new DirectoryInfo(strFolderPath);
//获取文件夹下所有的文件
foreach (FileInfo feInfo in dyInfo.GetFiles())
{
//判断文件日期是否几天前创建,是则删除
if (feInfo.CreationTime < DateTime.Today.AddDays(-1 * 30 * DeleteLogIntervel))
feInfo.Delete();
}
string strFolderPath1 = Environment.CurrentDirectory + "\\Log\\心跳交互日志";
DirectoryInfo dyInfo1 = new DirectoryInfo(strFolderPath1);
//获取文件夹下所有的文件
foreach (FileInfo feInfo1 in dyInfo1.GetFiles())
{
//判断文件日期是否几天前创建,是则删除
if (feInfo1.CreationTime < DateTime.Today.AddDays(-1 * 30 * DeleteLogIntervel))
feInfo1.Delete();
}
string strFolderPath2 = Environment.CurrentDirectory + "\\Log\\设备交互日志";
DirectoryInfo dyInfo2 = new DirectoryInfo(strFolderPath2);
//获取文件夹下所有的文件
foreach (FileInfo feInfo2 in dyInfo2.GetFiles())
{
//判断文件日期是否几天前创建,是则删除
if (feInfo2.CreationTime < DateTime.Today.AddDays(-1 * 30 * DeleteLogIntervel))
feInfo2.Delete();
}
string strFolderPath3 = Environment.CurrentDirectory + "\\Log\\MES交互日志";
DirectoryInfo dyInfo3 = new DirectoryInfo(strFolderPath3);
//获取文件夹下所有的文件
foreach (FileInfo feInfo3 in dyInfo3.GetFiles())
{
//判断文件日期是否几天前创建,是则删除
if (feInfo3.CreationTime < DateTime.Today.AddDays(-1 * 30 * DeleteLogIntervel))
feInfo3.Delete();
}
}
await Task.Delay(1000 * 60 * 60);
}
});
}
/// <summary>
/// 创建与MES通讯的服务端
/// </summary>
private void CreateTcp()
{
if (m_service == null)
{
onLineClient = new List<TcpSessionClient>();
m_service = new TcpService();
//m_service.Connected = this.M_service_Connected;//有客户端连接
//m_service.Closed = this.M_service_Disconnected;//有客户端断开连接
//这里应该引入多线程并加锁处理
//m_service.Received += (client,e) =>
//{
// //从客户端收到信息
// var mes = e.ByteBlock.Span;
// //FrmDisplayView.LogInfo.Info("》》》接收[" + client.IP + ":" + client.Port + "]客户端原始消息: " + MsgUtil.bytesToHexStr(myRequestInfo.Header, (int)myRequestInfo.Header.Length) + MsgUtil.bytesToHexStr(myRequestInfo.Body, (int)myRequestInfo.Body.Length) + "\r\n");
// //此处可以处理MyFixedHeaderRequestInfo的相关信息了。
// ParsingMessages(client, e.ByteBlock);
//};
}
m_service.Setup(new TouchSocketConfig()//载入配置
.SetListenIPHosts(new IPHost[] { new IPHost("0.0.0.0:" + SoftInfo.CollectInfo.Port) })//同时监听两个地址
//.SetTcpDataHandlingAdapter(() => { return new MyFixedHeaderCustomDataHandlingAdapter(); })//配置适配器
.SetMaxCount(10000)
.SetThreadCount(1000)
.ConfigureContainer(a =>//容器的配置顺序应该在最前面
{
})
.ConfigurePlugins(a =>
{
a.UseCheckClear().SetTick
(timeSpan: TimeSpan.FromMinutes(1))
.SetCheckClearType(clearType: CheckClearType.OnlyReceive);
}));
}
/// <summary>
/// 监听MES客户端主动下线事件
/// </summary>
/// <param name="socket"></param>
/// <param name="e"></param>
private void M_service_Disconnected(TouchSocket.Sockets.TcpSessionClient socket, ClosedEventArgs e)
{
try
{
if (e.Manual)
{
FrmDisplayView.LogInfo.ErrorFormat(string.Format("MES无数据交互被动断开 软件地址: {0}IP{1}:{2}。 ", socket.Id, socket.IP, socket
.Port));
}
else
{
FrmDisplayView.LogInfo.ErrorFormat(string.Format("MES主动断开 软件地址: {0}IP{1}:{2}。 ", socket.Id, socket.IP, socket
.Port));
}
this.onLineClient.Remove(socket);
socket.SafeDispose();
var mesid = SoftInfo.mesSoftList.FindIndex((x) => { return x.mesid == socket.Id.ToString(); });
if (mesid != -1)
{
//Sql.InsertSoftState(flag.ToString(), 0);
SoftInfo.mesSoftList[mesid].State = 0;
App.TriggerHalt(EventSystem.UpdateMesListInfo, SoftInfo.mesSoftList);
}
//bool iflag = IsHaveMesSocketClientbyIPAndPort(socket.ID.ToString(), socket.IP, socket.Port.ToString());
//if (iflag)
//{
// this.onLineClient.Remove(socket);
// socket.SafeDispose();
// var mesid = SoftInfo.mesSoftList.FindIndex((x) => { return x.mesid == socket.ID.ToString(); });
// if (mesid != -1)
// {
// //Sql.InsertSoftState(flag.ToString(), 0);
// SoftInfo.mesSoftList[mesid].State = 0;
// App.TriggerHalt(EventSystem.UpdateMesListInfo, SoftInfo.mesSoftList);
// FrmDisplayView.LogInfo.ErrorFormat(string.Format("MES断开 软件地址: {0}IP{1}:{2}。 ", socket.ID, socket.IP, socket
// .Port));
// }
//}
}
catch (Exception ex)
{
}
}
/// <summary>
/// 监听MES客户端主动连接事件
/// </summary>
/// <param name="client"></param>
/// <param name="e"></param>
private void M_service_Connected(TcpSessionClient client, ConnectedEventArgs e)
{
this.onLineClient.Add(client);
}
/// <summary>
/// 接收MES客户端消息处理函数
/// </summary>
/// <param name="client">客户端连接信息</param>
/// <param name="myRequestInfo">接收消息内容</param>
private async void ParsingMessages(TcpSessionClient client, byte[] myRequestInfo)
{
byte[] buffer = new byte[myRequestInfo.Length];
Array.Copy(myRequestInfo, 0, buffer, 0, myRequestInfo.Length);
//Array.Copy(myRequestInfo.Body, 0, buffer, myRequestInfo.Header.Length, myRequestInfo.Body.Length);
byte[] hbt = new byte[7];
Array.Copy(buffer, 0, hbt, 0, 7);
Head head = new Head();
head = (Head)MsgUtil.BytesToStruct(hbt, hbt.Length, head.GetType());
switch ((RecAppMsgType)head.control)// 找到对应的适配器软件,发送指令给适配器
{
case RecAppMsgType._ReadEpc:
//LogService.Instance.Info("接收到MES识别EPC数据消息");
ReadEPC readEPC = new ReadEPC();
readEPC.tail.verifica = new byte[2];
readEPC = (ReadEPC)MsgUtil.BytesToStruct(buffer, buffer.Length, readEPC.GetType());
await m_EquipClient.ReadEPC(readEPC.num);
//LogService.Instance.Debug(string.Format("消息解析成功 识别EPC消息", readEPC.num));
break;
case RecAppMsgType._ReadData:
// ReadData readData = new ReadData();
//LogService.Instance.Info("接收到MES主动读取数据消息");
int num = BitConverter.ToInt32(buffer, 7);
//if (!FindSenor(num.ToString()))
//{
// FrmDisplayView.LogInfo.Info(num.ToString() + "传感器编号异常,不存在此传感器");
// return;
//}
ushort filterWordPtr = BitConverter.ToUInt16(buffer, 12);//过滤偏移地址
ushort len = BitConverter.ToUInt16(buffer, 14);//过滤长度个字节
byte[] filterData = new byte[len];//过滤数据
// readData.tail.verifica = new byte[2];
// readData = (ReadData)MsgUtil.BytesToStruct(buffer, buffer.Length, readData.GetType());
Array.Copy(buffer, 18, filterData, 0, len);
ushort wordPtr = BitConverter.ToUInt16(buffer, 17 + len);
ushort WordCnt = BitConverter.ToUInt16(buffer, 19 + len);
//m_EquipClient.ReadData(num, buffer[11], filterWordPtr,
// len, filterData, buffer[16 + len], wordPtr, WordCnt);
//add by CaesarBao 判断传感器是否立即返回,用于区分单次读还是连续盘点
if (FindSenorType(num.ToString()))
{
await m_EquipClient.ReadEPC(num);
}
else
{
await m_EquipClient.Device_MESBeginIdentify(num.ToString()); //主动盘点
}
//Thread m_bgwWaitingForData = new Thread(() => m_EquipClient.Device_MESBeginIdentify(num));
//m_bgwWaitingForData.IsBackground = true;
//m_bgwWaitingForData.Start();
//m_EquipClient.Device_MESBeginIdentify(num);//设置读写器连续读
//LogService.Instance.Debug(string.Format("消息解析成功 读取数据消息,编号:{0}", num));
break;
case RecAppMsgType._WirteData:
int wirtenum = BitConverter.ToInt32(buffer, 7);
//遍历传感器列表,比对传感器编号
if (!FindSenor(wirtenum.ToString()))
{
FrmDisplayView.LogInfo.Info(wirtenum.ToString() + "传感器编号异常,不存在此传感器");
return;
}
ushort wirtefilterWordPtr = BitConverter.ToUInt16(buffer, 12);//过滤偏移地址
ushort wirtelen = BitConverter.ToUInt16(buffer, 14);//过滤长度个字节
byte[] wirtefilterData = new byte[wirtelen];//过滤数据
// readData.tail.verifica = new byte[2];
// readData = (ReadData)MsgUtil.BytesToStruct(buffer, buffer.Length, readData.GetType());
Array.Copy(buffer, 18, wirtefilterData, 0, wirtelen);
ushort wirtewordPtr = BitConverter.ToUInt16(buffer, 17 + wirtelen);
ushort wirteWordCnt = BitConverter.ToUInt16(buffer, 19 + wirtelen);
byte[] wirtedata = new byte[wirteWordCnt];
Array.Copy(buffer, 21 + wirtelen, wirtedata, 0, wirteWordCnt);
var Sensorinfo = SoftInfo.SensorList.Find((x) => { return x.sensorid == wirtenum.ToString(); });
if (!string.IsNullOrEmpty(Sensorinfo.sensorser))
{
byte antenan = (byte)MsgUtil.ParseToInt(Sensorinfo.sensorser);
//FrmDisplayView.LogInfo.Info("向" + wirtenum + "发送报文:" + MsgUtil.bytesToHexStr(buffer, bufferlen));
m_EquipClient.WriteData(wirtenum, buffer[11], wirtefilterWordPtr,
wirtelen, wirtefilterData, buffer[16 + wirtelen], wirtewordPtr, wirteWordCnt, wirtedata, antenan);
//Thread.Sleep(50);
}
else
{
FrmDisplayView.LogInfo.Info("传感器天线号异常");
return;
}
//LogService.Instance.Debug(string.Format("写数据消息解析成功"));
break;
case RecAppMsgType._AutoSendData:
//////////
break;
#region
case RecAppMsgType._HeartBeat://心跳不需要处理
SignIn(client, buffer, buffer.Length);
byte[] addrby = new byte[2];
Array.Copy(buffer, 1, addrby, 0, 2);
var flag = BitConverter.ToUInt16(addrby, 0);
byte[] Heartbuf = new byte[10];
Heart heart = new Heart();
heart.head.start = 0x56;
heart.head.addr = 101;
heart.head.control = 101;
heart.head.length = 0;
heart.head.mstaseq = 241;
byte[] headbuf = MsgUtil.StructToBytes(heart.head);
Array.Copy(headbuf, 0, Heartbuf, 0, headbuf.Length);
byte[] Verify = MsgUtil.CalculateVerify(headbuf, headbuf.Length);
Array.Copy(Verify, 0, Heartbuf, 7, Verify.Length);
Heartbuf[9] = 0x86;
try
{
var send = SendMessageToClient(flag, Heartbuf);
//var token = FrmDisplayModel.SocketServer.SendMessageByFlag(flag, Heartbuf);
FrmDisplayView.LogInfo.ErrorFormat("收到MES软件编号" + flag + ",心跳报文,发送回执:{0}", MsgUtil.bytesToHexStr(Heartbuf, Heartbuf.Length));
}
catch (Exception ex)
{
}
break;
case RecAppMsgType._ReadEquipState://不实现
break;
case RecAppMsgType._SendGetSoftState://不实现
break;
#endregion
default:
break;
}
await Task.Delay(1);
}
/// <summary>
/// 向客户端发送消息
/// </summary>
/// <param name="flag">客户端编号</param>
/// <param name="buffer">发送数据</param>
/// <returns></returns>
public bool SendMessageToClient(int flag, byte[] buffer)
{
try
{
if (onLineClient != null)
{
//var index = onLineClient.ToList().FindIndex((x) =>
//{
// return x.Id.ToString().Equals(flag.ToString());
//});
//onLineClient[index].SendAsync(buffer);
//修改向所有符合条件的连接发送
foreach (var item in onLineClient.Where(x => x.Id.ToString() == flag.ToString()))
{
item.SendAsync(buffer);
}
//richTextBox1.AppendText("向编号[" + flag + "]发送消息" + "\r\n");
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.FatalFormat("向编号[" + flag + "]发送:" + MsgUtil.bytesToHexStr(buffer, buffer.Length) + "消息失败,未找到客户端连接!" + ex);
return false;
}
}
/// <summary>
/// 接收MES注册消息
/// </summary>
/// <param name="client">客户端连接信息</param>
/// <param name="byteBlock">接收消息内容</param>
/// <param name="iLength">消息长度</param>
public void SignIn(TcpSessionClient client, byte[] byteBlock, int iLength)
{
try
{
byte[] addrby = new byte[2];
Array.Copy(byteBlock, 1, addrby, 0, 2);
var flag = BitConverter.ToUInt16(addrby, 0);
var mesid = SoftInfo.mesSoftList.FindIndex((x) => { return x.mesid == flag.ToString(); });
FrmDisplayView.LogInfo.ErrorFormat("收到MES软件地址:" + flag + ",IP:" + client.IP + ",端口号:" + client.Port + ",注册解析消息: " + MsgUtil.bytesToHexStr(byteBlock, iLength));
if (mesid == -1)
{
FrmDisplayView.LogInfo.ErrorFormat("非法连接 ID:{0},IP:{1}", flag.ToString(), client.IP);
return;
}
else
{
//判断是否已连接
if (SoftInfo.mesSoftList[mesid].State != 0)
{
//判断编号、IP、端口号与已连接的是否一致
//这里应该判断IP地址及软件编号
if (!IsHaveMesSocketClientbyIPAndPort(flag.ToString(), client.IP, client.Port.ToString()))
{
//不一致说明客户端更换端口及编号
//判断是否已经存在该端口号的连接
if (IsHaveMesSocketClientbyPort(client.Port.ToString()))
{
//更新
}
//移除符合编号的客户端连接
RemoveMesSocketClientbyFlag(flag.ToString());
}
//else
//{
// RemoveMesSocketClientbyFlag(flag.ToString());
//}
}
SoftInfo.mesSoftList[mesid].mesid = flag.ToString();
SoftInfo.mesSoftList[mesid].AdatperIP = client.IP;
SoftInfo.mesSoftList[mesid].AdapterPort = client.Port.ToString();
SoftInfo.mesSoftList[mesid].State = 1;
client.ResetIdAsync(flag.ToString());
App.TriggerHalt(EventSystem.UpdateMesListInfo, SoftInfo.mesSoftList);
}
//Sql.InsertSoftState(flag.ToString(), 1);
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.FatalFormat("空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
}
}
/// <summary>
/// 根据客户端端口号判断是否存在相同客户端连接
/// </summary>
/// <param name="port">客户端端口号</param>
/// <returns></returns>
public bool IsHaveMesSocketClientbyPort(string port)
{
try
{
bool iflag = false;
for (int i = 0; i < onLineClient.ToList().Count; i++)
{
if (onLineClient.ToList()[i].Id != null)
{
if (onLineClient.ToList()[i].Port.ToString().Equals(port))
{
iflag = true;
var mesid = SoftInfo.mesSoftList.FindIndex((x) => { return x.mesid == onLineClient.ToList()[i].Id.ToString(); });
if (mesid != -1)
{
SoftInfo.mesSoftList[mesid].State = 0;
App.TriggerHalt(EventSystem.UpdateMesListInfo, SoftInfo.mesSoftList);
//FrmDisplayView.LogInfo.ErrorFormat(string.Format("MES断开 软件地址: {0}IP{1}:{2}。 ", socket.Flag, socket.IP, socket
// .Port));
}
break;
}
}
}
return iflag;
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.FatalFormat("空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
return false;
}
}
/// <summary>
/// 根据客户端编号IP端口号判断是否存在相同客户端连接
/// </summary>
/// <param name="flag">客户端编号</param>
/// <param name="IP">客户端IP</param>
/// <param name="port">客户端端口号</param>
/// <returns></returns>
public bool IsHaveMesSocketClientbyIPAndPort(string flag, string IP, string port)
{
try
{
bool iflag = false;
if (onLineClient != null && onLineClient.Count > 0)
{
for (int i = 0; i < onLineClient.ToList().Count; i++)
{
if (onLineClient.ToList()[i].Id != null)
{
if (onLineClient.ToList()[i].Id.ToString().Equals(flag) && onLineClient.ToList()[i].IP.ToString().Equals(IP) && onLineClient.ToList()[i].Port.ToString().Equals(port))
{
iflag = true;
break;
}
}
}
}
return iflag;
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.FatalFormat("空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
return false;
}
}
/// <summary>
/// 移除客户端连接信息
/// </summary>
/// <param name="Flag">客户端编号</param>
public void RemoveMesSocketClientbyFlag(string Flag)
{
try
{
string IP = "";
string Port = "";
for (int i = 0; i < onLineClient.ToList().Count; i++)
{
if (onLineClient.ToList()[i].Id != null)
{
if (onLineClient.ToList()[i].Id.ToString().Equals(Flag))
{
IP = onLineClient.ToList()[i].IP;
Port = onLineClient.ToList()[i].Port.ToString();
onLineClient[i].Close();
//this.onLineClient.Remove((SocketClient)onLineClient[i]);
FrmDisplayView.LogInfo.ErrorFormat("移除上次MES软件地址{0}, IP:{1}:{2}, 成功!", Flag, IP, Port);
//if (this.onLineClient.Remove((SocketClient)onLineClient[i]))
//{
// onLineClient[i].Close();
// FrmDisplayView.LogInfo.ErrorFormat("移除上次MES软件地址{0}, IP:{1}:{2}, 成功!", Flag, IP, Port);
//}
break;
}
}
}
//var indexof = onLineClient.ToList().FindIndex((x) => { return x.Flag.ToString().Equals(Flag.ToString()); });
//string IP = onLineClient[indexof].IP;
//string Port = onLineClient[indexof].Port.ToString();
//if (this.onLineClient.Remove((SocketClient)onLineClient[indexof]))
//{
// FrmDisplayView.LogInfo.ErrorFormat("移除上次MES软件地址{0}, IP:{1}:{2}, 成功!", Flag, IP, Port);
//}
}
catch (Exception ex)
{
FrmDisplayView.LogInfo.FatalFormat("空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:" + ex.Message);
}
}
}
}