| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using HDL_ON.Entity; |
| | | using HDL_ON.UI; |
| | | using Shared; |
| | | |
| | | namespace HDL_ON |
| | | { |
| | | /// <summary> |
| | | /// bus控制数据包 |
| | | /// </summary> |
| | | public class Packet |
| | | { |
| | | /// <summary> |
| | |
| | | public byte[] Bytes; |
| | | |
| | | /// <summary> |
| | | /// 远程的套接字 |
| | | /// 数据发送IP地址 |
| | | /// </summary> |
| | | public System.Net.EndPoint RemoteEndPoint; |
| | | |
| | | public Packet() |
| | | { |
| | | this.Bytes = new byte[Size]; |
| | | RemoteEndPoint = (System.Net.EndPoint)new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0); |
| | | RemoteEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0); |
| | | } |
| | | public Packet(byte[] data, System.Net.EndPoint remoteEndPoint) |
| | | { |
| | |
| | | /// <summary> |
| | | /// 记录已经发送数据出去的时间 |
| | | /// </summary> |
| | | public System.DateTime FlagDateTime; |
| | | public DateTime FlagDateTime; |
| | | |
| | | /// <summary> |
| | | /// 已经发送了多少数 |
| | | /// </summary> |
| | | public int HaveSendCount; |
| | | |
| | | public delegate void DelegateReceive(byte subnetID, byte deviceID, Command command, byte[] usefullBytes, string revGatewayIP); |
| | | public static event DelegateReceive ReceiveEvent; |
| | | /// <summary> |
| | | /// 接收到的所有数据 |
| | | /// </summary> |
| | | public static Action<byte, byte, int, Command, byte, byte, byte[], System.Net.IPEndPoint> ReceviceAllDadaAction; |
| | | /// <summary> |
| | | /// 处理接收到的数据 |
| | | /// </summary> |
| | | public virtual void Manager() |
| | | { |
| | | if (((System.Net.IPEndPoint)RemoteEndPoint).Port == 6688) |
| | | try |
| | | { |
| | | ReceviceAllDadaAction?.Invoke(0, 0, 0, 0, 0, 0, Bytes, (System.Net.IPEndPoint)RemoteEndPoint); |
| | | Control.ManagerReceive(0, 0, 0, 0, 0, Bytes, (System.Net.IPEndPoint)RemoteEndPoint); |
| | | //如果当前通讯方式不是本地bus udp则退出 |
| | | if(DriverLayer.Control.ins.communicationMode == DriverLayer.CommunicationMode.local_BusUdp) |
| | | { |
| | | return; |
| | | } |
| | | //对于操作数据库的时间比较长的,可以创建另一个线程处理 |
| | | if (!"HDLMIRACLE".Equals(Encoding.ASCII.GetString(Bytes, 4, 10))) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | byte subnetID = this.Bytes[17]; //源子网号 |
| | | byte deviceID = this.Bytes[18]; //源设备号 |
| | | |
| | | //源设备类型 |
| | | int deviceType = this.Bytes[19] * 256 + this.Bytes[20]; |
| | | |
| | | Command command = (Command)(Bytes[21] * 256 + Bytes[22]); //操作码控制命令 |
| | | |
| | | byte targetSubnetID = this.Bytes[23]; |
| | | byte targetDeviceID = this.Bytes[24]; |
| | | |
| | | //不是要接收的指令就返回 |
| | | if (!((targetSubnetID == 252 && targetDeviceID == 252) || (targetSubnetID == 0xff && targetDeviceID == 0xff))) |
| | | { |
| | | return; |
| | | } |
| | | byte[] usefulBytes = null; |
| | | if (this.Bytes[16] == 0xFF) |
| | | { |
| | | usefulBytes = new byte[Bytes.Length - 16 - 11]; |
| | | Array.Copy(Bytes, 27, usefulBytes, 0, usefulBytes.Length); |
| | | } |
| | | else |
| | | { |
| | | //有用的附加数据 |
| | | usefulBytes = new byte[this.Bytes[16] - 11]; |
| | | Array.Copy(Bytes, 25, usefulBytes, 0, usefulBytes.Length); |
| | | } |
| | | //处理接收到的数据 |
| | | UdpPacket_DataProcessing(subnetID, deviceID, command, usefulBytes); |
| | | //处理是否要重发数据 |
| | | ManagerReceive(subnetID, deviceID, command, usefulBytes); |
| | | } |
| | | else |
| | | catch (Exception ex) |
| | | { |
| | | try |
| | | { |
| | | //对于操作数据库的时间比较长的,可以创建另一个线程处理 |
| | | if (!"HDLMIRACLE".Equals(System.Text.Encoding.ASCII.GetString(Bytes, 4, 10))) |
| | | { |
| | | return; |
| | | } |
| | | Control.controlLostCount = 0; |
| | | |
| | | byte subnetID = this.Bytes[17]; //源子网号 |
| | | byte deviceID = this.Bytes[18]; //源设备号 |
| | | |
| | | //源设备类型 |
| | | int deviceType = this.Bytes[19] * 256 + this.Bytes[20]; |
| | | |
| | | Command command = (Command)(Bytes[21] * 256 + Bytes[22]); //操作码控制命令 |
| | | |
| | | byte targetSubnetID = this.Bytes[23]; |
| | | byte targetDeviceID = this.Bytes[24]; |
| | | |
| | | //不是要接收的指令就返回 |
| | | if (!((targetSubnetID == 252 && targetDeviceID == 252) || (targetSubnetID == 0xff && targetDeviceID == 0xff))) |
| | | { |
| | | return; |
| | | } |
| | | byte[] usefulBytes = null; |
| | | if (this.Bytes[16] == 0xFF) |
| | | { |
| | | usefulBytes = new byte[Bytes.Length - 16 - 11]; |
| | | System.Array.Copy(Bytes, 27, usefulBytes, 0, usefulBytes.Length); |
| | | } |
| | | else |
| | | { |
| | | //有用的附加数据 |
| | | usefulBytes = new byte[this.Bytes[16] - 11]; |
| | | Array.Copy(Bytes, 25, usefulBytes, 0, usefulBytes.Length); |
| | | } |
| | | |
| | | if (ReceiveEvent != null) |
| | | { |
| | | string revIp = $"{Bytes[0]}.{Bytes[1]}.{Bytes[2]}.{Bytes[3]}"; |
| | | if (revIp == "172.16.2.237") |
| | | { |
| | | |
| | | } |
| | | ReceiveEvent(subnetID, deviceID, command, usefulBytes, revIp); |
| | | } |
| | | |
| | | //if (command == Command.SuperGatewayAgentACK) { |
| | | // SuperGateWay.SendAndReceiveDatas.Recevice (subnetID, deviceID, usefulBytes); |
| | | //} |
| | | if (ReceviceAllDadaAction != null) |
| | | { |
| | | ReceviceAllDadaAction(subnetID, deviceID, deviceType, command, targetSubnetID, targetDeviceID, usefulBytes, (System.Net.IPEndPoint)RemoteEndPoint); |
| | | } |
| | | //处理是否要重发数据 |
| | | Control.ManagerReceive(subnetID, deviceID, command, targetSubnetID, targetDeviceID, usefulBytes, RemoteEndPoint); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | MainPage.Log($"packet {ex.Message} "); |
| | | } |
| | | MainPage.Log($"packet {ex.Message} "); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 数据包处理 |
| | | /// ps:由commonpage转移过来,还需要转移合适的位置管理 |
| | | /// </summary> |
| | | /// <param name="subnetID"></param> |
| | | /// <param name="deviceID"></param> |
| | | /// <param name="command"></param> |
| | | /// <param name="receiveBytes"></param> |
| | | void UdpPacket_DataProcessing(byte subnetID, byte deviceID, Command command, byte[] receiveBytes) |
| | | { |
| | | try |
| | | { |
| | | switch (command) |
| | | { |
| | | case Command.SetSingleLightACK: |
| | | var queryList = new List<Function>(); |
| | | queryList.AddRange(DB_ResidenceData.functionList.electricals); |
| | | queryList.AddRange(DB_ResidenceData.functionList.lights); |
| | | foreach (var updataObj in queryList) |
| | | { |
| | | if (updataObj.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0]) |
| | | { |
| | | if (updataObj.functionType != FunctionType.RGB) |
| | | { |
| | | if (updataObj.trait_on_off.value.ToString() == "on") |
| | | { |
| | | if (updataObj.functionType == FunctionType.Fan) |
| | | { |
| | | (updataObj as Fan).openLevel = receiveBytes[2]; |
| | | updataObj.lastState = Language.StringByID(StringId.Level) + " : " + receiveBytes[2]; |
| | | } |
| | | else |
| | | { |
| | | (updataObj as Light).brightness = receiveBytes[2]; |
| | | updataObj.lastState = Language.StringByID(StringId.Brightness) + " : " + receiveBytes[2] + "%"; |
| | | } |
| | | } |
| | | HomePage.UpdataFunctionStates(updataObj); |
| | | RoomPage.UpdataStates(updataObj); |
| | | FunctionPage.UpdataStates(updataObj); |
| | | ClassificationPage.UpdataInfo(updataObj); |
| | | switch (updataObj.functionType) |
| | | { |
| | | case FunctionType.Relay: |
| | | RelayPage.UpdataState(updataObj as Light); |
| | | break; |
| | | case FunctionType.Dimmer: |
| | | DimmerPage.UpdataStates(updataObj as Light); |
| | | break; |
| | | case FunctionType.Fan: |
| | | FanPage.UpdataState(updataObj as Fan); |
| | | break; |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case Command.ReadLightAllLoopBrightnessACK: |
| | | for (int i = 0; i < receiveBytes[0]; i++) |
| | | { |
| | | var light = DB_ResidenceData.functionList.lights.Find((obj) => obj.bus_Data.SubnetID == subnetID && obj.bus_Data.DeviceID == deviceID && obj.bus_Data.LoopID == (i + 1)); |
| | | if (light != null) |
| | | { |
| | | if (light.functionType != FunctionType.RGB) |
| | | { |
| | | light.trait_on_off.value = receiveBytes[light.bus_Data.LoopID] == 0 ? "off" : "on"; |
| | | if (light.trait_on_off.value.ToString() == "on") |
| | | { |
| | | light.brightness = receiveBytes[2]; |
| | | light.lastState = Language.StringByID(StringId.Brightness) + " : " + receiveBytes[2] + "%"; |
| | | } |
| | | HomePage.UpdataFunctionStates(light); |
| | | RoomPage.UpdataStates(light); |
| | | FunctionPage.UpdataStates(light); |
| | | ClassificationPage.UpdataInfo(light); |
| | | switch (light.functionType) |
| | | { |
| | | case FunctionType.Relay: |
| | | RelayPage.UpdataState(light); |
| | | break; |
| | | case FunctionType.Dimmer: |
| | | DimmerPage.UpdataStates(light); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var e = DB_ResidenceData.functionList.electricals.Find((obj) => obj.bus_Data.SubnetID == subnetID && obj.bus_Data.DeviceID == deviceID && obj.bus_Data.LoopID == i); |
| | | if (e != null) |
| | | { |
| | | var fan = e as Fan; |
| | | fan.trait_on_off.value = receiveBytes[2] == 0 ? "off" : "on"; |
| | | if (fan.trait_on_off.value.ToString() == "on") |
| | | { |
| | | fan.openLevel = receiveBytes[2]; |
| | | fan.lastState = Language.StringByID(StringId.Level) + " : " + receiveBytes[2]; |
| | | } |
| | | HomePage.UpdataFunctionStates(fan); |
| | | RoomPage.UpdataStates(fan); |
| | | FunctionPage.UpdataStates(fan); |
| | | ClassificationPage.UpdataInfo(fan); |
| | | switch (fan.functionType) |
| | | { |
| | | case FunctionType.Fan: |
| | | FanPage.UpdataState(fan); |
| | | break; |
| | | case FunctionType.Socket: |
| | | |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case Command.SetLogicLoopColorACK: |
| | | case Command.ReadLogicLoopColorACK: |
| | | foreach (var rgb in DB_ResidenceData.functionList.lights) |
| | | { |
| | | if (rgb.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0]) |
| | | { |
| | | if (rgb.functionType == FunctionType.RGB) |
| | | { |
| | | rgb.trait_on_off.value = receiveBytes[1] > 0 ? "on" : "off"; |
| | | if (receiveBytes[1] > 0) |
| | | { |
| | | rgb.brightness = receiveBytes[1]; |
| | | rgb.lastState = Language.StringByID(StringId.Brightness) + " : " + receiveBytes[1] + "%"; |
| | | } |
| | | rgb.redColor = receiveBytes[6]; |
| | | rgb.greenColor = receiveBytes[7]; |
| | | rgb.blueColor = receiveBytes[8]; |
| | | |
| | | HomePage.UpdataFunctionStates(rgb); |
| | | RoomPage.UpdataStates(rgb); |
| | | FunctionPage.UpdataStates(rgb); |
| | | ClassificationPage.UpdataInfo(rgb); |
| | | RGBPage.UpdataStates(rgb); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case Command.SetCurtainModelStutasACK: |
| | | case Command.ReadCurtainStutasACK: |
| | | foreach (var curtain in DB_ResidenceData.functionList.curtains) |
| | | { |
| | | if (curtain.bus_Data.SubnetID == subnetID && curtain.bus_Data.DeviceID == deviceID) |
| | | { |
| | | if (receiveBytes[0] == 17) |
| | | { |
| | | if (receiveBytes[1] > 1) |
| | | { |
| | | curtain.trait_on_off.value = "on"; |
| | | } |
| | | else |
| | | { |
| | | curtain.trait_on_off.value = "off"; |
| | | } |
| | | curtain.percent = receiveBytes[1]; |
| | | curtain.lastState = Language.StringByID(StringId.Open) + curtain.percent + "%"; |
| | | } |
| | | else |
| | | { |
| | | if (curtain.bus_Data.LoopID != receiveBytes[0]) |
| | | continue; |
| | | switch (receiveBytes[1]) |
| | | { |
| | | case 0: |
| | | curtain.trait_on_off.value = "stop"; |
| | | break; |
| | | case 1: |
| | | curtain.trait_on_off.value = "on"; |
| | | curtain.lastState = Language.StringByID(StringId.Open); |
| | | break; |
| | | case 2: |
| | | curtain.trait_on_off.value = "off"; |
| | | curtain.lastState = Language.StringByID(StringId.Close); |
| | | break; |
| | | } |
| | | } |
| | | RoomPage.UpdataStates(curtain); |
| | | FunctionPage.UpdataStates(curtain); |
| | | HomePage.UpdataFunctionStates(curtain); |
| | | ClassificationPage.UpdataInfo(curtain); |
| | | switch (curtain.functionType) |
| | | { |
| | | case FunctionType.Curtain: |
| | | CurtainModulePage.UpdataState(curtain); |
| | | break; |
| | | case FunctionType.MotorCurtain: |
| | | MotorCurtainPage.UpdataState(curtain); |
| | | break; |
| | | case FunctionType.RollingShutter: |
| | | RollingShutterPage.UpdataState(curtain); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case Command.SetACModeACK: |
| | | case Command.ReadACModeACK: |
| | | foreach (var ac in DB_ResidenceData.functionList.aCs) |
| | | { |
| | | if (ac.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0]) |
| | | { |
| | | ac.curTempType = receiveBytes[1]; |
| | | ac.indoorTemp = receiveBytes[2]; |
| | | ac.trait_on_off.value = receiveBytes[8] == 1 ? "on" : "off"; |
| | | ac.curModeIndex = receiveBytes[9]; |
| | | ac.curFanIndex = receiveBytes[10]; |
| | | ac.trait_temp.value = receiveBytes[11]; |
| | | ac.lastState = ""; |
| | | switch (ac.trait_mode.value.ToString()) |
| | | { |
| | | case "cool": |
| | | ac.lastState = Language.StringByID(StringId.Cool); |
| | | break; |
| | | case "heat": |
| | | ac.lastState = Language.StringByID(StringId.Heat); |
| | | break; |
| | | case "dry": |
| | | ac.lastState = Language.StringByID(StringId.Dry); |
| | | break; |
| | | case "auto": |
| | | ac.lastState = Language.StringByID(StringId.Auto); |
| | | break; |
| | | case "fan": |
| | | ac.lastState = Language.StringByID(StringId.AirSupply); |
| | | break; |
| | | } |
| | | switch (ac.trait_fan.value.ToString()) |
| | | { |
| | | case "high": |
| | | ac.lastState += " " + Language.StringByID(StringId.HighWindSpeed); |
| | | break; |
| | | case "medium": |
| | | ac.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed); |
| | | break; |
| | | case "low": |
| | | ac.lastState += " " + Language.StringByID(StringId.LowWindSpeed); |
| | | break; |
| | | case "auto": |
| | | ac.lastState += " " + Language.StringByID(StringId.Auto); |
| | | break; |
| | | } |
| | | ac.lastState += " " + ac.trait_temp.value + ac.tempUnitString; |
| | | RoomPage.UpdataStates(ac); |
| | | FunctionPage.UpdataStates(ac); |
| | | HomePage.UpdataFunctionStates(ac); |
| | | ClassificationPage.UpdataInfo(ac); |
| | | ACPage.UpdataStates(ac); |
| | | } |
| | | } |
| | | break; |
| | | case Command.ReadFloorHeatACK: |
| | | case Command.SetFloorHeatACK: |
| | | foreach (var fh in DB_ResidenceData.functionList.floorHeatings) |
| | | { |
| | | if (fh.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0]) |
| | | { |
| | | fh.curTempType = receiveBytes[2]; |
| | | fh.trait_on_off.value = receiveBytes[1] % 2 == 0 ? "off" : "on"; |
| | | fh.curModeIndex = receiveBytes[3]; |
| | | if (fh.modeTemp.ContainsKey("normal")) |
| | | { |
| | | fh.modeTemp["normal"] = receiveBytes[4]; |
| | | } |
| | | else |
| | | { |
| | | fh.modeTemp.Add("normal", receiveBytes[4]); |
| | | } |
| | | if (fh.modeTemp.ContainsKey("day")) |
| | | { |
| | | fh.modeTemp["day"] = receiveBytes[5]; |
| | | } |
| | | else |
| | | { |
| | | fh.modeTemp.Add("day", receiveBytes[5]); |
| | | } |
| | | if (fh.modeTemp.ContainsKey("night")) |
| | | { |
| | | fh.modeTemp["night"] = receiveBytes[6]; |
| | | } |
| | | else |
| | | { |
| | | fh.modeTemp.Add("night", receiveBytes[6]); |
| | | } |
| | | if (fh.modeTemp.ContainsKey("away")) |
| | | { |
| | | fh.modeTemp["away"] = receiveBytes[7]; |
| | | } |
| | | else |
| | | { |
| | | fh.modeTemp.Add("away", receiveBytes[7]); |
| | | } |
| | | |
| | | switch (fh.trait_mode.value) |
| | | { |
| | | case "normal": |
| | | fh.lastState = Language.StringByID(StringId.Normal); |
| | | fh.trait_temp.value = receiveBytes[4]; |
| | | break; |
| | | case "day": |
| | | fh.lastState = Language.StringByID(StringId.Day); |
| | | fh.trait_temp.value = receiveBytes[5]; |
| | | break; |
| | | case "night": |
| | | fh.lastState = Language.StringByID(StringId.Night); |
| | | fh.trait_temp.value = receiveBytes[6]; |
| | | break; |
| | | case "timer": |
| | | fh.lastState = Language.StringByID(StringId.Auto); |
| | | if (receiveBytes[8] == 0) |
| | | { |
| | | fh.timeFlag = 0; |
| | | fh.trait_temp.value = receiveBytes[5]; |
| | | } |
| | | else |
| | | { |
| | | fh.timeFlag = 1; |
| | | fh.trait_temp.value = receiveBytes[6]; |
| | | } |
| | | break; |
| | | case "away": |
| | | fh.trait_temp.value = receiveBytes[7]; |
| | | fh.lastState = Language.StringByID(StringId.Away); |
| | | break; |
| | | } |
| | | fh.lastState += " " + fh.trait_temp.value + fh.tempUnitString; |
| | | RoomPage.UpdataStates(fh); |
| | | FunctionPage.UpdataStates(fh); |
| | | HomePage.UpdataFunctionStates(fh); |
| | | ClassificationPage.UpdataInfo(fh); |
| | | FloorHeatingPage.UpdataStates(fh); |
| | | } |
| | | } |
| | | break; |
| | | case Command.ReadDeviceLoopInfoACK: |
| | | FunctionType dt = (FunctionType)(11 * 256 + receiveBytes[1]); |
| | | string tag = receiveBytes[1] + "_" + subnetID + "_" + deviceID + "_" + receiveBytes[2]; |
| | | foreach (var sensor in DB_ResidenceData.functionList.sensorsEnvironmentalScience) |
| | | { |
| | | if (sensor.bus_Data != null) |
| | | { |
| | | if ((int)sensor.functionType % 256 == receiveBytes[1] && sensor.bus_Data.SubnetID == subnetID && |
| | | sensor.bus_Data.DeviceID == deviceID && sensor.bus_Data.LoopID == receiveBytes[2]) |
| | | { |
| | | switch (dt) |
| | | { |
| | | case FunctionType.Temp: |
| | | byte[] tempBytes = new byte[] { receiveBytes[24], receiveBytes[25], receiveBytes[26], receiveBytes[27] }; |
| | | sensor.values = Math.Round(BitConverter.ToSingle(tempBytes, 0), 1); |
| | | break; |
| | | case FunctionType.Humidity: |
| | | sensor.values = Convert.ToDouble(receiveBytes[24] * 256 + receiveBytes[25]) / 10; |
| | | break; |
| | | case FunctionType.TVOC: |
| | | sensor.values = Convert.ToDouble(receiveBytes[24] * 256 + receiveBytes[25]) / 100; |
| | | break; |
| | | case FunctionType.PM25: |
| | | sensor.values = Convert.ToInt32(receiveBytes[24] * 256 + receiveBytes[25]); |
| | | break; |
| | | case FunctionType.CO2: |
| | | sensor.values = Convert.ToInt32(receiveBytes[24] * 256 + receiveBytes[25]); |
| | | break; |
| | | } |
| | | EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case Command.New_Analog_Quantity_BROADCAST: |
| | | string tag1 = receiveBytes[1] + "_" + subnetID + "_" + deviceID + "_" + receiveBytes[2]; |
| | | foreach (var sensor in DB_ResidenceData.functionList.sensorsEnvironmentalScience) |
| | | { |
| | | if (sensor.bus_Data != null) |
| | | { |
| | | if ((int)sensor.functionType % 256 == receiveBytes[1] && sensor.bus_Data.SubnetID == subnetID && |
| | | sensor.bus_Data.DeviceID == deviceID && sensor.bus_Data.LoopID == receiveBytes[2]) |
| | | { |
| | | //0保留 1无符号4Byte整形 2有符号4Byte整形 3Float形(代±) |
| | | switch (receiveBytes[3]) |
| | | { |
| | | case 1: |
| | | sensor.values = (receiveBytes[5] * 256 * 256 * 256) + (receiveBytes[6] * 256 * 256) + (receiveBytes[7] * 256) + receiveBytes[8]; |
| | | break; |
| | | case 2: |
| | | sensor.values = -1 * ((receiveBytes[5] * 256 * 256 * 256) + (receiveBytes[6] * 256 * 256) + (receiveBytes[7] * 256) + receiveBytes[8]); |
| | | break; |
| | | case 3: |
| | | byte[] tempBytes = new byte[] { receiveBytes[5], receiveBytes[6], receiveBytes[7], receiveBytes[8] }; |
| | | sensor.values = Math.Round(BitConverter.ToSingle(tempBytes, 0), 1); |
| | | break; |
| | | } |
| | | switch (receiveBytes[4]) |
| | | { |
| | | case 2: |
| | | if (receiveBytes[1] == 5)//TVOC需求除以100000 |
| | | sensor.values /= 100000; |
| | | break; |
| | | } |
| | | EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case Command.InstructionPanelKeyACK: |
| | | case Command.ReadInstructionPanelKeyACK: |
| | | byte reACPanel = 0; |
| | | if (receiveBytes.Length == 2) |
| | | { |
| | | reACPanel = 1; |
| | | } |
| | | else if (receiveBytes.Length == 3) |
| | | { |
| | | reACPanel = receiveBytes[2]; |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | } |
| | | foreach (var ac in DB_ResidenceData.functionList.aCs) |
| | | { |
| | | if (ac.GetBusId() == subnetID + "_" + deviceID + "_" + reACPanel) |
| | | { |
| | | switch (receiveBytes[0]) |
| | | { |
| | | case 3:// |
| | | ac.trait_on_off.value = receiveBytes[1] == 1 ? "on" : "off"; |
| | | break; |
| | | case 4: |
| | | case 7: |
| | | case 8: |
| | | case 19: |
| | | ac.trait_temp.value = receiveBytes[1]; |
| | | break; |
| | | case 5: |
| | | ac.curFanIndex = receiveBytes[1]; |
| | | break; |
| | | case 6: |
| | | ac.curModeIndex = receiveBytes[1]; |
| | | break; |
| | | |
| | | } |
| | | ac.lastState = ""; |
| | | ac.lastState += " " + ac.trait_temp.value + ac.tempUnitString; |
| | | RoomPage.UpdataStates(ac); |
| | | FunctionPage.UpdataStates(ac); |
| | | HomePage.UpdataFunctionStates(ac); |
| | | ClassificationPage.UpdataInfo(ac); |
| | | ACPage.UpdataStates(ac); |
| | | } |
| | | } |
| | | break; |
| | | case Command.ReadPanleTempACK://1944 |
| | | case Command.PanleBroadcastTemp: |
| | | foreach (var ac in DB_ResidenceData.functionList.aCs) |
| | | { |
| | | if (ac.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0]) |
| | | { |
| | | ac.indoorTemp = receiveBytes[1]; |
| | | FunctionPage.UpdataStates(ac); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | MainPage.Log($"Bus Rev Erorr : {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 处理接收回来的数据 |
| | | /// </summary> |
| | | void ManagerReceive(byte subnetID, byte deviceID, Command command, byte[] usefulBytes) |
| | | { |
| | | try |
| | | { |
| | | string receiveFlag = string.Format("{0},{1},{2},", subnetID, deviceID, (int)command); |
| | | |
| | | switch (command) |
| | | { |
| | | case Command.SetSingleLightACK: |
| | | receiveFlag += string.Format("{0}", usefulBytes[0]); |
| | | break; |
| | | case Command.SetLogicLoopColorACK: |
| | | receiveFlag += string.Format("{0},{1},{2}", usefulBytes[0], usefulBytes[1], usefulBytes[2]); |
| | | break; |
| | | case Command.ReadLogicLoopColorACK: |
| | | case Command.ReadACModeACK: |
| | | case Command.SetACModeACK: |
| | | case Command.ReadFloorHeatACK: |
| | | case Command.SetFloorHeatACK: |
| | | receiveFlag += string.Format("{0}", usefulBytes[0]); |
| | | break; |
| | | case Command.ReadLightAllLoopBrightnessACK: |
| | | receiveFlag += ""; |
| | | break; |
| | | case Command.ReadGatewayACK: |
| | | receiveFlag = string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); |
| | | 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.InstructionPanelKeyACK: |
| | | case Command.ReadInstructionPanelKeyACK: |
| | | receiveFlag += string.Format("{0},{1}", usefulBytes[0], usefulBytes[1]); |
| | | break; |
| | | case Command.ReadRemark: |
| | | DriverLayer.Control.ins.myUdp.ReceiveReadRemark(usefulBytes); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | DriverLayer.Control.ins.myUdp.ReceiveRepeatManager(receiveFlag); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | MainPage.Log("ManagerReceive抛出异常:" + ex.ToString()); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | } |