GlobalFccCommunicator.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump;
  2. using MessageRouter;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Logging;
  5. using Edge.Core.Parser;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Collections.Specialized;
  9. using System.Net;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using Wayne.Lib.Log;
  13. using Edge.Core.Processor.Communicator;
  14. namespace GlobalCommunicator
  15. {
  16. public class GlobalFccCommunicator<T> : ICommunicator<object, T> where T : MessageBase
  17. {
  18. public string Identity { get; set; }
  19. #region Fields
  20. private ILogger fccLogger;
  21. private const char CRYPT_FORMAT = '3'; // Fusion message crypt format
  22. private const char MESSAGE_VERSION = '2'; // Fusion message version
  23. private const int FUSION_MESSAGE_ROUTER_PORT = 3011; // Fusion message router server port;
  24. private IMessageParser<object, T> parser;
  25. private string fdcServerIpAddress = null;
  26. private string clientId = null;
  27. private FdcCommunicator<T> fdcComm;
  28. /// <summary>
  29. /// 0 for not started, 1 for started.
  30. /// </summary>
  31. private int isStarted = 0;
  32. private bool disposed = false;
  33. private readonly object syncObj = new object();
  34. #endregion
  35. public event EventHandler OnConnected;
  36. public event EventHandler OnDisconnected;
  37. public event EventHandler<CommunicatorEventArg<object, T>> OnRawDataWriting;
  38. public event EventHandler<CommunicatorEventArg<object, T>> OnDataReceived;
  39. public event EventHandler<CommunicatorErrorMessageReadEventArg> OnErrorMessageRead;
  40. public GlobalFccCommunicator(IMessageParser<object, T> parser, string fdcServerIpAddress, string clientId, IServiceProvider services)
  41. {
  42. if (services != null)
  43. {
  44. var loggerFactory = services.GetRequiredService<ILoggerFactory>();
  45. fccLogger = loggerFactory.CreateLogger("GlobalPumpFdc");
  46. MessageRouterCommunicator<T>.fccLogger = fccLogger;
  47. FdcCommunicator<T>.fccLogger = fccLogger;
  48. DebugLogger.logger = fccLogger;
  49. }
  50. this.parser = parser;
  51. this.fdcServerIpAddress = fdcServerIpAddress;
  52. this.clientId = clientId;
  53. }
  54. public Task<bool> Start()
  55. {
  56. if (0 == Interlocked.CompareExchange(ref this.isStarted, 1, 0))
  57. {
  58. try
  59. {
  60. this.SetupFccClientConnectionInBackground();
  61. return Task.FromResult(true);
  62. }
  63. catch (Exception exxx)
  64. {
  65. return Task.FromResult(false);
  66. }
  67. }
  68. return Task.FromResult(false);
  69. }
  70. private void OnFccDataReceived(object sender, FccDataReceivedEventArgs e)
  71. {
  72. lock (syncObj)
  73. {
  74. var safe = this.OnDataReceived;
  75. var eventArg = new CommunicatorEventArg<object, T>();
  76. eventArg.Message = this.parser.Deserialize(e.Message);
  77. fccLogger.LogDebug(string.Format("OnFccDataReceived, ThreadId {0}", Thread.CurrentThread.ManagedThreadId));
  78. safe?.Invoke(this, eventArg);
  79. }
  80. }
  81. /// <summary>
  82. /// connect to remote pump, FC as the client side.
  83. /// </summary>
  84. /// <returns></returns>
  85. private void SetupFccClientConnectionInBackground()
  86. {
  87. var msgRouterServerIPEndPoint = new IPEndPoint(IPAddress.Parse(fdcServerIpAddress), FUSION_MESSAGE_ROUTER_PORT);
  88. var msgRouterClient = new MessageRouterClient(msgRouterServerIPEndPoint, CRYPT_FORMAT, MESSAGE_VERSION);
  89. var msgRouterComm = new MessageRouterCommunicator<T>(parser, msgRouterClient);
  90. msgRouterComm.OnDataReceived += OnFccDataReceived;
  91. msgRouterComm.Start();
  92. fdcComm = new FdcCommunicator<T>(parser, new MessageRouterClient(msgRouterServerIPEndPoint, CRYPT_FORMAT, MESSAGE_VERSION), fdcServerIpAddress, clientId.TrimEnd('.'));
  93. fdcComm.OnDataReceived += OnFccDataReceived;
  94. fdcComm.Start();
  95. }
  96. public void Dispose()
  97. {
  98. this.disposed = true;
  99. }
  100. public bool Write(T message)
  101. {
  102. var fcmMessage = message as Global_Pump_Fdc.MessageEntity.FccMessageBase;
  103. var parameterDic = fcmMessage.Parameters as Dictionary<string, object>;
  104. string command = parameterDic["Command"].ToString();
  105. if (command == "Authorize")
  106. {
  107. fdcComm.AuthorizePumpAsync(parameterDic);
  108. }
  109. else if (command == "QueryTotalizer")
  110. {
  111. fdcComm.QueryTotalizer(parameterDic);
  112. }
  113. else if (command == "PriceUpdate")
  114. {
  115. fdcComm.SetFuelPrice(parameterDic);
  116. }
  117. return true;
  118. }
  119. public bool Write(T message, object extraControlParameter)
  120. {
  121. throw new NotImplementedException();
  122. }
  123. }
  124. public class FccDataReceivedEventArgs : EventArgs
  125. {
  126. private StringDictionary message;
  127. public FccDataReceivedEventArgs(StringDictionary message)
  128. {
  129. this.message = message;
  130. }
  131. public StringDictionary Message
  132. {
  133. get { return message; }
  134. }
  135. }
  136. }