using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Common; using Domain; using RCUHost.Protocols; using CommonEntity; namespace RCUHost.Implement { public class DeviceControlReceiver : GenericReceiverBase, IDeviceControlReceiver { private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(DeviceControlReceiver)); public void Send(Host host, Device device) { Send(host, new List { device }); } public void Send(Host host, IList devices) { var data = CreateDeviceControlPacket(devices); SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); //需要在这里添加代码 //StringBuilder builder = new StringBuilder(); //for (int i = 0; i < data.Length; i++) //{ // builder.Append(string.Format("{0:X2} ", data[i])); //} //string nnn = builder.ToString().Trim(); //logger.Error(string.Format("给酒店({0})客房({1})发送控制命令{2}", host.SysHotel.Code, host.RoomNumber,builder.ToString())); } public void Send_Repeat(string Key,Host host, Device device) { Send_Repeat(Key,host, new List { device }); } public void Send_Repeat(string PrefixKey, Host host, IList devices) { try { StringBuilder sb = new StringBuilder(); sb.Append(CacheKey.SendDataRepeatKey); sb.Append("_"); sb.Append(PrefixKey); string SingleKey = sb.ToString(); var data = CreateDeviceControlPacket(devices); //AA 55 11 00 54 33 53 41 0F //80 2E 2C 08 0E BD //8F CF byte[] store_xuhao = null; var obj = MemoryCacheHelper.Get(SingleKey); if (obj != null) { store_xuhao = (byte[])obj; data[9] = store_xuhao[0]; data[10] = store_xuhao[1]; } else { var xuhao = data.Skip(9).Take(2); MemoryCacheHelper.Set(SingleKey, xuhao.ToArray()); } SendAndPushCommandQueue(data, host.HostNumber, host.MAC);// host.IP, host.Port); } catch (Exception) { } //需要在这里添加代码 //StringBuilder builder = new StringBuilder(); //for (int i = 0; i < data.Length; i++) //{ // builder.Append(string.Format("{0:X2} ", data[i])); //} //string nnn = builder.ToString().Trim(); //logger.Error(string.Format("给酒店({0})客房({1})发送控制命令{2}", host.SysHotel.Code, host.RoomNumber,builder.ToString())); } public override void Process(ReceiverContext context) { } public byte[] CreateDeviceControlPacket(IList devices) { SystemHeader systemHeader = CreateSystemHeader(); byte[] deviceControlDataPacket = CreateDeviceControlDataPacket(devices); int size = StructConverter.SizeOf(systemHeader) + deviceControlDataPacket.Length + 2; systemHeader.FrameLength = (ushort)size; using (MemoryStream stream = new MemoryStream(size)) { using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(StructConverter.StructToBytes(systemHeader)); writer.Write(deviceControlDataPacket); writer.Write(new byte[] { 0, 0 }); return stream.ToArray(); } } } public byte[] CreateDeviceControlDataPacket(IList devices) { using (MemoryStream buffer = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(buffer)) { writer.Write((byte)devices.Count);//数量 foreach (var device in devices) { switch (device.AddressType) { case AddressType.DeviceAddress: //根据新的A6主机调整 Modified By Jophy Wu on 20180704 //先把继电器、扩展板、调光、可控硅和灯带加上去,其他几个设备可以走之前的协议 writer.Write(DeviceAddress.Parse(device.Address).GetBytes());//地址 //判断设备类型,对应输出类型(方式1字节+内容1字节) switch (device.Type) { case DeviceType.Relay://主机继电器 case DeviceType.Expand://扩展继电器 case DeviceType.ServiceInfo://服务信息 case DeviceType.Curtain://窗帘 case DeviceType.WXLock://微信锁 case DeviceType.SwitchExpand://开关扩展 case DeviceType.A9IORelay://A9IO继电器 case DeviceType.CardPower://插卡取电 case DeviceType.InFrared://红外感应 case DeviceType.PB20_RELAY: writer.Write(device.Status);//1开,2关 writer.Write((byte)0); break; case DeviceType.Dimmer://LED调光 case DeviceType.Traic://可控硅调光 case DeviceType.Strip://灯带调光 case DeviceType.PWMDimmer://PWM调光 case DeviceType.PWMExpand://PWM扩展 case DeviceType.PBLED://PB LED case DeviceType.LVout://弱电输出 case DeviceType.PB20: case DeviceType.PB20_LD: case DeviceType.PB20_LS: writer.Write(device.Status); writer.Write(device.Brightness); break; case DeviceType.AirConditioner://空调 byte[] airExecMode = Tools.Int32ToByte2(device.AirExecMode); foreach (byte b in airExecMode) { writer.Write(b); } break; case DeviceType.FloorHot://地暖 byte[] floorHotExecMode = Tools.Int32ToByte2(device.FloorHotExecMode); foreach (byte b in floorHotExecMode) { writer.Write(b); } break; case DeviceType.Music://音乐 byte[] musicExecMode = Tools.Int32ToByte2(device.MusicExecMode); foreach (byte b in musicExecMode) { writer.Write(b); } break; case DeviceType.TV://电视 writer.Write(device.Status);//1开,2关,3匹配,4频道。 switch (device.Status) { case 0x03://status==3时:1空调,2电视 break; case 0x04://status==4时:1~255频道 writer.Write(device.Valve); break; default://功能:1~15,只是开关时,内容是0 writer.Write(device.Mode); break; } break; case DeviceType.ColorTemp://色溫 writer.Write(device.Status); switch (device.Status) { case 3: writer.Write(device.Temperature);//0~100 break; default: writer.Write(device.Brightness); break; } break; default: //其他走以前的协议 writer.Write((byte)device.AddressType);//地址类型 writer.Write(device.Status);//状态 break; } break; case AddressType.GroupAddress://指令场景 writer.Write((byte)0);//设备类型1字节 writer.Write(GroupAddress.Parse(device.Address).GetBytes());//地址 writer.Write(device.Status);//1开,2关 writer.Write((byte)0); break; } } return buffer.ToArray(); } } } public override CommandType CommandType { get { return CommandType.DeviceControl; } } } }