using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump; using MessageRouter; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Edge.Core.Parser; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Net; using System.Threading; using System.Threading.Tasks; using Wayne.Lib.Log; using Edge.Core.Processor.Communicator; namespace GlobalCommunicator { public class GlobalFccCommunicator : ICommunicator where T : MessageBase { public string Identity { get; set; } #region Fields private ILogger fccLogger; private const char CRYPT_FORMAT = '3'; // Fusion message crypt format private const char MESSAGE_VERSION = '2'; // Fusion message version private const int FUSION_MESSAGE_ROUTER_PORT = 3011; // Fusion message router server port; private IMessageParser parser; private string fdcServerIpAddress = null; private string clientId = null; private FdcCommunicator fdcComm; /// /// 0 for not started, 1 for started. /// private int isStarted = 0; private bool disposed = false; private readonly object syncObj = new object(); #endregion public event EventHandler OnConnected; public event EventHandler OnDisconnected; public event EventHandler> OnRawDataWriting; public event EventHandler> OnDataReceived; public event EventHandler OnErrorMessageRead; public GlobalFccCommunicator(IMessageParser parser, string fdcServerIpAddress, string clientId, IServiceProvider services) { if (services != null) { var loggerFactory = services.GetRequiredService(); fccLogger = loggerFactory.CreateLogger("GlobalPumpFdc"); MessageRouterCommunicator.fccLogger = fccLogger; FdcCommunicator.fccLogger = fccLogger; DebugLogger.logger = fccLogger; } this.parser = parser; this.fdcServerIpAddress = fdcServerIpAddress; this.clientId = clientId; } public Task Start() { if (0 == Interlocked.CompareExchange(ref this.isStarted, 1, 0)) { try { this.SetupFccClientConnectionInBackground(); return Task.FromResult(true); } catch (Exception exxx) { return Task.FromResult(false); } } return Task.FromResult(false); } private void OnFccDataReceived(object sender, FccDataReceivedEventArgs e) { lock (syncObj) { var safe = this.OnDataReceived; var eventArg = new CommunicatorEventArg(); eventArg.Message = this.parser.Deserialize(e.Message); fccLogger.LogDebug(string.Format("OnFccDataReceived, ThreadId {0}", Thread.CurrentThread.ManagedThreadId)); safe?.Invoke(this, eventArg); } } /// /// connect to remote pump, FC as the client side. /// /// private void SetupFccClientConnectionInBackground() { var msgRouterServerIPEndPoint = new IPEndPoint(IPAddress.Parse(fdcServerIpAddress), FUSION_MESSAGE_ROUTER_PORT); var msgRouterClient = new MessageRouterClient(msgRouterServerIPEndPoint, CRYPT_FORMAT, MESSAGE_VERSION); var msgRouterComm = new MessageRouterCommunicator(parser, msgRouterClient); msgRouterComm.OnDataReceived += OnFccDataReceived; msgRouterComm.Start(); fdcComm = new FdcCommunicator(parser, new MessageRouterClient(msgRouterServerIPEndPoint, CRYPT_FORMAT, MESSAGE_VERSION), fdcServerIpAddress, clientId.TrimEnd('.')); fdcComm.OnDataReceived += OnFccDataReceived; fdcComm.Start(); } public void Dispose() { this.disposed = true; } public bool Write(T message) { var fcmMessage = message as Global_Pump_Fdc.MessageEntity.FccMessageBase; var parameterDic = fcmMessage.Parameters as Dictionary; string command = parameterDic["Command"].ToString(); if (command == "Authorize") { fdcComm.AuthorizePumpAsync(parameterDic); } else if (command == "QueryTotalizer") { fdcComm.QueryTotalizer(parameterDic); } else if (command == "PriceUpdate") { fdcComm.SetFuelPrice(parameterDic); } return true; } public bool Write(T message, object extraControlParameter) { throw new NotImplementedException(); } } public class FccDataReceivedEventArgs : EventArgs { private StringDictionary message; public FccDataReceivedEventArgs(StringDictionary message) { this.message = message; } public StringDictionary Message { get { return message; } } } }