355 lines
14 KiB
C#
355 lines
14 KiB
C#
using InSituLaboratory.Entities;
|
||
using InSituLaboratory.Entities.SqlSugar;
|
||
using InSituLaboratory.Service;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using SqlSugar;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Markup;
|
||
|
||
namespace InSituLaboratory.Common
|
||
{
|
||
/// <summary>
|
||
/// 数据解析
|
||
/// </summary>
|
||
public class DataParsing
|
||
{
|
||
//连接钥匙
|
||
private static readonly string ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["db"].ConnectionString;
|
||
|
||
public DataParsingModelSqlSugar dataParsingModel = new DataParsingModelSqlSugar();// 数据解析通用字段
|
||
|
||
public SysSensorModelSqlSugar sysSensorModel = new SysSensorModelSqlSugar();//与下位机通信类 --- 传感器
|
||
|
||
public CurrentSequentiualSqlSugar currentSequentiual = new CurrentSequentiualSqlSugar(); //当前运行时序状态表 ---下位机
|
||
|
||
//获取当前程序运行路径
|
||
private string Save_Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"数据记录\";
|
||
|
||
//记录第一包数据的创建时间
|
||
public static DateTime Record_firstCode = DateTime.Now;
|
||
|
||
//标志位头
|
||
byte flag = 0x7f;
|
||
|
||
//应答流水号
|
||
string ResponseNum = "";
|
||
|
||
//应答ID
|
||
string ResponID = "";
|
||
|
||
//通用应答消息ID
|
||
string MessageID = "1000";
|
||
|
||
//crc
|
||
static byte nr_crc = 0;
|
||
|
||
/// <summary>
|
||
/// 数据解析
|
||
/// </summary>
|
||
/// <param name="byteList"></param>
|
||
public void ParsingData(List<byte> byteList)
|
||
{
|
||
//如果数组长度为0 舍弃
|
||
if (byteList.Count() == 0)
|
||
return;
|
||
//将报文中的内容截取出来 并保存至本地TXT文件内
|
||
string NR_TXT = "";
|
||
for (int i = 0; i < byteList.Count; i++)
|
||
{
|
||
NR_TXT += byteList[i].ToString("X2") + " ";
|
||
}
|
||
|
||
tools.AddLgoToTXT("原始数据报文.txt", Save_Path + System.DateTime.Now.ToString("yyyy_MM_dd") + @"\", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ---- " + NR_TXT + "\r\n");
|
||
|
||
//SqlSugar配置文件
|
||
ConnectionConfig connectionConfig = new ConnectionConfig()
|
||
{
|
||
ConnectionString = ConnStr,
|
||
IsAutoCloseConnection = true,
|
||
DbType = DbType.Sqlite
|
||
};
|
||
|
||
#region 转义
|
||
int j = 0;
|
||
for (int i = 0; i < byteList.Count; i++)
|
||
{
|
||
if (byteList[i] == 0x7e && byteList[i + 1] == 0x01)
|
||
{
|
||
byteList[j] = 0x7e;
|
||
i++;
|
||
|
||
}
|
||
else if (byteList[i] == 0x7e && byteList[i + 1] == 0x02)
|
||
{
|
||
byteList[j] = 0x7f;
|
||
i++;
|
||
}
|
||
else
|
||
{
|
||
byteList[j] = byteList[i];
|
||
}
|
||
j++;
|
||
}
|
||
|
||
//定义转义后的byte数组
|
||
byte[] dataTemp = new byte[j];
|
||
for (int i = 0; i < j; i++)
|
||
{
|
||
dataTemp[i] = byteList[i];
|
||
}
|
||
|
||
//定义转义后的list数组
|
||
List<byte> dataNew = new List<byte>();
|
||
string Latter_TXT = "";
|
||
for (int i = 0; i < dataTemp.Length; i++)
|
||
{
|
||
dataNew.Add(dataTemp[i]);
|
||
Latter_TXT += dataTemp[i].ToString("X2") + " ";
|
||
}
|
||
|
||
//数据域数组 --消息头+消息体
|
||
List<byte> bytes = new List<byte>();
|
||
for (int i = 1; i < dataTemp.Length - 2; i++)
|
||
{
|
||
bytes.Add(dataTemp[i]);
|
||
}
|
||
#endregion
|
||
|
||
tools.AddLgoToTXT("转义后数据报文.txt", Save_Path + System.DateTime.Now.ToString("yyyy_MM_dd") + @"\", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ---- " + Latter_TXT + "\r\n");
|
||
|
||
nr_crc = tools.CRC(bytes.ToArray(), 0, bytes.Count);
|
||
|
||
///包头包尾 crc校验
|
||
if (((dataNew[0] != flag) || (dataNew[byteList.Count - 1]) != flag) || dataNew[14] != nr_crc)
|
||
return;
|
||
|
||
///下位机主动上传的腔体输出状态信息
|
||
if (dataNew[1] == 0x01 && dataNew[2] == 0x03)
|
||
{
|
||
sysSensorModel.CMSpectrometry = dataNew[9] == 0x00 ? "关" : "开";
|
||
sysSensorModel.Light1 = dataNew[10] == 0x00 ? "关" : "开";
|
||
sysSensorModel.Light2 = dataNew[11] == 0x00 ? "关" : "开";
|
||
sysSensorModel.LightMachine = dataNew[12] == 0x00 ? "关" : "开";
|
||
sysSensorModel.ADCP = dataNew[13] == 0x00 ? "关" : "开";
|
||
sysSensorModel.CTD = dataNew[14] == 0x00 ? "关" : "开";
|
||
sysSensorModel.SP = dataNew[15] == 0x00 ? "关" : "开";
|
||
sysSensorModel.CH4 = dataNew[16] == 0x00 ? "关" : "开";
|
||
sysSensorModel.CO2 = dataNew[17] == 0x00 ? "关" : "开";
|
||
sysSensorModel.NetEquipment = dataNew[18] == 0x00 ? "关" : "开";
|
||
sysSensorModel.SerialPortServer = dataNew[19] == 0x00 ? "关" : "开";
|
||
sysSensorModel.InComputer = dataNew[20] == 0x00 ? "关" : "开";
|
||
sysSensorModel.RamanAnalyzer = dataNew[21] == 0x00 ? "关" : "开";
|
||
sysSensorModel.ZP = dataNew[22] == 0x00 ? "关" : "开";
|
||
sysSensorModel.AcousticPositioning = dataNew[23] == 0x00 ? "关" : "开";
|
||
sysSensorModel.Camera1 = dataNew[24] == 0x00 ? "关" : "开";
|
||
sysSensorModel.Camera2 = dataNew[25] == 0x00 ? "关" : "开";
|
||
sysSensorModel.ElectricSwitch2 = dataNew[26] == 0x00 ? "关" : "开";
|
||
|
||
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
|
||
{
|
||
db.Insertable<SysSensorModelSqlSugar>(sysSensorModel).ExecuteCommand();
|
||
}
|
||
}
|
||
|
||
///当前运行状态时序
|
||
if (dataNew[1] == 0x01 && dataNew[2] == 0x05)
|
||
{
|
||
//判断当前时序运行状态
|
||
switch (dataNew[9])
|
||
{
|
||
case 0x00:
|
||
currentSequentiual.Status = "运行关闭";
|
||
break;
|
||
|
||
case 0x01:
|
||
currentSequentiual.Status = "正常运行";
|
||
break;
|
||
|
||
case 0x02:
|
||
currentSequentiual.Status = "运行存在问题";
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
//当前时序序列号
|
||
currentSequentiual.Number = dataNew[10].ToString("X2");
|
||
|
||
//当前运行的设备编号
|
||
for (int i = 10; i <= bytes.Count(); i++)
|
||
{
|
||
switch (bytes[i])
|
||
{
|
||
case 0x00:
|
||
currentSequentiual.DeviceNumber += "工控机 ";
|
||
break;
|
||
case 0x01:
|
||
currentSequentiual.DeviceNumber += "色质联用 ";
|
||
break;
|
||
case 0x02:
|
||
currentSequentiual.DeviceNumber += "备用串口1 ";
|
||
break;
|
||
case 0x03:
|
||
currentSequentiual.DeviceNumber += "备用串口2 ";
|
||
break;
|
||
case 0x04:
|
||
currentSequentiual.DeviceNumber += "光通讯机 ";
|
||
break;
|
||
case 0x05:
|
||
currentSequentiual.DeviceNumber += "ADCP ";
|
||
break;
|
||
case 0x06:
|
||
currentSequentiual.DeviceNumber += "CTD ";
|
||
break;
|
||
case 0x07:
|
||
currentSequentiual.DeviceNumber += "气相色谱仪 ";
|
||
break;
|
||
case 0x08:
|
||
currentSequentiual.DeviceNumber += "甲烷传感器 ";
|
||
break;
|
||
case 0x09:
|
||
currentSequentiual.DeviceNumber += "二氧化碳同位素分析仪 ";
|
||
break;
|
||
case 0x0a:
|
||
currentSequentiual.DeviceNumber += "备用网口设备 ";
|
||
break;
|
||
case 0x0b:
|
||
currentSequentiual.DeviceNumber += "ICL ";
|
||
break;
|
||
case 0x0c:
|
||
currentSequentiual.DeviceNumber += "显微拉曼分析仪 ";
|
||
break;
|
||
case 0x0d:
|
||
currentSequentiual.DeviceNumber += "质谱仪 ";
|
||
break;
|
||
case 0x0e:
|
||
currentSequentiual.DeviceNumber += "声学定位 ";
|
||
break;
|
||
case 0x0f:
|
||
currentSequentiual.DeviceNumber += "摄像1 ";
|
||
break;
|
||
case 0x10:
|
||
currentSequentiual.DeviceNumber += "摄像2 ";
|
||
break;
|
||
case 0x11:
|
||
currentSequentiual.DeviceNumber += "电交换机2 ";
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
|
||
{
|
||
db.Insertable<CurrentSequentiualSqlSugar>(currentSequentiual).ExecuteCommand();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//通用应答 消息ID:0x1000
|
||
if (MessageID == dataNew[1].ToString("X2") + dataNew[2].ToString("X2"))
|
||
{
|
||
dataParsingModel.CreateTime = System.DateTime.Now;
|
||
//应答流水号
|
||
dataParsingModel.ResponseNum = dataNew[9].ToString("X2") + dataNew[10].ToString("X2");
|
||
//应答ID
|
||
if (dataNew[11].ToString("X2") + dataNew[12].ToString("X2") == "9100")
|
||
{
|
||
dataParsingModel.ResponseID = "9100-时序下发";
|
||
}
|
||
else if (dataNew[11].ToString("X2") + dataNew[12].ToString("X2") == "9201")
|
||
{
|
||
dataParsingModel.ResponseID = "9201-局部控制开关";
|
||
}
|
||
//结果
|
||
switch (dataNew[13])
|
||
{
|
||
case 0x00:
|
||
dataParsingModel.ResponseResult = "成功/确认";
|
||
break;
|
||
case 0x01:
|
||
dataParsingModel.ResponseResult = "失败/不存在";
|
||
break;
|
||
case 0x02:
|
||
dataParsingModel.ResponseResult = "消息错误";
|
||
break;
|
||
case 0x03:
|
||
dataParsingModel.ResponseResult = "不支持";
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
|
||
{
|
||
db.Insertable<DataParsingModelSqlSugar>(dataParsingModel).ExecuteCommand();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
#region 转义
|
||
|
||
/// <summary>
|
||
/// 转义
|
||
/// </summary>
|
||
/// <param name="tBuffer">没有头尾和校验的byte数组</param>
|
||
/// <param name="code">校验码</param>
|
||
/// <param name="flag">标志位</param>
|
||
/// <returns></returns>
|
||
public static List<byte> Transform(List<byte> tBuffer, byte code, byte flag)
|
||
{
|
||
int j = 0;
|
||
tBuffer.Add(code);
|
||
int length = tBuffer.ToArray().Length;
|
||
byte[] newAnswer = tBuffer.ToArray();
|
||
for (int i = 0; i < length; i++)
|
||
{
|
||
if (newAnswer[i] == 0x7e || newAnswer[i] == 0x7f)
|
||
{
|
||
j++;
|
||
}
|
||
}
|
||
byte[] newSendBuffer = new byte[length + j];
|
||
for (int i = 0; i < length; i++)
|
||
{
|
||
newSendBuffer[i] = newAnswer[i];
|
||
}
|
||
for (int i = 0; i < length + j; i++)
|
||
{
|
||
if (newSendBuffer[i] == 0x7e)
|
||
{
|
||
for (int k = length + j - 1; k > i + 1; k--)
|
||
{
|
||
newSendBuffer[k] = newSendBuffer[k - 1];
|
||
}
|
||
newSendBuffer[i + 1] = 0x01;
|
||
}
|
||
if (newSendBuffer[i] == 0x7f)
|
||
{
|
||
newSendBuffer[i] = 0x7e;
|
||
for (int k = length + j - 1; k > i + 1; k--)
|
||
{
|
||
newSendBuffer[k] = newSendBuffer[k - 1];
|
||
}
|
||
newSendBuffer[i + 1] = 0x02;
|
||
}
|
||
}
|
||
List<byte> buffer = new List<byte>();
|
||
buffer.Add(flag);
|
||
for (int i = 0; i < newSendBuffer.Length; i++)
|
||
{
|
||
buffer.Add(newSendBuffer[i]);
|
||
}
|
||
buffer.Add(flag);
|
||
return buffer;
|
||
}
|
||
#endregion
|
||
}
|
||
}
|