using Hanhe.iWCS.Factroy; using Hanhe.iWCS.Interface; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Hanhe.iWCS.IndonesiaGLMTCP { public class SessionInstance { private static readonly SessionInstance instance = new SessionInstance(); public List WCSSessionList = new List(); /// /// 设备授权数量 /// private const int DeviceAuthNumber = 100; /// /// 设备协议接口实例化 /// public IProtocolAnalysis _IProtocolAnalysis; /// /// 获取单实例 /// public static SessionInstance Instance { get { return instance; } } /// /// 构造函数 /// public SessionInstance() { } /// /// 初始化 /// public void Initialize() { _IProtocolAnalysis = DataAccess.CreateProtocolAnalysis(); } /// /// 增加会话到内存队列 /// /// public void AddSession(WCSSession session) { if (!WCSSessionList.Exists(p => p.SessionID == session.SessionID)) { WCSSessionList.RemoveAll(a => a.RemoteEndPoint.Address == session.RemoteEndPoint.Address); var _wcsSession = WCSSessionList.Where(p => p.RemoteEndPoint.Address == session.RemoteEndPoint.Address); foreach (var sessionIns in _wcsSession) { WCSSessionList.Remove(sessionIns); } if (WCSSessionList.Count <= DeviceAuthNumber) { WCSSessionList.Add(session); } } } private void PrintSession() { WCSSessionList.ForEach(a => Console.WriteLine($"{a.RemoteEndPoint.Address}:{a.RemoteEndPoint.Port}")); } /// /// 给指定客户端发送消息(只匹配IP地址) /// /// /// /// /// public bool PLCSend(string ip, int port, string msg) { bool iRtn = false; //PrintSession(); //对当前已连接的所有会话进行广播 WCSSession wcsSession = WCSSessionList.Find(p => p.RemoteEndPoint.Address.ToString() == ip && p.RemoteEndPoint.Port == port); if (wcsSession != null) { var data = Encoding.UTF8.GetBytes(msg); wcsSession.Send(data, 0, data.Length); //Console.WriteLine($"{ip}:{port} 发送消息{msg}"); iRtn = true; } else { Console.WriteLine($"{ip}:{port}连接不存在"); } return iRtn; } public bool PLCSend(string ip, int port, byte[] data) { bool iRtn = false; //PrintSession(); //对当前已连接的所有会话进行广播 WCSSession wcsSession = WCSSessionList.Find(p => p.RemoteEndPoint.Address.ToString() == ip && p.RemoteEndPoint.Port == port); if (wcsSession != null) { wcsSession.Send(data, 0, data.Length); //Console.WriteLine($"{ip}:{port} 发送消息{msg}"); iRtn = true; } else { Console.WriteLine($"{ip}:{port}连接不存在"); } return iRtn; } /// /// 给指定客户端发送消息(匹配IP地址) /// /// IP地址 /// /// public bool PLCSend(string ip, string msg) { bool iRtn = false; //对当前已连接的所有会话进行广播 WCSSession wcsSession = WCSSessionList.Find(p => p.RemoteEndPoint.Address.ToString() == ip); if (wcsSession != null) { //var data = Encoding.Default.GetBytes(msg); var data = Encoding.UTF8.GetBytes(msg); wcsSession.Send(data, 0, data.Length); iRtn = true; } return iRtn; } /// /// 通过会话句柄ID找到客户端对象发送数据 /// /// 会话句柄ID /// 发送数据 /// public bool PLCSendForSessionID(string sessionID, string msg) { bool iRtn = false; WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID); if (wcsSession != null) { Hanhe.iWCS.Common.CMMLog.Info("PLC IP=" + wcsSession.RemoteEndPoint.Address.ToString()); var data = Encoding.UTF8.GetBytes(msg); wcsSession.Send(data, 0, data.Length); iRtn = true; } return iRtn; } /// /// 删除一个会话 /// /// 会话ID public void SessionRemove(string sessionID) { if (WCSSessionList.Count > 0) { WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID); if (wcsSession != null) WCSSessionList.Remove(wcsSession); } } /// /// 移除重复的会话(同一个设备编号在Session重复) /// /// 会话SessionID /// 设备编号 public void RemoveRepeatDeviceCodeForSession(string sessionID, string deviceCode) { IEnumerable wcsSessionList = WCSSessionList.Where(p => p.SessionID != sessionID && p.deviceCode == deviceCode); foreach (var wcsSession in wcsSessionList) { WCSSessionList.Remove(wcsSession); } } /// /// 移除会话 /// /// 会话ip public void RemoveSessionExcludeFromIP(string ip) { IEnumerable wcsSessionList = WCSSessionList.Where(p => p.RemoteEndPoint.Address.ToString() != ip); foreach (var wcsSession in wcsSessionList) { WCSSessionList.Remove(wcsSession); } } /// /// 根据心跳会话,更新会话与设备编号的对应关系 /// /// 会话ID /// 设备编号 public void UpdateDeviceCodeForSessionID(string sessionID, string deviceCode) { WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID); if (wcsSession != null) { wcsSession.deviceCode = deviceCode; } } } }