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.JingmenGEMTwoTCP
|
{
|
public class SessionInstance
|
{
|
private static readonly SessionInstance instance = new SessionInstance();
|
|
public List<WCSSession> WCSSessionList = new List<WCSSession>();
|
|
/// <summary>
|
/// 设备授权数量
|
/// </summary>
|
private const int DeviceAuthNumber = 100;
|
|
/// <summary>
|
/// 设备协议接口实例化
|
/// </summary>
|
public IProtocolAnalysis _IProtocolAnalysis;
|
|
|
/// <summary>
|
/// 获取单实例
|
/// </summary>
|
public static SessionInstance Instance {
|
get {
|
return instance;
|
}
|
}
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
public SessionInstance() {
|
|
}
|
|
/// <summary>
|
/// 初始化
|
/// </summary>
|
public void Initialize() {
|
_IProtocolAnalysis = DataAccess.CreateProtocolAnalysis();
|
}
|
|
/// <summary>
|
/// 增加会话到内存队列
|
/// </summary>
|
/// <param name="session"></param>
|
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}"));
|
}
|
/// <summary>
|
/// 给指定客户端发送消息(只匹配IP地址)
|
/// </summary>
|
/// <param name="ip"></param>
|
/// <param name="port"></param>
|
/// <param name="msg"></param>
|
/// <returns></returns>
|
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;
|
}
|
/// <summary>
|
/// 给指定客户端发送消息(匹配IP地址)
|
/// </summary>
|
/// <param name="ip">IP地址</param>
|
/// <param name="msg"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 通过会话句柄ID找到客户端对象发送数据
|
/// </summary>
|
/// <param name="sessionID">会话句柄ID</param>
|
/// <param name="msg">发送数据</param>
|
/// <returns></returns>
|
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;
|
}
|
|
|
/// <summary>
|
/// 删除一个会话
|
/// </summary>
|
/// <param name="sessionID">会话ID</param>
|
public void SessionRemove(string sessionID) {
|
if (WCSSessionList.Count > 0) {
|
WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID);
|
if (wcsSession != null) WCSSessionList.Remove(wcsSession);
|
}
|
}
|
|
/// <summary>
|
/// 移除重复的会话(同一个设备编号在Session重复)
|
/// </summary>
|
/// <param name="sessionID">会话SessionID</param>
|
/// <param name="deviceCode">设备编号</param>
|
public void RemoveRepeatDeviceCodeForSession(string sessionID, string deviceCode) {
|
IEnumerable<WCSSession> wcsSessionList = WCSSessionList.Where(p => p.SessionID != sessionID && p.deviceCode == deviceCode);
|
foreach (var wcsSession in wcsSessionList) {
|
WCSSessionList.Remove(wcsSession);
|
}
|
}
|
|
/// <summary>
|
/// 移除会话
|
/// </summary>
|
/// <param name="ip">会话ip</param>
|
public void RemoveSessionExcludeFromIP(string ip) {
|
IEnumerable<WCSSession> wcsSessionList = WCSSessionList.Where(p => p.RemoteEndPoint.Address.ToString() != ip);
|
foreach (var wcsSession in wcsSessionList) {
|
WCSSessionList.Remove(wcsSession);
|
}
|
}
|
|
/// <summary>
|
/// 根据心跳会话,更新会话与设备编号的对应关系
|
/// </summary>
|
/// <param name="sessionID">会话ID</param>
|
/// <param name="deviceCode">设备编号</param>
|
public void UpdateDeviceCodeForSessionID(string sessionID, string deviceCode) {
|
WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID);
|
if (wcsSession != null) {
|
wcsSession.deviceCode = deviceCode;
|
}
|
}
|
}
|
}
|