using System; using System.Collections.Generic; using System.Text; using HDL_ON.DAL.Net; using HDL_ON.DriverLayer; using HDL_ON.Entity; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Shared.Net; namespace HDL_ON { public class Control_Udp_Bus { /// /// 控制失败次数 /// public int controlLostCount = 0; /// /// 所有对一端口的控制都会放到这个集合里 /// List controlList = new List(50); public System.Net.IPEndPoint EndPoint { get { try { return new System.Net.IPEndPoint(System.Net.IPAddress.Parse(new NetWiFi().BroadcastIpAddress.ToString()),6000); } catch { //防止异常导致程序退出 return new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 6000); } } } /// /// 发送数据,不需要等待回复 /// ps:允许临时公开,仅供tv发送bus命令使用,后期需要更新到A协议数据格式控制 /// public void ControlBytesSend(Command command, byte subnetID, byte deviceID, byte[] gatewayBytes, int sendCount = 3) { var control = new Control_Udp_Bus(); control.Send(new Target() { IPEndPoint = EndPoint , Command = command, SubnetID = subnetID, DeviceID = deviceID, AddData = gatewayBytes, }, sendCount, false); } /// /// 重发验证 /// public void ReceiveRepeatManager(string receiveFlag) { for (int i = 0; i < controlList.Count; i++) { try { var control = controlList[i]; if (control.SendFlag == receiveFlag) { control.UsefulBytes = usefulBytes;// control.run(); } } catch (Exception ex) { Console.WriteLine($"control error : {ex.Message}"); } } } /// /// 000E 搜索回复 /// public void ReceiveReadRemark(byte[] usefullBytes) { try { //账号没登录不回复 if (MainPage.LoginUser == null || !MainPage.LoginUser.IsLogin) { return; } Control.ins.ChangeCommunicationMode(CommunicationMode.tcp_local_server); var sendStr = MainPage.LoginUser.accountString; if (usefullBytes.Length == 0) { SendRemark(sendStr); } else { bool isExit = false; for (int i = 0, len = usefullBytes.Length; i < len; i++) { if (i % 2 == 0) { if ((usefullBytes[i] & 0xFF) == 252 && (usefullBytes[i + 1] & 0xFF) == 252) { isExit = true; break; } } } if (!isExit) { //不存在,代表没收到本机的发送,继续回复 SendRemark(sendStr); } } } catch (Exception ex) { Console.WriteLine($"回复bus搜索异常 : {ex.Message}"); } } /// /// 000F回复备注 /// void SendRemark(string sendStr) { //if (System.Globalization.CultureInfo.InstalledUICulture.EnglishName.ToUpper().StartsWith("CZECH")) // Encoding.GetEncoding(1250); byte[] sendBytes = new byte[20]; byte[] b1 = Encoding.GetEncoding("gb2312").GetBytes(sendStr); Array.Copy(b1, 0, sendBytes, 0, 20 < b1.Length ? 20 : b1.Length); var control = new Control_Udp_Bus(); control.Send(new Target() { IPEndPoint = EndPoint, Command = Command.ReadRemarkACK, SubnetID = 0xFF, DeviceID = 0xFF, AddData = sendBytes, }, 0, false); //设置当前发送指令方式为:任何情况下本地发送、不限制、不加密明文发送 } /// /// 控制bus场景 /// public void ControlBusScenes(Scene scene) { foreach (var function in scene.sceneFunctionList) { switch (function.functionType) { case FunctionType.Curtain: byte curtainState = 0; if (function.trait_on_off.value.ToString() == "on") { curtainState = 1; } else if (function.trait_on_off.value.ToString() == "off") { curtainState = 2; } ControlBytesSend(Command.SetCurtainModelStutas, function.bus_Data.SubnetID, function.bus_Data.DeviceID, new byte[] { function.bus_Data.LoopID, curtainState, }); break; case FunctionType.AC: var aC = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(function));//as AC; ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID }); ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 6, aC.curModeIndex, aC.bus_Data.LoopID }); ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 5, aC.curFanIndex, aC.bus_Data.LoopID }); byte modeKey = 4; switch (aC.curModeIndex) { case 3: modeKey = 8; break; case 0: modeKey = 4; break; case 1: modeKey = 7; break; case 4: modeKey = 19; break; case 2: modeKey = 2; break; } ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { modeKey, Convert.ToByte(aC.trait_temp.value), aC.bus_Data.LoopID }); break; case FunctionType.Relay: case FunctionType.Dimmer: byte brightness = 0; if (function.trait_on_off.value.ToString() == "on") { var brightnessTrait = function.function.Find((obj) => obj.name == "brightness"); if (brightnessTrait != null) { brightness = Convert.ToByte(brightnessTrait.value); } } ControlBytesSend(Command.SetSingleLight, function.bus_Data.SubnetID, function.bus_Data.DeviceID, new byte[] { function.bus_Data.LoopID,brightness }); break; case FunctionType.RGB: //ControlBytesSend(Command.SetLogicLoopColor, function.bus_Data.SubnetID, function.bus_Data.DeviceID, // new byte[] { // }); break; case FunctionType.FloorHeating: var fh = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(function));//as AC; var fhModeTempTrait = function.function.Find((obj) => obj.name == "mode"); if (fhModeTempTrait.value_key.Count == 4) { byte b1 = function.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0; if (fh.workMode > 0) { b1 += (byte)(16 + fh.workMode); } ControlBytesSend(Command.SetFloorHeat, function.bus_Data.SubnetID, function.bus_Data.DeviceID, new byte[] { fh.bus_Data.LoopID, b1, (byte)fh.curTempType, fh.curModeIndex, fh.modeTemp["normal"], fh.modeTemp["day"], fh.modeTemp["night"], fh.modeTemp["away"], 0, 0 }); } break; case FunctionType.Socket: //var s = function as SwitchSocket; ControlBytesSend(Command.SetSingleLight, function.bus_Data.SubnetID, function.bus_Data.DeviceID, new byte[] { function.bus_Data.LoopID, function.trait_on_off.value.ToString() == "on" ? (byte)100 : (byte)0 }); break; } } } /// /// 控制bus设备 /// /// /// public void WriteBusData(Function function, Dictionary commandDictionary) { try { var subnetId = function.bus_Data.SubnetID; var deviceId = function.bus_Data.DeviceID; var loopId = function.bus_Data.LoopID; switch (function.functionCategory) { case FunctionCategory.Light: var light = function as Light; switch (light.functionType) { case FunctionType.RGB: MainPage.Log($"rgb level : {light.brightness}"); byte b = 100;//开关操作依据on_off字段,实际开关值依据brightness,当on_off为打开,brightness不能为0 if (light.trait_on_off.value.ToString() == "off") { b = 0; } else { b = (byte)light.brightness == 0 ? (byte)100 : (byte)light.brightness; } var bytes = new byte[] { function.bus_Data.LoopID, b, 254, 0,Convert.ToByte(light.fadeTime) ,3, (byte)light.redColor,(byte)light.greenColor, (byte)light.blueColor, 0,0}; ControlBytesSend(Command.SetLogicLoopColor, subnetId, deviceId, bytes, 1); break; case FunctionType.Dimmer: byte b1 = 100; if (light.trait_on_off.value.ToString() == "off") { b1 = 0; } else { b1 = (byte)light.brightness == 0 ? (byte)100 : (byte)light.brightness; } ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus_Data.LoopID, b1, 0, Convert.ToByte(light.fadeTime) }); //DimmerPage.UpdataStates(light); break; case FunctionType.Relay: ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus_Data.LoopID, light.trait_on_off.value.ToString() == "on" ? (byte)100 : (byte)0, 0, 0 }); //RelayPage.UpdataState(light); break; } break; case FunctionCategory.Curtain: var curtain = function as Curtain; switch (curtain.functionType) { case FunctionType.Curtain: byte b1 = 0; if (curtain.trait_on_off.value.ToString() == "stop") { b1 = 0; } else if (curtain.trait_on_off.value.ToString() == "on") { b1 = 1; } else { b1 = 2; } ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { curtain.bus_Data.LoopID, b1 }); break; case FunctionType.MotorCurtain: case FunctionType.RollingShutter: //if (commandDictionary.Count > 0) //{ if (curtain.trait_on_off.value.ToString() == "stop") { ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { curtain.bus_Data.LoopID, 0 }); } else { ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, Convert.ToByte(curtain.percent) }); } //} //else //{ // if (curtain.trait_on_off.value.ToString() == "stop") // { // ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { curtain.bus_Data.LoopID, 0 }); // } // else if (curtain.trait_on_off.value.ToString() == "on") // { // ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, 100 }); // } // else if (curtain.trait_on_off.value.ToString() == "off") // { // ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, 0 }); // } //} break; } break; case FunctionCategory.Thermostat: switch (function.functionType) { case FunctionType.AC: var aC = function as AC; ControlBytesSend(Command.SetACMode, subnetId, deviceId, new byte[] { aC.bus_Data.LoopID, (byte)aC.curTempType, 32, 32, 32, 32, 32, 0, aC.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0, aC.curModeIndex, aC.curFanIndex, Convert.ToByte(aC.trait_temp.value), 0 }); //ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.on_off == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID }); foreach (var dic in commandDictionary) { switch (dic.Key) { case "on_off": ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID }); break; case "mode": ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 6, aC.curModeIndex, aC.bus_Data.LoopID }); break; case "fan": ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 5, aC.curFanIndex, aC.bus_Data.LoopID }); break; case "temp": byte modeKey = 4; switch (aC.curModeIndex) { case 3: modeKey = 8; break; case 0: modeKey = 4; break; case 1: modeKey = 7; break; case 4: modeKey = 19; break; case 2: modeKey = 2; break; } ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { modeKey, Convert.ToByte(aC.trait_temp.value), aC.bus_Data.LoopID }); break; default: MainPage.Log($"功能未支持 : {dic.Key}"); break; } } break; case FunctionType.FloorHeating: var fh = function as FloorHeating; if (fh.modeTemp.Count == 4) { byte b1 = fh.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0; if (fh.workMode > 0) { b1 += (byte)(16 + fh.workMode); } if (commandDictionary.ContainsKey("temp")) { var dicTempString = ""; commandDictionary.TryGetValue("temp", out dicTempString); var dicTemp = Convert.ToByte(dicTempString); switch (fh.trait_mode.value) { case "day": fh.modeTemp["day"] = dicTemp; break; case "night": fh.modeTemp["night"] = dicTemp; break; case "away": fh.modeTemp["away"] = dicTemp; break; case "normal": fh.modeTemp["normal"] = dicTemp; break; } } ControlBytesSend(Command.SetFloorHeat, subnetId, deviceId, new byte[] { fh.bus_Data.LoopID, b1, (byte)fh.curTempType, fh.curModeIndex, fh.modeTemp["normal"], fh.modeTemp["day"], fh.modeTemp["night"], fh.modeTemp["away"], 0, 0 }); } break; } break; case FunctionCategory.Electrical: switch (function.functionType) { case FunctionType.Fan: var fan = function as Fan; if (fan.trait_on_off.value.ToString() == "on") { ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { fan.bus_Data.LoopID, (byte)fan.openLevel }); } { ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { fan.bus_Data.LoopID, 0 }); } break; } break; case FunctionCategory.SwitchDevice: switch (function.functionType) { case FunctionType.Socket: var s = function as SwitchSocket; ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { s.bus_Data.LoopID, s.trait_on_off.value.ToString() == "on" ? (byte)100 : (byte)0 }); break; } break; } #region 发送命令立即更新UI //HomePage.UpdataFunctionStates(function); //RoomPage.UpdataStates(function); //FunctionPage.UpdataStates(function); //ClassificationPage.UpdataInfo(function); #endregion } catch (Exception ex) { MainPage.Log($"DataConversion_Bus Erorr : {ex.Message}"); } } /// /// 读取bus设备数据 /// public void ReadBusData(Function function) { try { var subnetId = function.bus_Data.SubnetID; var deviceId = function.bus_Data.DeviceID; var loopId = function.bus_Data.LoopID; switch (function.functionCategory) { case FunctionCategory.Light: switch (function.functionType) { case FunctionType.Relay: case FunctionType.Dimmer: ControlBytesSend(Command.ReadLightAllLoopBrightness, subnetId, deviceId, new byte[] { }); break; case FunctionType.RGB: ControlBytesSend(Command.ReadLogicLoopColor, subnetId, deviceId, new byte[] { function.bus_Data.LoopID }); break; } break; case FunctionCategory.Curtain: switch (function.functionType) { case FunctionType.Curtain: case FunctionType.MotorCurtain: case FunctionType.RollingShutter: ControlBytesSend(Command.ReadCurtainStatus, subnetId, deviceId, new byte[] { function.bus_Data.LoopID }); break; } break; case FunctionCategory.Thermostat: switch (function.functionType) { case FunctionType.AC: ControlBytesSend(Command.ReadACMode, subnetId, deviceId, new byte[] { function.bus_Data.LoopID }); break; case FunctionType.FloorHeating: ControlBytesSend(Command.ReadFloorHeat, subnetId, deviceId, new byte[] { function.bus_Data.LoopID }); break; } break; case FunctionCategory.Electrical: switch (function.functionType) { case FunctionType.Fan: var fan = function as Fan; ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { fan.bus_Data.LoopID }); break; } break; case FunctionCategory.SwitchDevice: switch (function.functionType) { case FunctionType.Socket: var s = function as SwitchSocket; ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { s.bus_Data.LoopID }); break; } break; case FunctionCategory.Sensor: var sensor = function as Sensor; ControlBytesSend(Command.ReadDeviceLoopInfo, subnetId, deviceId, new byte[] { (byte)5, (byte)((int)sensor.functionType % 256), sensor.bus_Data.LoopID }); break; } } catch (Exception ex) { MainPage.Log($"Read DataConversion_Bus Erorr : {ex.Message}"); } } /// /// 添加到内存数组里面 /// 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(); //Bus socket无法控制,重启机制 if (controlLostCount > 10) { UdpSocket._BusSocket.Stop(); new System.Threading.Thread(() => { System.Threading.Thread.Sleep(1000); UdpSocket._BusSocket.Start(); controlLostCount = 0; }) { IsBackground = true }.Start(); } try { MainPage.Log("发送数据:" + SendFlag); UdpSocket._BusSocket.AsyncBeginSend(Packet); Packet.HaveSendCount--; //这里是重发两次 while (Packet.HaveSendCount < 3) { if (Packet.FlagDateTime.AddMilliseconds(1000).Ticks <= DateTime.Now.Ticks) { MainPage.Log("重发数据:" + SendFlag); UdpSocket._BusSocket.AsyncBeginSend(Packet); controlLostCount++; } System.Threading.Thread.Sleep(100); } } catch (Exception ex) { MainPage.Log("managerSendCount:" + ex.ToString()); } finally { allDone.Set(); } } /// /// 当前数据包 /// Packet Packet; private void ini(Target target) { this.SendFlag = string.Format("{0},{1},{2},", target.SubnetID, target.DeviceID, (int)target.Command + 1); switch (target.Command) { case Command.SetSingleLight: case Command.ReadLogicLoopColor: case Command.ReadACMode: case Command.SetACMode: case Command.ReadFloorHeat: case Command.SetFloorHeat: this.sendFlag += string.Format("{0}", target.AddData[0]); break; case Command.SetLogicLoopColor: this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]); break; case Command.ReadLightAllLoopBrightness: this.SendFlag += ""; break; //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.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.ReadSecurityStatus: //case Command.ReadHornTargetState: case Command.ReadGateway: 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.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.SetCurtainModelStutas: //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.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; } System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(managerSendCount)); thread.IsBackground = true; thread.Start(Packet); } /// /// 发送Bus数据,发送了不需要等待 /// /// 发送对象 /// 重发次数 private void Send(Target target, int sendCount, bool isWait) { try { Packet = new Packet(target.SendBytes, target.IPEndPoint); Packet.HaveSendCount = 3 - sendCount; ini(target); if (isWait) { this.wait(); } } catch(Exception ex) { MainPage.Log($"Send bus data error {ex.Message}"); } } /// /// 读取网关IP /// public void ReadGatewayIP() { try { var sendJob = new JObject { {"type","device" },{"from_oid","020101" },{"to_oid",null },{"time_stamp","46A3B99F" },{"command","search"} }; var SearchGateway = JsonConvert.SerializeObject(sendJob); var SearchGatewayPayload = Encoding.ASCII.GetBytes(SearchGateway); Packet = new Packet(SearchGatewayPayload, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("239.0.168.188"), 8585)); Packet.HaveSendCount = 4;//ps:没有重发,后期有时间可以增加重发判断 System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(managerSendCount)); thread.IsBackground = true; thread.Start(Packet); wait(); } catch (Exception ex) { MainPage.Log($"Send bus data error {ex.Message}"); } } } }