Example #1
0
        /// <summary>
        /// 03H	N(4) 10H
        /// 从机状态 2字节
        /// 示例:03 10 00 1F
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static DeviceState State(byte[] data)
        {
            byte[] temp = BytesUtil.SubBytes(data, 2, 2);

            int[] arr = BytesUtil.ToBinaryArray(temp);

            if (arr == null)
            {
                return(null);
            }

            Array.Reverse(arr);

            DeviceState state = new DeviceState()
            {
                RelayOne         = arr[0],
                RelayTwo         = arr[1],
                HumidityAlarm    = arr[2],
                TemperatureAlarm = arr[3],
                Dehumidify       = arr[4],
                Intermission     = arr[5]
            };

            return(state);
        }
Example #2
0
        /// <summary>
        /// E0H	N(10) E0H
        /// 观测时间,数据定义固定E0H,BCD码,5字节
        /// 示例:E0 E0 16 12 12 08 59
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static DateTime DataTime(byte[] data)
        {
            try
            {
                byte[] temp = BytesUtil.SubBytes(data, 2, 5);

                string[]      strs = new string[6];
                StringBuilder sb   = new StringBuilder(2);

                for (int i = 0; i < 5; i++)
                {
                    sb.Append(temp[i] >> 4);
                    sb.Append(temp[i] & 0x0f);
                    strs[i] = sb.ToString();
                    sb.Clear();
                }

                string timeStr = string.Format(DateTimePattern, strs);

                return(Convert.ToDateTime(timeStr));
            }
            catch (Exception)
            {
                return(DateTime.Now);
            }
        }
Example #3
0
        private byte[] Decode(byte[] data, ref B3Element element)
        {
            if (data.Length == 0 || !Enum.IsDefined(typeof(DecodeType), data[0]))
            {
                IsChecked = false; return(new byte[0]);
            }

            int length = GetLength(data[0]);

            if (length == 0 || data.Length < length)
            {
                IsChecked = false; return(new byte[0]);
            }

            switch ((DecodeType)data[0])
            {
            case DecodeType.CenterCode:
                element.CenterCode = ElementDecodeFunctions.CenterCode(data);
                break;

            case DecodeType.ClientCode:
                element.ClientCode = ElementDecodeFunctions.ClientCode(data);
                break;

            case DecodeType.IPPort:
                element.IPPort = ElementDecodeFunctions.IPPort(data);
                break;

            case DecodeType.Interval:
                element.Interval = ElementDecodeFunctions.Interval(data);
                break;
            }

            return(BytesUtil.SubBytes(data, length));
        }
Example #4
0
        /// <summary>
        /// 湿度 01H	 N(5,2)	1AH 百分比
        /// 温度 02H	 N(5,2)	1AH	摄氏度
        /// 湿度阈值 04H	 N(5,2)	1AH	百分比
        /// 温度阈值 05H	 N(5,2)	1AH	摄氏度
        /// 温湿度/温湿度阈值,BCD码,3字节
        /// 示例:01 1A 00 88 66 02 1A 00 12 34
        ///      04 1A 00 55 66 05 1A 00 66 55
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static double Humiture(byte[] data)
        {
            byte[] temp = BytesUtil.SubBytes(data, 2, 3);

            string bcdStr = BCDUtil.ConvertTo(temp);

            return(Convert.ToInt64(bcdStr) / 100.0);
        }
Example #5
0
        private byte[] Decode(byte[] data, ref Element element)
        {
            if (data.Length == 0 || !Enum.IsDefined(typeof(DecodeType), data[0]))
            {
                return(new byte[0]);
            }

            int length = GetLength(data[0]);

            if (length == 0 || data.Length < length)
            {
                return(new byte[0]);
            }

            switch ((DecodeType)data[0])
            {
            case DecodeType.Code:
                element.Code = ElementDecodeFunctions.Code(data);
                break;

            case DecodeType.Humidity:
                element.Humidity = ElementDecodeFunctions.Humiture(data);
                break;

            case DecodeType.Temperature:
                element.Temperature = ElementDecodeFunctions.Humiture(data);
                break;

            case DecodeType.State:
                element.State = ElementDecodeFunctions.State(data);
                break;

            case DecodeType.HumidityLimit:
                element.HumidityLimit = ElementDecodeFunctions.Humiture(data);
                break;

            case DecodeType.TemperatureLimit:
                element.TemperatureLimit = ElementDecodeFunctions.Humiture(data);
                break;
            }

            return(BytesUtil.SubBytes(data, length));
        }
Example #6
0
        public List <Element> ReadAll()
        {
            List <Element> list = new List <Element>();

            do
            {
                //如果数据头不是主从机地址,则取消解析
                if (!(LeftData[0].Equals((byte)DecodeType.Code) && LeftData[1].Equals(0x08)))
                {
                    break;
                }

                Element element = Read(LeftData);

                list.Add(element);

                LeftData = BytesUtil.SubBytes(LeftData, element.DataLength);
            } while (LeftData.Length > 0);

            return(list);
        }
Example #7
0
        public RecieveMessage Read()
        {
            RecieveMessage message = new RecieveMessage();

            message.Content      = BytesUtil.ToHexString(BaseDecode.Data);
            message.CenterCode   = CenterCode();
            message.ClientCode   = ClientCode();
            message.SendTime     = SendTime();
            message.Serial       = Serial();
            message.FunctionCode = FunctionCode();
            message.DataLength   = DataLength();
            message.CRC          = CRC(message.DataLength + 21);
            message.IsChecked    = false;

            //只有数据主体起始符和结束符位置都正确,才会继续解析数据主体
            if (!BaseDecode.IsChecked)
            {
                return(message);
            }

            //心跳包不进行解析
            if (!message.FunctionCode.Equals("F2"))
            {
                byte[] bodyData = Body(message.DataLength);
                message.Body = bodyData;

                //如果是召测数据或者客户端自报数据,数据主体以采集时间开头,截取后在进行解码
                if (message.FunctionCode.Equals("B0") || message.FunctionCode.Equals("C0"))
                {
                    message.DataTime = DataTime(bodyData);
                    //如果不是以E0E0开头,则说明包体内容错误,无需向下解析
                    if (!BaseDecode.IsChecked)
                    {
                        return(message);
                    }
                    bodyData = BytesUtil.SubBytes(bodyData, 7);
                }

                if (message.FunctionCode.Equals("B3"))
                {
                    ElementB3Decode b3Decode = new ElementB3Decode(bodyData);
                    message.Data = b3Decode.Read();
                }
                else
                {
                    ElementDecode  decode   = new ElementDecode(bodyData);
                    List <Element> dataList = decode.ReadAll();

                    if (message.FunctionCode.Equals("B0") || message.FunctionCode.Equals("C0"))
                    {
                        message.Data = dataList.Select(q => new B0C0Element(q)).ToList();
                    }
                    else if (message.FunctionCode.Equals("B1"))
                    {
                        message.Data = dataList.Select(q => new B1Element(q)).ToList();
                    }
                    else if (message.FunctionCode.Equals("B2"))
                    {
                        message.Data = dataList.Select(q => new B2Element(q)).ToList();
                    }
                }
            }

            bool isChecked = BaseDecode.IsChecked;

            //如果以上都通过,则校验最后的CRC码
            if (isChecked)
            {
                isChecked = BaseDecode.CheckCRC(message.CRC, message.DataLength + 21);
            }

            message.IsChecked = isChecked;

            return(message);
        }