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 } }