using System.Collections.Generic;
using System.Text;
namespace IStation.Server
{
///
/// 接收信息辅助类
///
internal class RequestReceivedHelper
{
//接收数据
public static async ValueTask Receive(IAppSession session, PackageInfo packageInfo)
{
await Task.Run(() =>
{
try
{
var mySession = (MySession)session;
var allBytes = packageInfo.Body;
LogHelper.Info($" {mySession.SessionName}接收到数据:{BitTransfer.ToString(allBytes)}!");
var prefix = ParsePrefix(allBytes);
if (prefix != ConfigHelper.Prefix)
{
LogHelper.Info($"收到一条无法识别的数据:{Encoding.Unicode.GetString(allBytes)}!");
return;
}
mySession.Send("OK"); //前缀认证成功 返回 “OK”
// 解析数据,每64个字节为一帧数据
var preLength = 9;
var dataCount = 64;
var totalCount = (allBytes.Length - preLength) / dataCount;
for (int i = 0; i < totalCount; i++)
{
var bytes = allBytes.Skip(preLength + (i * dataCount)).Take(dataCount).ToArray();
var model = HandleData(bytes);
if (model != null)
{
var bol = TransferHelper.Transfer(model);
if (bol)
{
LogHelper.Info($"{model.RegisterCode},成功插入{model.RecordList.Count}条数据!");
}
else
{
LogHelper.Info($"{model.RegisterCode},插入{model.RecordList.Count} 条数据失败!");
}
Thread.Sleep(1000);
}
}
}
catch (Exception ex)
{
LogHelper.Error(ex.Message);
}
});
}
#region 处理数据
///
/// 处理数据
///
/// 64字节
///
private static StandardModel HandleData(byte[] bytes)
{
var dataTime = ParseTime(bytes);
if (!dataTime.HasValue)
{
return default;
}
var code = ParseCode(bytes);
var model = new StandardModel();
model.RegisterCode = code.ToString();
model.RecordList = new List();
var value瞬时流量 = Parse瞬时流量(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "瞬时流量",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value瞬时流量.ToString(),
DataStatus=new List()
}
}
});
var value瞬时压力 = Parse瞬时压力(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "瞬时压力",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value瞬时压力.ToString(),
DataStatus=new List()
}
}
});
var value瞬时流速 = Parse瞬时流速(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "瞬时流速",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value瞬时流速.ToString(),
DataStatus=new List()
}
}
});
var value正向累计 = Parse正向累计(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "正向累计",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value正向累计.ToString(),
DataStatus=new List()
}
}
});
var value反向累计 = Parse反向累计(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "反向累计",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value反向累计.ToString(),
DataStatus=new List()
}
}
});
var value水表电池电量 = Parse水表电池电量(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "水表电池电量",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value水表电池电量.ToString(),
DataStatus=new List()
}
}
});
var valueGPRS电池电量 = ParseGPRS电池电量(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "GPRS电池电量",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=valueGPRS电池电量.ToString(),
DataStatus=new List()
}
}
});
var value系统报警 = Parse系统报警(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "系统报警",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value系统报警.ToString(),
DataStatus=new List()
}
}
});
var value水表空管报警 = Parse水表空管报警(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "水表空管报警",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value水表空管报警.ToString(),
DataStatus=new List()
}
}
});
var value断励磁报警 = Parse断励磁报警(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "断励磁报警",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value断励磁报警.ToString(),
DataStatus=new List()
}
}
});
var value流量上限报警 = Parse流量上限报警(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "流量上限报警",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value流量上限报警.ToString(),
DataStatus=new List()
}
}
});
var value流量下限报警 = Parse流量下限报警(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "流量下限报警",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value流量下限报警.ToString(),
DataStatus=new List()
}
}
});
var value压力上限报警 = Parse压力上限报警(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "压力上限报警",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value压力上限报警.ToString(),
DataStatus=new List()
}
}
});
var value压力下限报警 = Parse压力下限报警(bytes);
model.RecordList.Add(new StandardRecord()
{
TransferId = "压力下限报警",
SrcTime = dataTime.Value,
SubList = new List() {
new StandardSubRecord(){
TransferId=string.Empty,
SrcValue=value压力下限报警.ToString(),
DataStatus=new List()
}
}
});
return model;
}
#endregion
#region 解析方法
///
/// 解析前缀
///
/// 所有字节
///
private static string ParsePrefix(byte[] bts)
{
if (bts == null || bts.Length < 9)
{
return string.Empty;
}
var btc = bts.Take(6).ToArray();
return Encoding.ASCII.GetString(btc);
}
///
/// 解析编码
///
/// 64字节
///
private static long ParseCode(byte[] bts)
{
var btc = bts.Take(4).ToArray();
return Bytes2Int32(btc);
}
///
/// 解析时间
///
/// 64字节
///
private static DateTime? ParseTime(byte[] bts)
{
try
{
DateTime? dt = null;
var dateInt = Bytes2Int32(bts.Skip(4).Take(4).ToArray());
var hmsInt = Bytes2Int32(bts.Skip(8).Take(4).ToArray());
var hmsStr = hmsInt.ToString();
if (hmsStr.Length < 3)
{
hmsStr = "0000" + hmsStr;
}
if (hmsStr.Length < 5)
{
hmsStr = "00" + hmsStr;
}
if (hmsStr.Length < 6)
{
hmsStr = "0" + hmsStr;
}
var hms = hmsStr.Substring(0, 2) + ":" + hmsStr.Substring(2, 2) + ":" + hmsStr.Substring(4, 2);
var date = DateTime.ParseExact(dateInt.ToString(), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
var time = $"{date:d} {hms}";
dt = Convert.ToDateTime(time);
return dt;
}
catch (Exception ex)
{
LogHelper.Error($"时间解析:{ex.Message}");
return default;
}
}
///
/// 解析瞬时流量
///
/// 64字节
///
private static double Parse瞬时流量(byte[] bts)
{
var btc = bts.Skip(12).Take(4).ToArray();
return Bytes2Single(btc);
}
///
/// 解析瞬时压力
///
/// 64字节
///
private static double Parse瞬时压力(byte[] bts)
{
var btc = bts.Skip(16).Take(4).ToArray();
return Bytes2Single(btc);
}
///
/// 解析瞬时流速
///
/// 64字节
///
private static double Parse瞬时流速(byte[] bts)
{
var btc = bts.Skip(20).Take(4).ToArray();
return Bytes2Single(btc);
}
///
/// 解析正向累计
///
/// 64字节
///
private static double Parse正向累计(byte[] bts)
{
var btc1 = bts.Skip(24).Take(4).ToArray();
var value1 = Bytes2Int32(btc1);
var btc2 = bts.Skip(32).Take(2).ToArray();
var value2 = Bytes2Int16(btc2) / 1000f;
return value1 + value2;
}
///
/// 解析反向累计
///
/// 64字节
///
private static double Parse反向累计(byte[] bts)
{
var btc1 = bts.Skip(28).Take(4).ToArray();
var value1 = Bytes2Int32(btc1);
var btc2 = bts.Skip(34).Take(2).ToArray();
var value2 = Bytes2Int16(btc2) / 1000f;
return value1 + value2;
}
///
/// 解析水表电池电量
///
/// 64字节
///
private static int Parse水表电池电量(byte[] bts)
{
var btc = bts.Skip(36).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析GPRS电池电量
///
/// 64字节
///
private static int ParseGPRS电池电量(byte[] bts)
{
var btc = bts.Skip(37).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析系统报警
///
/// 64字节
///
private static int Parse系统报警(byte[] bts)
{
var btc = bts.Skip(38).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析水表空管报警
///
/// 64字节
///
private static int Parse水表空管报警(byte[] bts)
{
var btc = bts.Skip(39).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析断励磁报警
///
/// 64字节
///
private static int Parse断励磁报警(byte[] bts)
{
var btc = bts.Skip(40).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析流量上限报警
///
/// 64字节
///
private static int Parse流量上限报警(byte[] bts)
{
var btc = bts.Skip(41).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析流量下限报警
///
/// 64字节
///
private static int Parse流量下限报警(byte[] bts)
{
var btc = bts.Skip(42).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析压力上限报警
///
/// 64字节
///
private static int Parse压力上限报警(byte[] bts)
{
var btc = bts.Skip(43).Take(1).ToArray();
return Bytes2Int8(btc);
}
///
/// 解析压力下限报警
///
/// 64字节
///
private static int Parse压力下限报警(byte[] bts)
{
var btc = bts.Skip(44).Take(1).ToArray();
return Bytes2Int8(btc);
}
#endregion
#region 字节转化方法
private static int Bytes2Int8(byte[] bts)
{
var btc = new byte[] { bts[0], 00 };
return BitConverter.ToInt16(btc);
}
private static int Bytes2Int32(byte[] bts)
{
return BitConverter.ToInt32(bts);
}
private static int Bytes2Int16(byte[] bts)
{
return BitConverter.ToInt16(bts);
}
private static double Bytes2Single(byte[] bts)
{
return BitConverter.ToSingle(bts);
}
#endregion
}
}