123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump;
- using MessageRouter;
- using Microsoft.Extensions.Logging;
- using Edge.Core.Parser;
- using System;
- using System.Collections.Specialized;
- using System.Linq;
- using System.Threading;
- namespace GlobalCommunicator
- {
- public class MessageRouterCommunicator<T> : IDisposable
- {
- public static ILogger fccLogger { get; set; }
- private const string DEFAULT_FUSION_USER_NAME = "SSF";
- private const string DEFAULT_FUSION_PASSWORD = "MINIMEINFINITERINGTONES";
-
-
-
- private int isStarted = 0;
- private IMessageParser<object, T> parser;
- public event EventHandler<FccDataReceivedEventArgs> OnDataReceived;
- private readonly MessageRouterClient msgRouterClient;
-
-
-
-
- public MessageRouterCommunicator(IMessageParser<object, T> parser, MessageRouterClient msgRouterClient)
- {
- this.parser = parser;
- this.msgRouterClient = msgRouterClient;
- this.msgRouterClient.OnConnect += (conn, reconnect) =>
- {
- fccLogger.LogDebug("Connected with MessageRouterServer");
- string clientId = DEFAULT_FUSION_USER_NAME;
- string password = DEFAULT_FUSION_PASSWORD;
- string userName = clientId;
- userName = MsgRouterMessageUtility.AppendSpaceOnRight(userName, 20);
- password = MsgRouterMessageUtility.AppendSpaceOnRight(password, 25);
- char[] cryptedPwd = MsgRouterMessageUtility.Crypt(password.ToCharArray(), 25, userName.ToCharArray(), 20);
- password = MsgRouterMessageUtility.BinToHexString(cryptedPwd, 25);
- if (!msgRouterClient.SendMessage(MsgRouterMessageUtility.Login(clientId.ToUpper(), password)))
- fccLogger.LogDebug("Login failed to send to msgRouter server");
- SendSubscriptions();
- };
- this.msgRouterClient.OnDisconnect += (client, exp) => fccLogger.LogDebug("!!!msgRouterClient disconnected with MessageRouterServer");
- this.msgRouterClient.OnMessageRouterMessageReceived += this.OnMessageRouterMessageReceived;
- }
- private void OnMessageRouterMessageReceived(MessageRouterClient client, string msgType, string evtType, StringDictionary parameters)
- {
- fccLogger.LogDebug("Message received from MessageRouterServer");
- fccLogger.LogDebug(" message type: " + msgType);
- fccLogger.LogDebug(" event type: " + evtType);
- fccLogger.LogDebug(" params(name->value): " + (parameters.Count == 0 ? "" : parameters.Keys.Cast<string>().Select(k => k + "->" + parameters[k]).Aggregate((acc, n) => acc + ", " + n)));
- if (msgType == "ECHO")
- {
- parameters["PumpID"] = "-1";
- parameters["EventType"] = "EchoEvent";
- this.OnDataReceived?.Invoke(this, new FccDataReceivedEventArgs(parameters));
- }
- else if (msgType == "POST")
- ProcessMessage(msgType, evtType, parameters);
- }
- private void ProcessMessage(string msgType, string evtType, StringDictionary parameters)
- {
- string evt = "";
- string pumpId = "";
- if (evtType.IndexOf("_ID_") > 0)
- {
- evt = evtType.Substring(0, evtType.Length - 7);
- pumpId = evtType.Substring(evtType.Length - 3, 3);
- }
- else
- {
- evt = evtType;
- }
- switch (evt)
- {
- #region
- case "RES_GENERIC_ERROR":
- break;
- case "RES_FCRT_PUMPS_CONFIG":
- break;
- case "EVT_PUMP_STATUS_CHANGE":
- ProcessPumpStatusChange(parameters, Convert.ToInt32(pumpId));
- break;
- case "EVT_PUMP_DELIVERY_PROGRESS":
- ProcessPumpDeliveryProgressChange(parameters, Convert.ToInt32(pumpId));
- break;
- case "RES_SECU_LOGIN":
- break;
- case "RES_SECU_ACCESS_DENIED":
- break;
- case "RES_PRICES_REFRESH_PRICE_CHANGE_TBL":
-
- break;
- case "RES_PRICES_SET_NEW_PRICE_CHANGE":
-
- break;
- case "EVT_NEW_PRICE_CHANGE_APPLIED":
-
- break;
- case "REQ_RECEIVE_PRESET_FROM_FORECOURT":
-
- break;
- case "REQ_RECEIVE_OUTDOOR_TRANSACTION_DENIED":
-
- break;
- case "REQ_RECEIVE_OUTDOOR_TRANSACTION_APPROVED":
-
- break;
- case "REQ_RECEIVE_OUTDOOR_AIRLOCK":
-
- break;
- default:
- break;
- #endregion
- }
- }
- private void ProcessPumpDeliveryProgressChange(StringDictionary parameters, int pumpId)
- {
- if (string.IsNullOrEmpty(parameters["GR"]) || string.IsNullOrEmpty(parameters["AM"]) ||
- string.IsNullOrEmpty(parameters["PU"]) || string.IsNullOrEmpty(parameters["VO"]))
- {
- fccLogger.LogDebug("Ignore ProcessPumpDeliveryProgressChange event for pump: " + pumpId);
- return;
- }
- try
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
- catch (Exception ex)
- {
- fccLogger.LogDebug("Exception in handling ProcessPumpDeliveryProgressChange:" + ex);
- }
- }
- private void ProcessPumpStatusChange(StringDictionary parameters, int pumpId)
- {
- try
- {
- parameters["PumpID"] = pumpId.ToString();
- parameters["EventType"] = "PumpStatusChange";
- fccLogger.LogDebug("ProcessPumpStatusChange event for pump: " + pumpId);
- foreach (string key in parameters.Keys)
- {
- fccLogger.LogDebug(string.Format("Key: {0}, Value: {1}", key, parameters[key]));
- }
- this.OnDataReceived?.Invoke(this, new FccDataReceivedEventArgs(parameters));
- }
- catch (Exception ex)
- {
- fccLogger.LogError(" Exception in ProcessPumpStatusChange: " + parameters.ToString() + ", detail: \r\n" + ex.ToString());
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
- public bool Start()
- {
- if (0 == Interlocked.CompareExchange(ref this.isStarted, 1, 0))
- {
- this.msgRouterClient.Start();
- return true;
- }
- else
- {
- throw new InvalidOperationException("Already started.");
- }
- }
- public bool IsStarted
- {
- get { return this.isStarted == 1; }
- }
- private void SendSubscriptions()
- {
- Thread.Sleep(100);
-
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribePumpStatusChange());
- Thread.Sleep(100);
-
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribePumpDeliveryProgress());
- Thread.Sleep(100);
-
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeNewPriceChangeApplied());
- Thread.Sleep(100);
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeRefreshPriceChangeTbl());
- Thread.Sleep(100);
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeSetNewPriceChange());
- Thread.Sleep(100);
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceivePresetFromForecourt());
- Thread.Sleep(100);
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxDeniedFromForecourt());
- Thread.Sleep(100);
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxApprovedFromForecourt());
- Thread.Sleep(100);
- this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxAirlockFromForecourt());
- }
- public void Dispose()
- {
- this.msgRouterClient.Dispose();
- }
- }
- }
|