using DM_Weight.Models; using DM_Weight.msg; using DM_Weight.util; using DM_Weight.ViewModels; using DM_Weight.Views; using log4net; using Mina.Core.Future; using Mina.Filter.Codec; using Mina.Filter.Logging; using Mina.Transport.Socket; using Prism.Events; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; namespace DM_Weight.Port { public class SocketHelper { private readonly ILog logger = LogManager.GetLogger(typeof(SocketHelper)); AsyncSocketConnector acceptor = new AsyncSocketConnector(); IConnectFuture iConnectFuture; public bool OpenStatus=false; //多线程退出标识 public bool IsMultiThread = false; string ip = ConfigurationManager.AppSettings["modbusIp"].ToString(); int port =Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]); IEventAggregator _eventAggregator; public SocketHelper(IEventAggregator eventAggregator) { _eventAggregator=eventAggregator; acceptor.ExceptionCaught += (o, e) => { logger.Error($"网口通信超时:{e.Exception}"); AlertMsg alertMsg = new AlertMsg { Message = $"网口通信超时,正在重试!", Type = MsgType.ERROR }; _eventAggregator.GetEvent().Publish(alertMsg); }; //acceptor.FilterChain.AddLast("logger", new LoggingFilter()); acceptor.FilterChain.AddLast("encoding", new ProtocolCodecFilter(new MyMinaCodecFactory())); acceptor.SessionIdle += (o, e) => logger.Info("IDLE " + e.Session.GetIdleCount(e.IdleStatus)); acceptor.MessageReceived += (o, e) => { OpenStatus = (bool)e.Message; logger.Info("MessageReceived>>>>>>>>>>>>>>>>" + OpenStatus); if(OpenStatus) { HomeWindow.idleTimer.Stop(); } else { HomeWindow.idleTimer.AutoReset = true; HomeWindow.idleTimer.Interval = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0") * 1000; HomeWindow.idleTimer.Start(); } }; acceptor.SessionClosed += (o, e) => { logger.Info("SessionClosed"); //Task.Delay(50).Wait(); SocketConnect(); }; this.SocketConnect(); } public void SocketConnect() { iConnectFuture = acceptor.Connect(new IPEndPoint(IPAddress.Parse(ip), port)).Await(); logger.Info(iConnectFuture.Connected.ToString()); } public void SendMessage(MyBaseMessage baseMessage) { iConnectFuture.Session.Write(baseMessage); } } }