using DataEntity.Device;
using DataEntity.Share;
using HxEnum;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Sockets;
using System.Reflection;
using System.Threading;
using XCommon.Log;
using XImagingXhandler.XDAL;
using static HxEnum.StateEnum;
namespace HxSocketImplement.Sockets
{
///
/// 获取统一值---参数
///
public static class HxSocketParameterService
{
#region 添加默认参数
///
/// 添加默认参数
///
/// IP
/// 端口
/// 设备ID
/// 设备类型
/// 虚拟连接状态
/// 延迟时间(毫秒)
///
public static Result AddSocketDefaultParameter(string equipmentType, string ip, int port, string equipmentId, bool virtualConnectionState = false, int delaySecondTime = 3000)
{
Result resultModel = new Result();
try
{
var result = AddSocketDefaultParameters(equipmentType, ip, port, equipmentId, virtualConnectionState, delaySecondTime);
#region 虚拟连接
var virtualConnectionStateResult = GetVirtualConnectionState(virtualConnectionState, delaySecondTime);
if (virtualConnectionStateResult != null && virtualConnectionStateResult.status == StateEnum_Equipment.Completed)
{
return virtualConnectionStateResult;
}
#endregion
if (result)
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Completed, msg = "添加默认参数【成功】" });
}
else
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = "添加默认参数【失败】" });
}
}
catch (Exception ex)
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = ex.Message });
}
return resultModel;
}
///
/// 添加统一值方法
///
/// 设备类别
/// IP
/// 端口
/// 设备ID
/// 虚拟连接状态
/// 延迟时间(毫秒)
///
private static bool AddSocketDefaultParameters(string equipmentType, string ip, int port, string equipmentId, bool virtualConnectionState, int delaySecondTime)
{
SocketParameterModel socketParameterModel = new SocketParameterModel();
if (string.IsNullOrWhiteSpace(equipmentType) || string.IsNullOrWhiteSpace(ip) || port <= 0)
{
return false;
}
#region 防止数据重了
if (HxSockServiceExecute.CacheSocketParameterData != null && HxSockServiceExecute.CacheSocketParameterData.Count > 0)
{
var cacheSocketParameterData = HxSockServiceExecute.CacheSocketParameterData.Where(x => x.Key == equipmentType + ip + port + equipmentId);
if (cacheSocketParameterData != null && cacheSocketParameterData.Count() > 0)
{
return true;
}
}
#endregion
socketParameterModel = GetSocketParameterModelMethod(equipmentType, ip, port, virtualConnectionState, delaySecondTime, equipmentId);
return true;
}
///
/// 获取统一参数值方法
///
/// 设备类别
/// IP
/// 端口
/// 虚拟连接状态
/// 延迟时间(毫秒)
/// 设备ID
///
public static SocketParameterModel GetSocketParameterModelMethod(string equipmentType, string ip, int port, bool virtualConnectionState, int delaySecondTime, string equipmentId)
{
SocketParameterModel socketParameterModel = new SocketParameterModel();
socketParameterModel.Socket = null;
socketParameterModel.Ip = ip;
socketParameterModel.Port = port;
socketParameterModel.HeartmessageId = HxSockServiceExecute.InstrunctionId();// "05";
socketParameterModel.HeartMessageType = 0;
socketParameterModel.HeartEquipmentId = equipmentId;// "id0060";
socketParameterModel.SpecifiedDisplay = CommonParameter.SpecifiedDisplay;
socketParameterModel.LockReceive = new object();
socketParameterModel.Buffer = new byte[1024 * 1024 * 10];
socketParameterModel.EquipmentType = equipmentType;
socketParameterModel.VirtualConnectionState = virtualConnectionState;
socketParameterModel.DelaySecondTime = delaySecondTime;
socketParameterModel.EquipmentId = equipmentId;
HxSockServiceExecute.CacheSocketParameterData.Add(equipmentType + ip + port + equipmentId, socketParameterModel);
return socketParameterModel;
}
#endregion
#region 获取socket参数
///
/// 获取socket参数
///
/// 类型
/// IP
/// 端口
/// 设备ID
///
public static SocketParameterModel GetSocketParameter(string equipmentType, string ip, int port, string equipmentId)
{
SocketParameterModel socketParameterModel = new SocketParameterModel();
if (HxSockServiceExecute.CacheSocketParameterData != null && HxSockServiceExecute.CacheSocketParameterData.Count > 0)
{
var cacheSocketParameterData = HxSockServiceExecute.CacheSocketParameterData.Where(x => x.Key == equipmentType + ip + port + equipmentId);
if (cacheSocketParameterData != null && cacheSocketParameterData.Count() > 0)
{
socketParameterModel = cacheSocketParameterData.FirstOrDefault().Value;
}
}
return socketParameterModel;
}
#endregion
#region 获取结果信息
///
/// 获取结果信息
///
/// 方法名称
/// 参数
///
public static Result GetResultInfo(string method, Result model)
{
Result modelResult = new Result();
modelResult.status = model.status;
modelResult.msg = model.msg;
modelResult.data = model.data;
//LoggerSocketHelper.DebugLog(Environment.NewLine + "方法名称:" + method + Environment.NewLine + "参数信息:" + JsonConvert.SerializeObject(modelResult));
LoggerSocketHelper.DebugLog(string.Format("方法名称:[{0}], 参数信息:{1}", method, JsonConvert.SerializeObject(modelResult)));
return modelResult;
}
#endregion
#region 获取方法信息
///
/// 获取方法信息
///
///
public static string GetMethodInfo()
{
StackTrace ss = new StackTrace(true);
// index:0为本身的方法;1为调用方法;2为其上上层,依次类推
System.Reflection.MethodBase mb = ss.GetFrame(1).GetMethod();
////StackFrame[] sfs = ss.GetFrames();
//string systemModule = "模块名:" + mb.Module.ToString() + Environment.NewLine;
//systemModule += "命名空间名:" + mb.DeclaringType.Namespace + Environment.NewLine;
////仅有类名
//systemModule += "类名:" + mb.DeclaringType.Name + Environment.NewLine;
//systemModule += "方法名:" + mb.Name;
string systemModule = mb.Name + " 类名:" + mb.DeclaringType.Name;
return systemModule;
}
#endregion
#region 获取虚拟连接状态
///
/// 获取虚拟连接状态
///
/// 虚拟连接状态
/// 延迟时间(毫秒)
/// 是否断开连接(tue断,false连)
///
public static Result GetVirtualConnectionState(bool virtualConnectionState, int delaySecondTime, bool isBreakConnect = false)
{
if (virtualConnectionState)
{
//System.Threading.Thread.Sleep(delaySecondTime);
Result resultModel = new Result();
if (isBreakConnect)
{
return resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Completed, msg = "虚拟连接断开状态【成功】" });
}
return resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Completed, msg = "虚拟连接状态【成功】" });
}
return null;
}
#endregion
#region 连接
///
/// 连接
///
/// 类型
/// IP
/// 端口
/// 设备ID
///
public static Result Connect(string equipmentType, string ip, int port, string equipmentId)
{
Result resultModel = new Result();
var socketParameterModel = GetSocketParameter(equipmentType, ip, port, equipmentId);
try
{
#region 虚拟连接
var virtualConnectionStateResult = GetVirtualConnectionState(socketParameterModel.VirtualConnectionState, socketParameterModel.DelaySecondTime);
if (virtualConnectionStateResult != null && virtualConnectionStateResult.status == StateEnum_Equipment.Completed)
{
return virtualConnectionStateResult;
}
#endregion
if (HxSockServiceExecute.CheckConnected(socketParameterModel.Socket, socketParameterModel.Ip) == false)
{
if (socketParameterModel != null && HxSockServiceExecute.Connect(equipmentType, ip, port, equipmentId))
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Completed, msg = "连接服务器【成功】" });
}
else
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = "连接服务器【失败】" });
}
}
else
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Completed, msg = "连接服务器【成功】" });
}
}
catch (Exception ex)
{
socketParameterModel.Socket.Shutdown(SocketShutdown.Both);
socketParameterModel.Socket.Close();
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = ex.Message });
}
return resultModel;
}
///
/// 检查连接
///
/// 类型
/// IP
/// 端口
/// 设备ID
///
public static Result CheckConnected(string equipmentType, string ip, int port, string equipmentId)
{
Result resultModel = new Result();
try
{
var socketParameterModel = HxSockServiceExecute.GetSocketParameterModel(equipmentType, ip, port, equipmentId);
if (socketParameterModel != null)
{
#region 虚拟连接
var virtualConnectionStateResult = GetVirtualConnectionState(socketParameterModel.VirtualConnectionState, socketParameterModel.DelaySecondTime);
if (virtualConnectionStateResult != null && virtualConnectionStateResult.status == StateEnum_Equipment.Completed)
{
return virtualConnectionStateResult;
}
#endregion
if (HxSockServiceExecute.CheckConnected(socketParameterModel.Socket, socketParameterModel.Ip))
{
resultModel.status = StateEnum_Equipment.Completed;
resultModel.msg = "检查连接【成功】";
//resultModel = GetResultInfo(GetMethodInfo(), new Result { status = EnumManagement.GetEnumValue(StateEnum.StateEnum_Equipment.Completed), msg = "检查连接【成功】" });
}
else
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = "检查连接【失败】" });
}
}
else
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = "检查连接【失败】默认参数为空" });
}
}
catch (Exception ex)
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = ex.Message });
}
return resultModel;
}
#endregion
#region 断开
///
/// 断开
///
/// 类型
/// IP
/// 端口
/// 设备ID
///
public static Result BreakConnect(string equipmentType, string ip, int port, string equipmentId)
{
Result resultModel = new Result();
try
{
var socketParameterModel = HxSockServiceExecute.GetSocketParameterModel(equipmentType, ip, port, equipmentId);
if (socketParameterModel == null)
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = "服务器断开【未连接】" });
return resultModel;
}
#region 虚拟连接
var virtualConnectionStateResult = GetVirtualConnectionState(socketParameterModel.VirtualConnectionState, socketParameterModel.DelaySecondTime, true);
if (virtualConnectionStateResult != null && virtualConnectionStateResult.status == StateEnum_Equipment.Completed)
{
socketParameterModel.VirtualConnectionState = false;
HxSockServiceExecute.CacheSocketParameterData.Remove(equipmentType + ip + port + equipmentId);
return virtualConnectionStateResult;
}
#endregion
if (HxSockServiceExecute.BreakConnect(equipmentType, ip, port, equipmentId))
{
HxSockServiceExecute.CacheSocketParameterData.Remove(equipmentType + ip + port + equipmentId);
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Completed, msg = "服务器已断开【成功】" });
}
else
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = "服务器已断开【未连接】" });
}
}
catch (Exception ex)
{
resultModel = GetResultInfo(GetMethodInfo(), new Result { status = StateEnum_Equipment.Failed, msg = ex.Message });
}
return resultModel;
}
#endregion
#region 获取指令公共模型对象---发送
///
/// 获取指令公共模型对象---发送
///
/// 参数对像
///
public static InstructCommonMethodSendModel GetInstructCommonMethodSendModel(InstructCommonMethodSendModel instructCommonMethodSendModel)
{
instructCommonMethodSendModel.EquipmentType = instructCommonMethodSendModel.EquipmentType;
instructCommonMethodSendModel.Ip = instructCommonMethodSendModel.Ip;
instructCommonMethodSendModel.Port = instructCommonMethodSendModel.Port;
instructCommonMethodSendModel.EquipmentId = instructCommonMethodSendModel.EquipmentId;
// wdy
//if ((instructCommonMethodSendModel.CommunicateType == EnumManagement.GetEnumValue(CommunicateTypeEnum.SerialPort) ||
// instructCommonMethodSendModel.CommunicateType == EnumManagement.GetEnumValue(CommunicateTypeEnum.SocketUDP) ||
// instructCommonMethodSendModel.CommunicateType == EnumManagement.GetEnumValue(CommunicateTypeEnum.SocketNonstandard)) &&
// instructCommonMethodSendModel.MethodParametersModel.Type == EnumManagement.GetEnumValue(ParameterTypeEnum.Send).ToString() &&
// instructCommonMethodSendModel.SendData.parameters != null)
//{
// Dictionary dicParams = (Dictionary)instructCommonMethodSendModel.SendData.parameters;
// object value = dicParams.Values.First();
// instructCommonMethodSendModel.SendData.parameters = value == null ? string.Empty : value.ToString();
//}
if (instructCommonMethodSendModel.SendData.parameters != null)
{
instructCommonMethodSendModel.SendData.parameters = instructCommonMethodSendModel.SendData.parameters;// new RobotParameterModel { DestinationName = "1", Pose = "2", TargetName = "3", _Rotation = Enum_Rotation.Forward90 };
}
else
{
instructCommonMethodSendModel.SendData.parameters = new object();
}
instructCommonMethodSendModel.SendData.message_id = HxSockServiceExecute.InstrunctionId();
instructCommonMethodSendModel.SendData.message_type = 2;
instructCommonMethodSendModel.SendData.method = instructCommonMethodSendModel.SendData.method;// InstructionEnum_Equipment.Home.ToString();
instructCommonMethodSendModel.SendData.equipment_id = instructCommonMethodSendModel.EquipmentId;
instructCommonMethodSendModel.SendData.workflow_id = "workflow_id_" + instructCommonMethodSendModel.SendData.message_id;
instructCommonMethodSendModel.SendData.experiment_id = instructCommonMethodSendModel.SendData.experiment_id;
instructCommonMethodSendModel.SendData.estimate_time = 3;
instructCommonMethodSendModel.SendData.timeout = 3;
instructCommonMethodSendModel.SendData.description = "description_" + instructCommonMethodSendModel.EquipmentType;
instructCommonMethodSendModel.SendData.timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
int count = SocketInteriorService.dicManualResetEvent.Where(m => m.Key == instructCommonMethodSendModel.SendData.experiment_id).Count();
if (count == 0)
{
SocketInteriorService.dicManualResetEvent.Add(instructCommonMethodSendModel.SendData.experiment_id, new ManualResetEvent(true));
}
return instructCommonMethodSendModel;
}
#endregion
}
}