using System; using System.Collections.Generic; using HDL_ON.DAL; using HDL_ON.DAL.Net; using HDL_ON.Entity; namespace HDL_ON { public partial class Control { public DateTime LatestDateTime = DateTime.Now; /// /// 所有微信对一端口的控制都会放到这个集合里 /// private static List controlList = new List(50); /// /// 发送数据,等待有反馈 /// /// The bytes send has return. static byte[] ControlBytesSendHasReturn(Command command, byte subnetID, byte deviceID, byte[] gatewayBytes, int sendCount = 3) { Control control = new Control(); control.Send(new Target() { IPEndPoint = CommonPage.EndPoint, Command = command, SubnetID = subnetID, DeviceID = deviceID, AddData = gatewayBytes, }, sendCount, true); return control.UsefulBytes; } /// /// 发送数据,不需要等待回复 /// static void ControlBytesSend(Command command, byte subnetID, byte deviceID, byte[] gatewayBytes, int sendCount = 3, System.Net.IPEndPoint ipEndpoint = null) { Control control = new Control(); control.Send(new Target() { IPEndPoint = ipEndpoint == null ? CommonPage.EndPoint : ipEndpoint, Command = command, SubnetID = subnetID, DeviceID = deviceID, AddData = gatewayBytes, }, sendCount, false); MainPage.Log(command.ToString() + "::" + CommonPage.EndPoint.ToString()); } /// /// 处理接收回来的数据 /// /// 源子网号 /// 源设备号 /// 操作码 /// 有用的数据 /// 源网络套接字 public static void ManagerReceive(byte subnetID, byte deviceID, Command command, byte targetSubnetID, byte targetDeviceID, byte[] usefulBytes, System.Net.EndPoint remoteEndPoint) { try { string receiveFlag = string.Format("{0},{1},{2},", subnetID, deviceID, (int)command); switch ((Command)command) { case Command.YIPanelDeviceInofACK: for (int i = 0; i < 4; i++) { receiveFlag += string.Format("{0}", usefulBytes[i]); } break; case Command.ReadDoorLockSceneObjACK: receiveFlag += string.Format("{0},{1},{2},{3},{4}", usefulBytes[0], usefulBytes[1], usefulBytes[2], usefulBytes[3], usefulBytes[4]); break; case Command.ReadDoorLockClockACK: case Command.CreatConnectionACK: receiveFlag += string.Format("{0}", usefulBytes[0]); break; //门锁,BroadcastDoorLockStateAndAlarm //广播门锁状态和报警, case Command.BroadcastDoorLockStateAndAlarm://广播门锁状态和报警 receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); break; case Command.ReadDoorLockUseRemarkACK: case Command.ReadSensorPushMessageACK: case Command.SetSensorPushMessageACK: case Command.ReadSensorScenceACK: case Command.ReadAnalogACK: receiveFlag += string.Format("{0},{1},{2}", usefulBytes[0], usefulBytes[1], usefulBytes[2]); break; case Command.SetSensorScenceACK: receiveFlag += string.Format("{0},{1},{2}", usefulBytes[1], usefulBytes[2], usefulBytes[3]); break; case Command.SendRemoteInfoToServerACK: for (int i = 1; i < 9; i++) { receiveFlag += string.Format("{0}", usefulBytes[i]); } break; case Command.BroadcastDryContactStatus://由干接点广播出来的数据,程序不做回复。 receiveFlag += string.Format("{0}", usefulBytes[0]); break; case Command.SetSceneACK: receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); break; case Command.SetSeriesACK: receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); break; case Command.UpdataCurtainModelStutasACK: case Command.SetHotelCurtainACK: case Command.DownloadInfraredACK: case Command.SetSensorPushValuesACK: case Command.ReadSensorPushValuesACK: receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); break; case Command.ReadLightEquipmentAllLoopBrightnessACK: break; case Command.SetSingleLightACK: receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[2]); break; case Command.UpLoadInfraredACK: receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); break; case Command.SetCommonACK: case Command.InfraredChannelControlACK: case Command.ReadACModeACK: case Command.SetACModeACK: case Command.Serverx_FH_CMD_ACK: case Command.ReadSensorHistoryACK: case Command.SetSensorAutomationTargetLevelEnableACK: case Command.ReadSensorAutomationLevelTargetEnableACK: receiveFlag += string.Format("{0}", usefulBytes[0]); break; case Command.ReadFoolHeatACK: case Command.SetFoolHeatACK: case Command.SetArmACK: case Command.ReadArmACK: receiveFlag += string.Format("{0}", usefulBytes[0]); break; case Command.ReadDeviceModulACK: case Command.ReadGatewayACK: case Command.ReadSecurityStatusACK: receiveFlag = string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); break; case Command.UpdataLightDimmingTheLargestLevelACK: case Command.UpdataLightDimmingMaximumOrMinimumACK: case Command.WriteManageWirelessNetACK: case Command.ReadGateWayModelInfoACK: case Command.ReadGatewayServerIPACK: case Command.SetGateWayModelInfoACK: case Command.SetGateWayModelInternetInfoACK: case Command.ReadDeviceMacACK: case Command.SetDeviceSubnetIDACK: case Command.PositioningEquipmentACK: case Command.PositioningPanelACK: case Command.GotoConfigModeACK: case Command.CheckConfigSuccessACK: case Command.SetACPanelACK: case Command.ReadACPanelACK: case Command.ReadTerrestriaHeatRemarkACK: case Command.UpdateGatewayIpACK: case Command.ReadWirelessPanelModeACK: case Command.ReadDrycontactModeACK: case Command.ReadACFloorHeatingSettingEquipmentACK: case Command.SetACFloorHeatingSettingEquipmentACK: case Command.Read43FloorHeatingSettingEquipmentACK: case Command.Set43FloorHeatingSettingEquipmentACK: case Command.READ_AIR_ALL_Parameter_ack: case Command.Set_AIR_ALL_Parameter_ack: case Command.ReadFloorHeatProbeACK: case Command.ReadButtonKeyEnableACK: case Command.UpdateLightDimmingLoopRemakeACK: case Command.ReadMusicPanelSettingACK: case Command.ReadMusicPanelEnableACK: case Command.SetMusicPanelEnableACK: case Command.SetMusicPanelSettingACK: case Command.SetGatewayACK: case Command.ReadGatewayProgrammingModeACK: case Command.RED_HSFH_TOTAL_ACK: case Command.RED_HSFH_INFORMATION_ACK: case Command.RED_HSRM_TOTAL_ACK: case Command.RED_HSRM_INFORMATION_ACK: case Command.CLEAR_SYSTEM_HISTORY_ACK: case Command.SetSensorTargetRemarkACK: case Command.ReadSensorAutomationEnableListACK: case Command.SetSensorAutomationEnableListACK: case Command.SetSensorAutomationListIDACK: case Command.ReadSensorAutomationListIDACK: case Command.ReadSensorAutomationNameACK: case Command.SetSensorAutomationNameACK: case Command.Set_Floor_Heat_State_ack: case Command.Read_Floor_Heat_State_ack: case Command.Read_Air_Condition_Set_ack: case Command.HornAlarmBroadcast: case Command.ReadHornLoopCountACK: case Command.UpdateHornLoopRemakeACK: case Command.ReadPanelTempTypeACK: receiveFlag += ""; break; case Command.ControlMusicModel1ACK: receiveFlag += ""; break; case Command.ControlMusicModel2ACK: for (int i = 1; i < usefulBytes.Length; i++) { if (usefulBytes[i + 1] == 44) { break; } receiveFlag += string.Format("{0},", usefulBytes[i]); } break; case Command.Remote3thACK: receiveFlag = string.Format("{0},", (int)command); break; case Command.ReadDeviceLoopInfoACK: if (usefulBytes[0] == 1) { receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[2]); ; } else receiveFlag += string.Format("{0},{1},{2}", usefulBytes[0], usefulBytes[1], usefulBytes[2]); break; case Command.SetDeviceLoopInfoACK: case Command.InfraredControlACK: case Command.SetLogicLoopColorACK: case Command.SetSecurityByPassACK: case Command.SetSensorAutomationDateTimeCycleACK: case Command.ReadSensorAutomationDateTimeCycleACK: receiveFlag += string.Format("{0},{1},{2}", usefulBytes[0], usefulBytes[1], usefulBytes[2]); break; case Command.UpdataRemakeACK: break; case Command.ReadWirelessPanelButtonKeyACK: case Command.WriteWirelessPanelButtonKeyACK: case Command.ReadDryContactStatusACK: case Command.InstructionPanelKeyACK: case Command.ReadInstructionPanelKeyACK: case Command.ReadAnalogValueACK: case Command.ReadSensorTargetRemarkACK: case Command.SetHornTargetStateACK: case Command.ReadHornTargetStateACK: receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); break; case Command.AssignedAddressACK: case Command.UpdataCurtainModelRunTimeACK: case Command.ReadCurtainStutasACK: case Command.ReadLogicLoopColorACK: case Command.ReadPanleTempACK: case Command.FreshAirReadACK: case Command.FreshAirControlACK: case Command.Set_Air_State_New_ack: case Command.ReadHornHistoryACK: case Command.ReadHornLoopsStatusACK: case Command.ReadHornPushACK: case Command.SetHornPushACK: case Command.ReadHornLoopAlarmACK: case Command.SetHornTargetEnableACK: case Command.ReadHornTargetEnableACK: receiveFlag += string.Format("{0}", usefulBytes[0]); break; case Command.RemoteFirstACK: for (int i = 1; i < 1 + 28; i++) { receiveFlag += string.Format("{0}", usefulBytes[i]); } break; case Command.RemoteSecoudACK: for (int i = 0; i < 7; i++) { receiveFlag += string.Format("{0}", usefulBytes[i]); } break; default: break; } //System.MainPage.WriteLog ("接收到数据:" + receiveFlag); for (int i = 0; i < controlList.Count; i++) { try { var control = controlList[i]; if (control.SendFlag == receiveFlag) { control.LatestDateTime = System.DateTime.Now; control.UsefulBytes = usefulBytes;// control.run(); } } catch { } } } catch (Exception ex) { MainPage.Log("ManagerReceive抛出异常:" + ex.ToString()); } } /// /// 添加到内存数组里面 /// void add() { /// /// 达到50条数据后就清理一下 /// if (50 < controlList.Count) { lock (controlList) { for (int i = 0; i < controlList.Count;) { if (controlList[i] == null || 3 <= controlList[i].Packet.HaveSendCount) { controlList.RemoveAt(i); } else { i++; } } } //System.MainPage.WriteLog ("++++++++"+controlList.Count.ToString ()); } controlList.Add(this); } //当前数据的关键数据 string sendFlag = string.Empty; protected string SendFlag { get { return sendFlag; } set { sendFlag = value; usefulBytes = null; } } private byte[] usefulBytes; /// /// 获取回来的有用信息,如果获取回来的数据为null,就会抛出异常信息 /// public byte[] UsefulBytes { get { if (null == usefulBytes) { // throw new Exception("不好意思,网络不稳定或者远程设备不在线,请稍候再试!"); } return this.usefulBytes; } set { usefulBytes = value; } } //发送数据了之后当前线程等待或者运行的信号 System.Threading.ManualResetEvent allDone = new System.Threading.ManualResetEvent(false); /// /// 发送了数据后,线程就是等待状态,直到接收到反馈或者超时后退出 /// void wait() { allDone.Reset(); allDone.WaitOne(); } /// /// 让当前线程继续执行 /// void run() { allDone.Set(); Packet.HaveSendCount = 4; } //数据重发处理 void managerSendCount(object o) { add(); if (CommonPage.IsRemote) { MqttCommon.MqttRemoteSend(Packet.Bytes); Packet.FlagDateTime = DateTime.Now; Packet.HaveSendCount--; //这里是重发两次 while (Packet.HaveSendCount < 3) { if (Packet.FlagDateTime.AddMilliseconds(1000).Ticks <= System.DateTime.Now.Ticks) { MqttCommon.MqttRemoteSend(Packet.Bytes); Packet.FlagDateTime = DateTime.Now; Packet.HaveSendCount++; } System.Threading.Thread.Sleep(100); }
 allDone.Set();
 } else { try { MainPage.Log("发送数据:" + SendFlag); BusSocket.AsyncBeginSend(Packet); Packet.HaveSendCount--; //这里是重发两次 while (Packet.HaveSendCount < 3) { if (Packet.FlagDateTime.AddMilliseconds(1000).Ticks <= System.DateTime.Now.Ticks) { //System.MainPage.WriteLog ("重发数据:" + SendFlag); BusSocket.AsyncBeginSend(Packet); } System.Threading.Thread.Sleep(100); } } catch (Exception ex) { MainPage.Log("managerSendCount:" + ex.ToString()); } finally { allDone.Set(); } } } /// /// 当前数据包 /// Packet Packet; private void ini(Target target, bool send = true) { this.SendFlag = string.Format("{0},{1},{2},", target.SubnetID, target.DeviceID, (int)target.Command + 1); switch (target.Command) { case Command.YIPanelDeviceInof: for (int i = 0; i < 4; i++) { this.sendFlag += string.Format("{0}", target.AddData[i]); } break; case Command.ReadDoorLockSceneObj: this.SendFlag += string.Format("{0},{1},{2},{3},{4}", target.AddData[0], target.AddData[1], target.AddData[2], target.AddData[3], target.AddData[4]); break; case Command.ReadDoorLockClock: case Command.CreatConnection: this.SendFlag += string.Format("{0}", target.AddData[0]); break; case Command.ReadDoorLockUseRemark: case Command.ReadSensorPushMessage: case Command.SetSensorPushMessage: case Command.SetSensorScence: case Command.ReadAnalog: this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]); break; case Command.ReadSensorScence: this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]); break; case Command.SendRemoteInfoToServer: for (int i = 40; i < 48; i++) { this.sendFlag += string.Format("{0}", target.AddData[i]); } break; case Command.SetCommonSwitch: case Command.InfraredChannelControl: case Command.ReadACMode: case Command.SetACMode: case Command.ReadFoolHeat: case Command.SetFoolHeat: case Command.Serverx_FH_CMD: case Command.SetArm: case Command.ReadArm: case Command.ReadSensorHistory: case Command.SetSensorAutomationTargetLevelEnable: case Command.ReadSensorAutomationLevelTargetEnable: this.SendFlag += string.Format("{0}", target.AddData[0]); break; case Command.ReadDeviceModul: case Command.ReadGateway: case Command.ReadSecurityStatus: case Command.ReadHornTargetState: this.SendFlag = string.Format("{0},{1}", target.AddData[0], target.AddData[1]); break; case Command.SetScene: case Command.SetSeries: case Command.SetHotelCurtain: case Command.ReadAnalogValue: case Command.SetSensorPushValues: case Command.ReadSensorPushValues: this.SendFlag += string.Format("{0},{1}", target.AddData[0], target.AddData[1]); break; //case Command.ReadOnePortWirelessFROtherInfo: case Command.UpdataRemake: case Command.WriteManageWirelessNet: case Command.UpdataLightDimmingTheLargestLevel: case Command.UpdataLightDimmingMaximumOrMinimum: case Command.ReadGateWayModelInfo: case Command.ReadGatewayServerIP: case Command.SetGateWayModelInfo: case Command.SetGateWayModelInternetInfo: case Command.ReadDeviceMac: case Command.SetDeviceSubnetID: case Command.PositioningEquipment: case Command.PositioningPanel: case Command.CheckConfigSuccess: case Command.GotoConfigMode: case Command.ReadACPanel: case Command.SetACPanel: case Command.ReadTerrestriaHeatRemark: case Command.UpdateGatewayIp: case Command.ReadWirelessPanelMode: case Command.ReadDrycontactMode: case Command.ReadACFloorHeatingSettingEquipment: case Command.SetACFloorHeatingSettingEquipment: case Command.Read43FloorHeatingSettingEquipment: case Command.Set43FloorHeatingSettingEquipment: case Command.READ_AIR_ALL_Parameter: case Command.Set_AIR_ALL_Parameter: case Command.ReadFloorHeatProbe: case Command.ControlMusicModel: case Command.ReadButtonKeyEnable: case Command.UpdateEquipmentLoopRemake: case Command.SetGateway: case Command.ReadMusicPanelSetting: case Command.ReadMusicPanelEnable: case Command.SetMusicPanelEnable: case Command.SetMusicPanelSetting: case Command.ReadGatewayProgrammingMode: case Command.RED_HSFH_TOTAL: case Command.RED_HSFH_INFORMATION: case Command.RED_HSRM_TOTAL: case Command.RED_HSRM_INFORMATION: case Command.CLEAR_SYSTEM_HISTORY: case Command.SetSensorTargetRemark: case Command.ReadSensorAutomationEnableList: case Command.SetSensorAutomationEnableList: case Command.SetSensorAutomationListID: case Command.ReadSensorAutomationListID: case Command.SetSensorAutomationName: case Command.ReadSensorAutomationName: case Command.Set_Floor_Heat_State: case Command.Read_Floor_Heat_State: case Command.Read_Air_Condition_Set: case Command.UpdateHornLoopRemake: case Command.ReadHornLoopCount: case Command.ReadPanelTempType: this.SendFlag += ""; break; case Command.ControlMusicModel2: for (int i = 1; i < target.AddData.Length; i++) { if (target.AddData[i + 1] == 0x0D) { break; } this.sendFlag += string.Format("{0},", target.AddData[i]); } break; case Command.Remote3th: this.SendFlag = string.Format("{0},", (int)target.Command + 1); break; case Command.ReadDeviceLoopInfo: if (target.AddData[0] == 1)//特殊处理灯光类,DMX模块每一个回路不固定小类,根据具体设置来回复 this.sendFlag += string.Format("{0},{1}", target.AddData[0], target.AddData[2]); else this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]); break; case Command.SetDeviceLoopInfo: case Command.InfraredControl: case Command.SetLogicLoopColor: case Command.SetSecurityByPass: case Command.SetSensorAutomationDateTimeCycle: case Command.ReadSensorAutomationDateTimeCycle: this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]); break; case Command.ReadWirelessPanelButtonKey: case Command.WriteWirelessPanelButtonKey: case Command.ReadDryContactStatus: case Command.UpdataCurtainModelStutas: case Command.SetSingleLight: case Command.DownloadInfrared: case Command.UpLoadInfrared: case Command.InstructionPanelKey: case Command.ReadInstructionPanelKey: case Command.ReadSensorTargetRemark: case Command.SetHornTargetState: this.sendFlag += string.Format("{0},{1}", target.AddData[0], target.AddData[1]); break; case Command.AssignedAddress: case Command.UpdataCurtainModelRunTime: case Command.ReadCurtainStatus: case Command.ReadLogicLoopColor: case Command.ReadPanleTemp: case Command.FreshAirRead: case Command.FreshAirControl: case Command.Set_Air_State_New: case Command.ReadHornTargetEnable: case Command.SetHornTargetEnable: case Command.ReadHornLoopAlarm: case Command.SetHornPush: case Command.ReadHornPush: case Command.ReadHornHistory: case Command.ReadHornLoopsStatus: this.sendFlag += string.Format("{0}", target.AddData[0]); break; case Command.RemoteFirst: for (int i = 0; i < 28; i++) { this.sendFlag += string.Format("{0}", target.AddData[i]); } break; case Command.RemoteSecoud: for (int i = 0; i < 7; i++) { this.sendFlag += string.Format("{0}", target.AddData[i]); } break; default: //return; break; } if (send) { System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(managerSendCount)); thread.IsBackground = true; thread.Start(Packet); } } /// /// 发送Bus数据,发送了不需要等待 /// /// 发送对象 /// 重发次数 public void Send(Target target, int sendCount, bool isWait) { Packet = new Packet(target.SendBytes, target.IPEndPoint); Packet.HaveSendCount = 3 - sendCount; ini(target); if (isWait) { this.wait(); } } } }