QMonReceiver.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Collections.Concurrent;
  2. using System.Data;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using Quadarax.Foundation.Core.Logging;
  7. using Quadarax.Foundation.Core.Object;
  8. namespace qmonlib
  9. {
  10. public delegate void GeneralDataReceivedDelegate(MonGeneral general);
  11. public class QMonReceiver : QMonHostBase<QMonReceiverConfiguration>
  12. {
  13. #region *** Properties ***
  14. protected override Uri UriGeneral => Configuration.SourceUriGeneral;
  15. protected override Uri UriData => Configuration.SourceUriData;
  16. protected override TimeSpan IntervalGeneral => Configuration.GeneralReceiverInterval;
  17. protected override TimeSpan? IntervalData => null;
  18. public MonGeneral[] AvailableGeneral => _generalCache.Values.ToArray();
  19. #endregion
  20. #region *** Fields ***
  21. private GeneralDataReceivedDelegate _generalReceivedCallback;
  22. private bool _isReceivingGeneral;
  23. private IDictionary<string, MonGeneral> _generalCache = new ConcurrentDictionary<string, MonGeneral>();
  24. #endregion
  25. #region *** Constructors ***
  26. public QMonReceiver(QMonReceiverConfiguration configuration, ILogger logger, GeneralDataReceivedDelegate generalDataReceivedCallback = null) : base(configuration, logger)
  27. {
  28. _generalReceivedCallback = generalDataReceivedCallback;
  29. }
  30. #endregion
  31. #region *** Private overrides ***
  32. protected override void OnOpen()
  33. {
  34. }
  35. protected override void OnClose()
  36. {
  37. }
  38. protected override void OnTimerData(object? state)
  39. {
  40. throw new NotSupportedException("Timer is not allowed in receiver.");
  41. }
  42. protected override void OnTimerGeneral(object? state)
  43. {
  44. if (state == null) throw new ArgumentNullException(nameof(state));
  45. var owner = (QMonReceiver)state;
  46. if (owner._isReceivingGeneral) return;
  47. owner._isReceivingGeneral = true;
  48. try
  49. {
  50. var remoteEndPoint = new IPEndPoint(IPAddress.Parse(owner.UriGeneral.DnsSafeHost), owner.UriGeneral.Port);
  51. var data = UdpClientGeneral.Receive(ref remoteEndPoint);
  52. var general = (MonGeneral) Binder.LoadFromString(Encoding.UTF8.GetString(data), typeof(MonGeneral));
  53. Log(LogSeverityEnum.Debug,
  54. $"[ReceiverGeneral] receive general data from '{remoteEndPoint}' [{general.InstanceIdentifier}] size={data.Length} bytes.");
  55. _generalCache.TryAdd(general.InstanceIdentifier, general);
  56. _generalReceivedCallback?.Invoke(general);
  57. }
  58. catch (Exception e)
  59. {
  60. Log(LogSeverityEnum.Error, $"[ReceiverGeneral] Error receiving general data", e);
  61. }
  62. finally
  63. {
  64. owner._isReceivingGeneral = false;
  65. }
  66. }
  67. protected override UdpClient CreateUdpClient(Uri targetUri)
  68. {
  69. var udpClient = new UdpClient(targetUri.Port);
  70. return udpClient;
  71. }
  72. protected override void OnDisposing()
  73. {
  74. }
  75. #endregion
  76. }
  77. }