using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SensorHub.LampNBServer { public class ConfigBuild { //public static byte[] buildQueryFrame(String devCode) //{ // byte[] frame = { 0xA3, 0x20, // 0x00, 0x10, //长度 // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //设备编号 // 0x00, //通信方式 // 0x00, 0x00, //目标节点地址 // 0x01, 0x00, //PDUType // 0x01, //Seq // 0x20, 0x00, 0x00, 0x01 //服务器实时查询数据指令 // }; // byte[] btDevCode = strToHexByte(devCode); // btDevCode.CopyTo(frame, 4); // Array.Copy(btDevCode, 4, frame, 11, 2); // frame[14] = getDevTypeByDevCode(devCode); // return frame; //} public static byte[] buildConfigFrame(String devCode, String configItem) { byte[] frame = { 0xA3, 0x20, 0x00, 0x00, //长度 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //设备编号 0x03, //通信方式 0x00, 0x00, //目标节点地址 0x03, 0x00, //PDUType 0x01 //Seq }; byte[] btDevCode = strToHexByte(devCode); btDevCode.CopyTo(frame, 4); Array.Copy(btDevCode, 4, frame, 11, 2); if (devCode.Substring(0, 2) == "72") //灯箱控制器 { frame[14] = 0x91; } else//单灯控制器 { frame[14] = 0x90; } byte[] configTag = getConfigTag(configItem); int length = frame.Length + configTag.Length; byte[] config = new byte[length]; frame.CopyTo(config, 0); configTag.CopyTo(config, frame.Length); byte[] btLens = new byte[2];//数据帧长度 byte[] btlens0 = BitConverter.GetBytes(length - 4); btLens[0] = btlens0[1]; btLens[1] = btlens0[0]; btLens.CopyTo(config, 2); return config; } //获取配置tag private static byte[] getConfigTag(String configItem) { byte[] result = new byte[256]; int flag = 0; if (string.IsNullOrEmpty(configItem)) { return new byte[0]; } ConfigItems configItems = JsonConvert.DeserializeObject<ConfigItems>(configItem); if (configItems.collectStartTime != null) { //数据采集起始时间 0x10000104 0002 byte[] tag = { 0x10, 0x00, 0x01, 0x04, 0x00, 0x02, 0x00, 0x00 }; byte[] value = BitConverter.GetBytes((ushort)configItems.collectStartTime); Array.Reverse(value); value.CopyTo(tag, 6); tag.CopyTo(result, flag); flag += 8; } if (configItems.collectCycle != null) { //数据采集间隔 0x10000105 byte[] tag = { 0x10, 0x00, 0x01, 0x05, 0x00, 0x02, 0x00, 0x00 }; byte[] value = BitConverter.GetBytes((ushort)configItems.collectCycle); Array.Reverse(value); value.CopyTo(tag, 6); tag.CopyTo(result, flag); flag += 8; } if (configItems.collectCnt != null) { //数据上报次数 0x10000106 byte[] tag = { 0x10, 0x00, 0x01, 0x06, 0x00, 0x02, 0x00, 0x00 }; byte[] value = BitConverter.GetBytes((ushort)configItems.collectCnt); Array.Reverse(value); value.CopyTo(tag, 6); tag.CopyTo(result, flag); flag += 8; } if (configItems.elecMinAlarm != null) { //电流报警下限 0x10000900 byte[] oid = { 0x10, 0x00, 0x09, 0x00 }; byte[] tag = getFloatChannelsTag(oid, configItems.elecMinAlarm); tag.CopyTo(result, flag); flag += tag.Length; } if (configItems.elecMaxAlarm != null) { //电流报警上限 0x10000901 byte[] oid = { 0x10, 0x00, 0x09, 0x01 }; byte[] tag = getFloatChannelsTag(oid, configItems.elecMaxAlarm); tag.CopyTo(result, flag); flag += tag.Length; } if (configItems.voltMinAlarm != null) { //电压报警下限 0x10000902 byte[] oid = { 0x10, 0x00, 0x09, 0x02 }; byte[] tag = getFloatChannelsTag(oid, configItems.voltMinAlarm); tag.CopyTo(result, flag); flag += tag.Length; } if (configItems.voltMaxAlarm != null) { //电压报警上限 0x10000903 byte[] oid = { 0x10, 0x00, 0x09, 0x03 }; byte[] tag = getFloatChannelsTag(oid, configItems.voltMaxAlarm); tag.CopyTo(result, flag); flag += tag.Length; } if (configItems.channelOpenTime != null) { //各通道开启时间 0x10000201 byte[] oid = { 0x10, 0x00, 0x02, 0x01 }; byte[] tag = getU16ChannelsTag(oid, configItems.channelOpenTime); tag.CopyTo(result, flag); flag += tag.Length; } if (configItems.channelCloseTime != null) { //各通道关闭时间 0x10000202 byte[] oid = { 0x10, 0x00, 0x02, 0x02 }; byte[] tag = getU16ChannelsTag(oid, configItems.channelCloseTime); tag.CopyTo(result, flag); flag += tag.Length; } if (configItems.setParameters != null) { //调光参数 0x10000205 byte[] tag = { 0x10, 0x00, 0x02, 0x05, 0x00, 0x01, 0x00 }; byte value = Convert.ToByte((byte)configItems.setParameters); tag[6] = value; tag.CopyTo(result, flag); flag += 7; } if (configItems.remoteControl != null) { //开关控制 0x50000001 byte[] oid = { 0x50, 0x00, 0x00, 0x01 }; byte[] tag = getByteChannelsTag(oid, configItems.remoteControl); tag.CopyTo(result, flag); flag += tag.Length; } //if (configItems.dataRequest != null) //{ // //数据查询 0x20000001 // byte[] tag = { 0x20, 0x00, 0x00, 0x01 }; // tag.CopyTo(result, flag); // flag += 4; //} return result.Take(flag).ToArray(); } //多通道tag,值为float private static byte[] getFloatChannelsTag(byte[] oid, Channels channels) { byte[] tag = new byte[22]; oid.CopyTo(tag, 0); ushort num = 0; if (!String.IsNullOrEmpty(channels.channel1)) { byte[] value1 = BitConverter.GetBytes(float.Parse(channels.channel1)); value1.CopyTo(tag, 6); num++; if (!String.IsNullOrEmpty(channels.channel2)) { byte[] value2 = BitConverter.GetBytes(float.Parse(channels.channel2)); value2.CopyTo(tag, 10); num++; if (!String.IsNullOrEmpty(channels.channel3)) { byte[] value3 = BitConverter.GetBytes(float.Parse(channels.channel3)); value3.CopyTo(tag, 14); num++; if (!String.IsNullOrEmpty(channels.channel4)) { byte[] value4 = BitConverter.GetBytes(float.Parse(channels.channel4)); value4.CopyTo(tag, 18); num++; } } } } byte[] length = BitConverter.GetBytes((ushort)(num * 4)); Array.Reverse(length); length.CopyTo(tag, 4); return tag.Take(6 + num * 4).ToArray(); } //多通道tag,值为ushort private static byte[] getU16ChannelsTag(byte[] oid, Channels channels) { byte[] tag = new byte[14]; oid.CopyTo(tag, 0); ushort num = 0; if (!String.IsNullOrEmpty(channels.channel1)) { byte[] value1 = BitConverter.GetBytes(ushort.Parse(channels.channel1)); Array.Reverse(value1); value1.CopyTo(tag, 6); num++; if (!String.IsNullOrEmpty(channels.channel2)) { byte[] value2 = BitConverter.GetBytes(ushort.Parse(channels.channel2)); Array.Reverse(value2); value2.CopyTo(tag, 8); num++; if (!String.IsNullOrEmpty(channels.channel3)) { byte[] value3 = BitConverter.GetBytes(ushort.Parse(channels.channel3)); Array.Reverse(value3); value3.CopyTo(tag, 10); num++; if (!String.IsNullOrEmpty(channels.channel4)) { byte[] value4 = BitConverter.GetBytes(ushort.Parse(channels.channel4)); Array.Reverse(value4); value4.CopyTo(tag, 12); num++; } } } } byte[] length = BitConverter.GetBytes((ushort)(num * 2)); Array.Reverse(length); length.CopyTo(tag, 4); return tag.Take(6 + num * 2).ToArray(); } //多通道tag,值为byte private static byte[] getByteChannelsTag(byte[] oid, Channels channels) { byte[] tag = new byte[8]; oid.CopyTo(tag, 0); byte[] value = { 0xFF, 0xFF }; if (!String.IsNullOrEmpty(channels.channel1)) { byte value1 = byte.Parse(channels.channel1, System.Globalization.NumberStyles.HexNumber); value[1] &= (byte)((value1 << 0) | 0xF0); } if (!String.IsNullOrEmpty(channels.channel2)) { byte value2 = byte.Parse(channels.channel2, System.Globalization.NumberStyles.HexNumber); value[1] &= (byte)((value2 << 4) | 0x0F); } if (!String.IsNullOrEmpty(channels.channel3)) { byte value3 = byte.Parse(channels.channel3, System.Globalization.NumberStyles.HexNumber); value[0] &= (byte)((value3 << 0) | 0xF0); } if (!String.IsNullOrEmpty(channels.channel4)) { byte value4 = byte.Parse(channels.channel4, System.Globalization.NumberStyles.HexNumber); value[0] &= (byte)((value4 << 4) | 0x0F); } value.CopyTo(tag,6); tag[5] = 0x02; return tag; } public static byte[] buildQueryFrame(String devCode) { byte[] frame = { 0xA3, 0x20, 0x00, 0x10, //长度 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //设备编号 0x03, //通信方式 0x00, 0x00, //目标节点地址 0x01, 0x00, //PDUType 0x01, //Seq 0x20, 0x00, 0x00, 0x01 //服务器实时查询数据指令 }; byte[] btDevCode = strToHexByte(devCode); btDevCode.CopyTo(frame, 4); Array.Copy(btDevCode, 4, frame, 11, 2); if (devCode.Substring(0, 2) == "72") //灯箱控制器 { frame[14] = 0x91; } else//单灯控制器 { frame[14] = 0x90; } return frame; } /// <summary> /// 字符串转16进制字节数组 /// </summary> /// <param name="hexString"></param> /// <returns></returns> private static byte[] strToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += "0"; byte[] returnBytes = new byte[hexString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } } }