Newer
Older
SensorHub / SensorHub.LampNB / ConfigBuild.cs
root on 17 Sep 2021 13 KB first commit
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;
        }
    }
}