/// <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); }
/// <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); } }
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)); }
/// <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); }
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)); }
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); }
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); }