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.Linq.Expressions; using System.Text; using System.Threading.Tasks; using System.Windows.Markup; namespace InSituLaboratory.Common { /// /// 数据解析 /// 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 = "0000"; //crc static byte nr_crc = 0; /// /// 数据解析 /// /// public void ParsingData(List 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 dataNew = new List(); string Latter_TXT = ""; for (int i = 0; i < dataTemp.Length; i++) { dataNew.Add(dataTemp[i]); Latter_TXT += dataTemp[i].ToString("X2") + " "; } //数据域数组 --消息头+消息体 List bytes = new List(); 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(sysSensorModel).ExecuteCommand(); } } ///当前运行状态时序 if (dataNew[1] == 0x01 && dataNew[2] == 0x05) { //判断时序1运行状态 switch (dataNew[9]) { case 0x00: currentSequentiual.Sequentiual1Status = "关闭"; break; case 0x01: currentSequentiual.Sequentiual1Status = "等待"; break; case 0x02: currentSequentiual.Sequentiual1Status = "运行"; break; case 0x03: currentSequentiual.Sequentiual1Status = "结束"; break; case 0x04: currentSequentiual.Sequentiual1Status = "不存在时序"; break; case 0x05: currentSequentiual.Sequentiual1Status = "时序状态变更交替中"; break; case 0x06: currentSequentiual.Sequentiual1Status = "异常"; break; default: break; } //判断时序2运行状态 switch (dataNew[10]) { case 0x00: currentSequentiual.Sequentiual2Status = "关闭"; break; case 0x01: currentSequentiual.Sequentiual2Status = "等待"; break; case 0x02: currentSequentiual.Sequentiual2Status = "运行"; break; case 0x03: currentSequentiual.Sequentiual2Status = "结束"; break; case 0x04: currentSequentiual.Sequentiual2Status = "不存在时序"; break; case 0x05: currentSequentiual.Sequentiual2Status = "异常"; break; default: break; } //判断时序3运行状态 switch (dataNew[11]) { case 0x00: currentSequentiual.Sequentiual3Status = "关闭"; break; case 0x01: currentSequentiual.Sequentiual3Status = "等待"; break; case 0x02: currentSequentiual.Sequentiual3Status = "运行"; break; case 0x03: currentSequentiual.Sequentiual3Status = "结束"; break; case 0x04: currentSequentiual.Sequentiual3Status = "不存在时序"; break; case 0x05: currentSequentiual.Sequentiual3Status = "异常"; break; default: break; } //判断时序4运行状态 switch (dataNew[12]) { case 0x00: currentSequentiual.Sequentiual4Status = "关闭"; break; case 0x01: currentSequentiual.Sequentiual4Status = "等待"; break; case 0x02: currentSequentiual.Sequentiual4Status = "运行"; break; case 0x03: currentSequentiual.Sequentiual4Status = "结束"; break; case 0x04: currentSequentiual.Sequentiual4Status = "不存在时序"; break; case 0x05: currentSequentiual.Sequentiual4Status = "异常"; break; default: break; } //判断时序5运行状态 switch (dataNew[13]) { case 0x00: currentSequentiual.Sequentiual5Status = "关闭"; break; case 0x01: currentSequentiual.Sequentiual5Status = "等待"; break; case 0x02: currentSequentiual.Sequentiual5Status = "运行"; break; case 0x03: currentSequentiual.Sequentiual5Status = "结束"; break; case 0x04: currentSequentiual.Sequentiual5Status = "不存在时序"; break; case 0x05: currentSequentiual.Sequentiual5Status = "异常"; break; default: break; } using (SqlSugarClient db = new SqlSugarClient(connectionConfig)) { db.Insertable(currentSequentiual).ExecuteCommand(); } } //通用应答 消息ID:0x0000 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(dataParsingModel).ExecuteCommand(); } } } #region 转义 /// /// 转义 /// /// 没有头尾和校验的byte数组 /// 校验码 /// 标志位 /// public static List Transform(List 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 buffer = new List(); buffer.Add(flag); for (int i = 0; i < newSendBuffer.Length; i++) { buffer.Add(newSendBuffer[i]); } buffer.Add(flag); return buffer; } #endregion } }