Files
Web_CRICS_Server_VS2010_Prod/RCUHost/Implement/DeviceControlReceiver.cs
2025-12-11 09:17:16 +08:00

228 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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> { device });
}
public void Send(Host host, IList<Device> 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> { device });
}
public void Send_Repeat(string PrefixKey, Host host, IList<Device> 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<Device> 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<Device> 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; }
}
}
}