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