using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using IStation.Untity; using IStation.Model; using SuperSocket.Server; using SuperSocket; using IStation.DataDockingSocket; namespace IStation.Server { /// /// 接收信息辅助类 /// internal class RequestReceivedHelper { //接收数据 public static async ValueTask Receive(IAppSession session, PackageInfo packageInfo) { await Task.Run(async () => { if (packageInfo == null) { SZJTKTLogHelper.Error(" packageInfo is null"); return; } var bytes = packageInfo.Body; if (!Valid(bytes)) { SZJTKTLogHelper.Error(" bytes Validation failed!"); return; } var appParas = AppParasHelper.Get(); if (appParas == null || appParas.RuleItems == null) { SZJTKTLogHelper.Error(" json is null"); return; } var byte4 = new byte[4]; //数据读取日期 Array.Copy(bytes, 13, byte4, 0, 4); var date = Bytes2Int4(byte4); //数据读取时间 Array.Copy(bytes, 17, byte4, 0, 4); var time = Bytes2Int4(byte4); var hmsStr = time.ToString(); if (hmsStr.Length < 6) hmsStr = "0" + hmsStr; var hms = hmsStr.Substring(0, 2) + ":" + hmsStr.Substring(2, 2) + ":" + hmsStr.Substring(4, 2); var strTime = $"{date} {hms}"; DateTime dataTime = DateTime.ParseExact(strTime.ToString(), "yyyyMMdd hh:mm:ss", System.Globalization.CultureInfo.CurrentCulture); var list = new List(); foreach (var x in appParas.RuleItems) { var record = new Model.MonitorDataDockingSrcRecord(); record.SignId = x.SignId; record.RecordType = Model.eMonitorType.General; record.SrcTime = dataTime; record.SrcValue = null; switch (x.Rule) { case eRule.Double: { var btValue = bytes.Skip((x.Index - 1)).Take(x.Size).ToArray(); record.SrcValue = Bytes2Double(btValue).ToString(); } break; case eRule.Int4: { var btValue = bytes.Skip((x.Index - 1)).Take(x.Size).ToArray(); record.SrcValue = Bytes2Int4(btValue).ToString(); } break; case eRule.Int32: { var btValue = bytes.Skip((x.Index - 1)).Take(x.Size).ToArray(); record.SrcValue = Bytes2Int32(btValue).ToString(); } break; default: break; } list.Add(record); } }); } //验证 private static bool Valid(byte[] bytes) { SZJTKTLogHelper.Info($"字节长度:{bytes.Count()}"); if (bytes == null || bytes.Count() < 1) return false; var bytePrefix = new byte[8]; Array.Copy(bytes, 0, bytePrefix, 0, 8); var prefix = Encoding.ASCII.GetString(bytePrefix); SZJTKTLogHelper.Info($"前缀:{prefix}"); if (prefix != Settings.Transfer.SZJTKT.Prefix) return false; byte[] byteProductID = new byte[4]; Array.Copy(bytes, 9, byteProductID, 0, 4); var productId = Bytes2Int4(byteProductID); SZJTKTLogHelper.Info($"设备编号:{productId}"); if (productId.ToString() != Settings.Transfer.SZJTKT.ProductId) return false; return true; } /// /// 处理数据 /// public static List HandleData ( byte[] bts ) { var list = new List(); //将指令转化为字节数组 var instrution_bts = bts; var byte4 = new byte[4]; var byte2 = new byte[2]; var byte1 = new byte[1]; //数据读取日期 Array.Copy(instrution_bts, 13, byte4, 0, 4); var date = Bytes2Int4(byte4); //数据读取时间 Array.Copy(instrution_bts, 17, byte4, 0, 4); var time = Bytes2Int4(byte4); var hms = time.ToString(); if (hms.Length < 6) hms = "0" + hms; var ttt = hms.Substring(0, 2) + ":" + hms.Substring(2, 2) + ":" + hms.Substring(4, 2); var strTime = $"{date} {ttt}"; DateTime dataTime = DateTime.ParseExact(strTime.ToString(), "yyyyMMdd hh:mm:ss", System.Globalization.CultureInfo.CurrentCulture); //瞬时流量,m3/h Array.Copy(instrution_bts, 21, byte4, 0, 4); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1590274355240243200", SrcValue = Bytes2Double(byte4).ToString() }); //瞬时压力,Mpa Array.Copy(instrution_bts, 25, byte4, 0, 4); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589903942416994304", SrcValue = Bytes2Double(byte4).ToString() }); //瞬时流速,m3/h Array.Copy(instrution_bts, 29, byte4, 0, 4); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589904380742733824", SrcValue = Bytes2Double(byte4).ToString() }); //正向累计整数 Array.Copy(instrution_bts, 33, byte4, 0, 4); var ForwardCumulativeFlowInteger = Bytes2Int4(byte4); //正向累计的小数/1000 Array.Copy(instrution_bts, 41, byte2, 0, 2); var ForwardCumulativeFlowDecimal = Bytes2Int32(byte2); //正向累积流量 list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589903863446638592", SrcValue = (ForwardCumulativeFlowInteger + ForwardCumulativeFlowDecimal * 0.001).ToString() }); //反向累计整数 Array.Copy(instrution_bts, 37, byte4, 0, 4); var ReverseCumulativeFlowInteger = Bytes2Int4(byte4); //反向累计的小数 /1000 Array.Copy(instrution_bts, 43, byte2, 0, 2); var ReverseCumulativeFlowDecimal = Bytes2Int32(byte2); //反向累积流量 list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589904635718668288", SrcValue = (ReverseCumulativeFlowInteger + ReverseCumulativeFlowDecimal * 0.001).ToString() }); //水表电池电量 Array.Copy(instrution_bts, 45, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589906693322575872", SrcValue = Bytes2Int32(byte1).ToString() }); //GPRS电池电量 Array.Copy(instrution_bts, 46, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589906830698614784", SrcValue = Bytes2Int32(byte1).ToString() }); //系统报警 Array.Copy(instrution_bts, 47, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589905499946618880", SrcValue = Bytes2Int32(byte1).ToString() }); //水表空管报警 Array.Copy(instrution_bts, 48, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589905855032201216", SrcValue = Bytes2Int32(byte1).ToString() }); //断励磁报警 Array.Copy(instrution_bts, 49, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589905963715006464", SrcValue = Bytes2Int32(byte1).ToString() }); //流量上线报警 Array.Copy(instrution_bts, 50, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589906172004143104", SrcValue = Bytes2Int32(byte1).ToString() }); //流量下线报警 Array.Copy(instrution_bts, 51, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589906236487372800", SrcValue = Bytes2Int32(byte1).ToString() }); //压力上限报警 Array.Copy(instrution_bts, 52, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589906299754254336", SrcValue = Bytes2Int32(byte1).ToString() }); //压力下限报警 Array.Copy(instrution_bts, 53, byte1, 0, 1); list.Add(new Model.MonitorDataDockingSrcRecord() { SignId = "1589906389663354880", SrcValue = Bytes2Int32(byte1).ToString() }); return list; } public static int Bytes2Int4(byte[] src, int offset = 0) { src = src.Reverse().ToArray(); int value; value = (int)(((src[offset] & 0xFF) << 24) | ((src[offset + 1] & 0xFF) << 16) | ((src[offset + 2] & 0xFF) << 8) | (src[offset + 3] & 0xFF)); return value; } public static double Bytes2Double(byte[] value, int offset = 0) { return BitConverter.ToSingle(value.Reverse().ToArray(), 0);//采用了IEEE-754二进制浮点数算术标准 } public static int Bytes2Int32(byte[] bytes) { return Convert.ToInt32(Byte2HexStr(bytes.Reverse().ToArray()), 16); ; } /// /// byte[]转为16进制字符串 /// public static string Byte2HexStr(byte[] bytes) { string returnStr = ""; if (bytes != null) { for (int i = 0; i < bytes.Length; i++) { returnStr += bytes[i].ToString("X2"); } } return returnStr; } } }