using DataCapture_MA.Const; using DataCapture_MA.Entity; using DataCapture_MA.log4Net; using DataCapture_MA.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Reflection; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace DataCapture_MA.DataHnadle { public class ReceiveDataHandle { public static void SaveDataForSqlite(MessageAnalysis messageAnalysis) { try { using(DbModel dbModel = new DbModel()) { var robotInfo = AutoMapper.Mapper.Map(messageAnalysis); robotInfo.WarnningContent = JsonConvert.SerializeObject(messageAnalysis.Warnings); robotInfo.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); robotInfo.CreateStamp = DateTimeOffset.Now.ToUnixTimeSeconds(); dbModel.RobotInfo.Add(robotInfo); dbModel.SaveChanges(); } } catch(Exception ex) { Log4NetHelper.WriteErrorLog(LogType.Receive, "保存至数据库异常:" + ex.Message); } } public static void SendWarnForMes(MessageAnalysis messageAnalysis) { var sendCount = 0; Log4NetHelper.WriteInfoLog(LogType.PushMes, "推送设备完整信息:" + JsonConvert.SerializeObject(messageAnalysis)); while (true) { try { if (sendCount >= 5) { Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送设备报警信息失败停止推送"); return; } // 推送 var pushResult = MesApiHelper.PushEquipmentWarning(messageAnalysis); if(pushResult != null && pushResult.statusCode == 0) { Log4NetHelper.WriteInfoLog(LogType.PushMes, "推送设备报警消息至mes成功,返回:" + JsonConvert.SerializeObject(pushResult)); return; } Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送设备报警消息至mes失败,返回:" + JsonConvert.SerializeObject(pushResult)); Thread.Sleep(2000); sendCount++; } catch (Exception ex) { Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送报警消息至mes失败:" + ex.Message); sendCount++; continue; } } } public static void SendEquipmentStatusForMes(MessageAnalysis messageAnalysis) { var sendCount = 0; Log4NetHelper.WriteInfoLog(LogType.PushMes, "推送设备完整信息:" + JsonConvert.SerializeObject(messageAnalysis)); while (true) { try { if (sendCount >= 5) { Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送设备状态信息失败停止推送"); return; } // 推送 var pushResult = MesApiHelper.PushEquipmentStatus(messageAnalysis); if (pushResult != null && pushResult.statusCode == 0) { Log4NetHelper.WriteInfoLog(LogType.PushMes, "推送设备状态消息至mes成功,返回:"+JsonConvert.SerializeObject(pushResult) ); return; } Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送设备状态消息至mes失败,返回:" + JsonConvert.SerializeObject(pushResult)); Thread.Sleep(2000); sendCount++; } catch (Exception ex) { Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送设备状态消息至mes失败:" + ex.Message); sendCount++; continue; } } } public static void SendEquipmentInfoForMes(MessageAnalysis messageAnalysis) { var sendCount = 0; Log4NetHelper.WriteInfoLog(LogType.PushMes, "推送设备完整信息:" + JsonConvert.SerializeObject(messageAnalysis)); while (true) { try { if (sendCount >= 5) { Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送设备信息失败停止推送"); return; } // 推送 var pushResult = MesApiHelper.PushEquipmentInfo(messageAnalysis); if (pushResult != null && pushResult.statusCode == 0) { Log4NetHelper.WriteInfoLog(LogType.PushMes, "推送设备消息至mes成功,返回:" + JsonConvert.SerializeObject(pushResult)); return; } Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送设备消息至mes失败,返回:" + JsonConvert.SerializeObject(pushResult)); Thread.Sleep(2000); sendCount ++ ; } catch (Exception ex) { Log4NetHelper.WriteErrorLog(LogType.PushMes, "推送消息至mes失败:" + ex.Message); sendCount++; continue; } } } public static void AnalysisMeassage(string message) { try { // 解析收到的消息 var messageAnalysis = new MessageAnalysis(); foreach (var entry in DictMapping.fieldMapping) { try { string tag = entry.Key; string propertyName = entry.Value; if (tag.Contains("MSGBUF")) continue; // 正则表达式匹配标签内容 string pattern = $@"<{Regex.Escape(tag.Trim())}>(.*?)"; Match match = Regex.Match(message, pattern); if (!match.Success) continue; string value = match.Groups[1].Value.Trim(); // 提取内容并去掉首尾空格 // 通过反射将值赋给实体类属性 PropertyInfo property = typeof(MessageAnalysis).GetProperty(propertyName); if (property == null) { continue; } if (property.PropertyType == typeof(int)) { property.SetValue(messageAnalysis, int.Parse(value)); } else if (property.PropertyType == typeof(bool)) { property.SetValue(messageAnalysis, bool.Parse(value)); } else { property.SetValue(messageAnalysis, value); } } catch(Exception ex) { // 记录错误日志 Log4NetHelper.WriteErrorLog(LogType.Receive, "获取消息赋值失败:" + ex.Message); } } Log4NetHelper.WriteInfoLog(LogType.Receive, JsonConvert.SerializeObject(messageAnalysis)); // 处理报警信息 var errorMsg = GetErrorMsg(message); if (!string.IsNullOrEmpty(errorMsg)) { var warringList = WarningInfoHandle(errorMsg); messageAnalysis.Warnings = warringList; Log4NetHelper.WriteInfoLog(LogType.Receive,"报警信息:"+ JsonConvert.SerializeObject(warringList)); } //// 推送mes //_ = Task.Run(() => SendWarnForMes(messageAnalysis)); //_ = Task.Run(() => SendEquipmentStatusForMes(messageAnalysis)); //_ = Task.Run(() => SendEquipmentInfoForMes(messageAnalysis)); // Sqlite数据库保存一份 _ = Task.Run(() => SaveDataForSqlite(messageAnalysis)); } catch(Exception ex) { // 记录错误日志 Log4NetHelper.WriteErrorLog(LogType.Receive, "解析收到消息异常:" + ex.Message); } } private static string GetErrorMsg(string message) { try { string numberPattern = @"(.*?<\/ENUMBER>)"; Match numberMatch = Regex.Match(message, numberPattern); // 正则表达式匹配 MSGBUF 标签 string msgbufPattern = @"(.*?<\/MSGBUF\[\d+\].NR>)"; MatchCollection msgbufMatches = Regex.Matches(message, msgbufPattern); // 拼接结果 string result = ""; var num = "0"; if (numberMatch.Success) { result += numberMatch.Groups[1].Value + Environment.NewLine; string pattern = $@"(.*?)"; Match match = Regex.Match(result, pattern); if (match.Success) { num = match.Groups[1].Value.Trim(); if (num == "0") return ""; } } var count = 0; foreach (Match match in msgbufMatches) { if (count >= Convert.ToInt32(num)) { return result; } result += match.Groups[1].Value + Environment.NewLine; count++; } return result; } catch(Exception ex) { // 记录错误日志 Log4NetHelper.WriteErrorLog(LogType.Receive,"获取报警信息异常:"+ex.Message); return ""; } } private static List WarningInfoHandle(string errMsg) { var warns = new List(); if (string.IsNullOrEmpty(errMsg)) { return warns; } string pattern = @"(.*?)<\/MSGBUF\[\d+\].NR>"; MatchCollection matches = Regex.Matches(errMsg, pattern); foreach (Match match in matches) { var warn = new WarningInfo(); string msgContent = match.Groups[1].Value.Trim(); if (!string.IsNullOrEmpty(msgContent)) { //result += msgContent + ";"; // 添加分割符 CacheWarningDict.WarningDict.TryGetValue(msgContent, out var warnContent); if (warnContent != null) { warn.WarningContent = warnContent.WarningContent.Trim(); warn.WarningCode = warnContent.WarningCode; } warn.WarningCache = msgContent; } // 获取报警描述信息 warns.Add(warn); } return warns; } } }