2024-05-17 10:37:55 +00:00
|
|
|
|
using InSituLaboratory.Entities;
|
|
|
|
|
|
using InSituLaboratory.Service;
|
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
using SqlSugar;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace InSituLaboratory.Common
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 数据解析
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class DataParsing
|
|
|
|
|
|
{
|
2024-05-22 10:37:51 +00:00
|
|
|
|
//连接钥匙
|
|
|
|
|
|
private static readonly string ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["db"].ConnectionString;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
2024-05-22 10:37:51 +00:00
|
|
|
|
public DataParsingModelSqlSugar dataParsingModel = new DataParsingModelSqlSugar();
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
//获取当前程序运行路径
|
|
|
|
|
|
private string Save_Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"数据记录\";
|
|
|
|
|
|
|
|
|
|
|
|
//记录第一包数据的创建时间
|
|
|
|
|
|
public static DateTime Record_firstCode = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
|
|
//标志位头
|
2024-05-22 10:37:51 +00:00
|
|
|
|
byte flag = 0x7f;
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
//应答流水号
|
|
|
|
|
|
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");
|
|
|
|
|
|
|
2024-05-22 10:37:51 +00:00
|
|
|
|
//SqlSugar配置文件
|
|
|
|
|
|
ConnectionConfig connectionConfig = new ConnectionConfig()
|
|
|
|
|
|
{
|
|
|
|
|
|
ConnectionString = ConnStr,
|
|
|
|
|
|
IsAutoCloseConnection = true,
|
|
|
|
|
|
DbType = DbType.Sqlite
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2024-05-17 10:37:55 +00:00
|
|
|
|
//转义
|
|
|
|
|
|
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") + " ";
|
|
|
|
|
|
}
|
2024-05-22 10:37:51 +00:00
|
|
|
|
|
|
|
|
|
|
//数据域数组
|
|
|
|
|
|
List<byte> bytes = new List<byte>();
|
|
|
|
|
|
for (int i = 1; i < dataTemp.Length - 2; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
bytes.Add(dataTemp[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-17 10:37:55 +00:00
|
|
|
|
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");
|
|
|
|
|
|
|
2024-05-22 10:37:51 +00:00
|
|
|
|
nr_crc = tools.CRC(bytes.ToArray(), 0, bytes.Count);
|
2024-05-17 10:37:55 +00:00
|
|
|
|
|
|
|
|
|
|
///包头包尾 crc校验
|
2024-05-22 10:37:51 +00:00
|
|
|
|
if (((dataNew[0] != flag) || (dataNew[byteList.Count - 1]) != flag) || dataNew[14] != nr_crc)
|
2024-05-17 10:37:55 +00:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//通用应答 消息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
|
2024-05-22 10:37:51 +00:00
|
|
|
|
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-局部控制开关";
|
|
|
|
|
|
}
|
2024-05-17 10:37:55 +00:00
|
|
|
|
//结果
|
2024-05-22 10:37:51 +00:00
|
|
|
|
switch (dataNew[13])
|
2024-05-17 10:37:55 +00:00
|
|
|
|
{
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x00:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "成功/确认";
|
|
|
|
|
|
break;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x01:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "失败/不存在";
|
|
|
|
|
|
break;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x02:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "消息错误";
|
|
|
|
|
|
break;
|
2024-05-22 10:37:51 +00:00
|
|
|
|
case 0x03:
|
2024-05-17 10:37:55 +00:00
|
|
|
|
dataParsingModel.ResponseResult = "不支持";
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-05-22 10:37:51 +00:00
|
|
|
|
|
|
|
|
|
|
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
|
|
|
|
|
|
{
|
|
|
|
|
|
db.Insertable<DataParsingModelSqlSugar>(dataParsingModel).ExecuteCommand();
|
|
|
|
|
|
}
|
2024-05-17 10:37:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|