using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using Common; using Dao; using Domain; using RCUHost.Protocols; namespace RCUHost.Implement { public class AirConditionStatusReceiver : GenericReceiverBase, IAirConditionStatusReceiver { public IHostRepository HostRepository { get; set; } public IHostAirRepository HostAirRepository { get; set; } /// /// 应用空调设置 /// /// public void SendAirConditionSetting(HostAir hostAir, Host host) { byte[] data = CreateAirConditionSettingDataPacket(hostAir); SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); } /// /// 空调单个属性下发 /// /// /// /// /// /// 季节数据 public void SetAirProperty(Host host, int airNo, AirProperty property, int status, byte[] seasonData = null) { if (property == AirProperty.CompensatoryTemp || property == AirProperty.LockTemp || property == AirProperty.SleepMode || property == AirProperty.Time) { throw new ApplicationException("无效的属性值,请使用对应方法设置。"); } byte[] statusData = new byte[1]; if (property == AirProperty.Season) { statusData = new byte[12]; statusData = seasonData; } else { statusData[0] = (byte)status; } var data = CreateAirPropertyDataPacket(airNo, property, statusData); SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); } /// /// 设置空调补偿温度 /// /// /// /// public void SetCompensatoryTemp(Host host, int airNo, float compensatoryTemp) { byte[] statusData = new byte[1]; statusData[0] = ConvertCompensatoryTempToHost(compensatoryTemp); var data = CreateAirPropertyDataPacket(airNo, AirProperty.CompensatoryTemp, statusData); SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); } /// /// 设置空调锁定温度 /// /// /// /// /// public void SetLockTemp(Host host, int airNo, bool isLock, int lockTemp) { byte[] statusData = new byte[2]; statusData[0] = (byte)(isLock ? 1 : 0); statusData[1] = (byte)lockTemp; var data = CreateAirPropertyDataPacket(airNo, AirProperty.LockTemp, statusData); SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); } /// /// 设置空调睡眠模式 /// /// /// /// /// /// /// public void SetSleepMode(Host host, int airNo, bool sleepFlag, int sleepDevition, string sleepStartTime, string sleepEndTime) { using (MemoryStream stream = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(sleepFlag); writer.Write((byte)sleepDevition); writer.Write(ConvertTimeToBytes(sleepStartTime)); writer.Write(ConvertTimeToBytes(sleepEndTime)); var data = CreateAirPropertyDataPacket(airNo, AirProperty.SleepMode, stream.ToArray()); SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); } } } /// /// 设置空调定时设置 /// /// /// /// /// /// /// /// /// /// public void SetTimeSetting(Host host, int airNo, bool timeFlag, string startTime1, string endTime1, string startTime2, string endTime2, string startTime3, string endTime3) { using (MemoryStream stream = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(timeFlag); writer.Write(ConvertTimeToBytes(startTime1)); writer.Write(ConvertTimeToBytes(endTime1)); writer.Write(ConvertTimeToBytes(startTime2)); writer.Write(ConvertTimeToBytes(endTime2)); writer.Write(ConvertTimeToBytes(startTime3)); writer.Write(ConvertTimeToBytes(endTime3)); var data = CreateAirPropertyDataPacket(airNo, AirProperty.Time, stream.ToArray()); SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); } } } public override CommandType CommandType { get { return CommandType.AirConditionStatus; } } #region Private Methods private byte[] CreateAirConditionSettingDataPacket(HostAir hostAir) { SystemHeader systemHeader = CreateSystemHeader(); AirConditionSettingPacket airConditionSettingPacket = CreateAirConditionSettingPacket(hostAir); int size = StructConverter.SizeOf(systemHeader) + StructConverter.SizeOf(airConditionSettingPacket); systemHeader.FrameLength = (ushort)size; byte[] buffer = new byte[size]; byte[] src1 = StructConverter.StructToBytes(systemHeader); Array.Copy(src1, 0, buffer, 0, src1.Length); byte[] src3 = StructConverter.StructToBytes(airConditionSettingPacket); Array.Copy(src3, 0, buffer, src1.Length, src3.Length); return buffer; } /// /// 创建 AirConditionSettingPacket /// /// /// private AirConditionSettingPacket CreateAirConditionSettingPacket(HostAir hostAir) { AirConditionSettingPacket packet = new AirConditionSettingPacket(); packet.AirNo = Convert.ToByte(hostAir.Modal.ModalType.ID); packet.OnOff = Convert.ToByte(hostAir.OnOff); packet.SettingTemp = Convert.ToByte(hostAir.SettingTemp); packet.CompensatoryTemp = ConvertCompensatoryTempToHost(hostAir.CompensatoryTemp); packet.Speed = Convert.ToByte(hostAir.Speed); packet.Mode = Convert.ToByte(hostAir.Mode); packet.IsLockTemp = Convert.ToByte(hostAir.IsLockTemp); packet.LockTemp = Convert.ToByte(hostAir.LockTemp); packet.KeepTemp = Convert.ToByte(hostAir.KeepTemp); packet.InitTemp = Convert.ToByte(hostAir.InitTemp); packet.HighTemp = Convert.ToByte(hostAir.HightTemp); packet.LowerTemp = Convert.ToByte(hostAir.LowerTemp); packet.ColdHotSwitchDelayTime = Convert.ToByte(hostAir.ColdHotSwitchDelayTime); packet.ColdHotMode = Convert.ToByte(hostAir.ColdHotMode); packet.DeadTemp = Convert.ToByte(hostAir.DeadTemp); packet.HotDevition = Convert.ToByte(hostAir.HotDevition); packet.ColdDevition = Convert.ToByte(hostAir.ColdDevition); packet.WelcomeTime = Convert.ToByte(hostAir.WelcomeTime); packet.RelateRoomStatus = Convert.ToByte(hostAir.RelateRoomStatus); packet.RelateDoorContact = Convert.ToByte(hostAir.RelateDoorContact); packet.FanStop = Convert.ToByte(hostAir.FanStop); packet.DisableFanHighSpeed = Convert.ToByte(hostAir.DisableFanHighSpeed); packet.SleepFlag = Convert.ToByte(hostAir.SleepFlag); packet.SleepStartTime = ConvertTimeToBytes(hostAir.SleepStartTime); packet.SleepEndTime = ConvertTimeToBytes(hostAir.SleepEndTime); packet.SleepDevition = Convert.ToByte(hostAir.SleepDevition); packet.TimeFlag = Convert.ToByte(hostAir.TimeFlag); packet.TimeStartTime1 = ConvertTimeToBytes(hostAir.TimeStartTime1); packet.TimeEndTime1 = ConvertTimeToBytes(hostAir.TimeEndTime1); packet.TimeStartTime2 = ConvertTimeToBytes(hostAir.TimeStartTime2); packet.TimeEndTime2 = ConvertTimeToBytes(hostAir.TimeEndTime2); packet.TimeStartTime3 = ConvertTimeToBytes(hostAir.TimeStartTime3); packet.TimeEndTime3 = ConvertTimeToBytes(hostAir.TimeEndTime3); return packet; } private byte[] CreateAirPropertyDataPacket(int airNo, AirProperty perperty, byte[] data) { if(data == null || data.Length == 0) { throw new ArgumentNullException("data"); } using (MemoryStream stream = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(stream)) { int headerSize = StructConverter.SizeOf(typeof(SystemHeader)); stream.Seek(headerSize, SeekOrigin.Begin); writer.Write((byte)airNo); //空调号 writer.Write((byte)perperty); //空调属性 writer.Write(data); //属性值 writer.Write(new byte[] { 0, 0 }); //CRC16校验 var systemHeader = CreateSystemHeader(CommandType.AirProperty, (int)stream.Length - headerSize); var headerData = StructConverter.StructToBytes(systemHeader); stream.Seek(0, SeekOrigin.Begin); writer.Write(headerData); return stream.ToArray(); } } } /// /// 转换时间到字节数组 /// 例如: /// 12:05 => byte0=12, byte1=05 /// /// private byte[] ConvertTimeToBytes(string time) { byte[] bytes = new byte[] { 0, 0 }; if (!String.IsNullOrEmpty(time)) { string[] temp = time.Split(':'); bytes[0] = Convert.ToByte(temp[0]); bytes[1] = Convert.ToByte(temp[1]); } return bytes; } /// /// 将补偿温度转换为主机存储格式 /// 具体格式参见协议 /// /// /// private byte ConvertCompensatoryTempToHost(float temp) { byte val = Convert.ToByte(Math.Floor(Math.Abs(temp * 10))); if (temp < 0) { return (val |= 0x80); } return val; } #endregion } }