private static WaitableLoRaRequest Create(RadioMetadata radioMetadata,
                                                  IEnumerable <TimeSpan> elapsedTimes,
                                                  IDownstreamMessageSender downstreamMessageSender = null,
                                                  TimeSpan?startTimeOffset = null,
                                                  bool useRealTimer        = false,
                                                  LoRaPayload loRaPayload  = null,
                                                  Region region            = null)
        {
            var request = new WaitableLoRaRequest(radioMetadata,
                                                  downstreamMessageSender ?? new TestDownstreamMessageSender(),
                                                  DateTime.UtcNow.Subtract(startTimeOffset ?? TimeSpan.Zero));
            var effectiveRegion = region ?? TestUtils.TestRegion;

            request.SetRegion(effectiveRegion);
            if (loRaPayload is not null)
            {
                request.SetPayload(loRaPayload);
            }
            if (!useRealTimer)
            {
                var timeWatcher = new TestLoRaOperationTimeWatcher(effectiveRegion, elapsedTimes);
                request.UseTimeWatcher(timeWatcher);
            }

            return(request);
        }
 /// <summary>
 /// Creates a WaitableLoRaRequest that uses a deterministic time handler.
 /// </summary>
 /// <param name="rxpk">Rxpk instance.</param>
 /// <param name="downstreamMessageSender">DownstreamMessageSender instance.</param>
 /// <param name="startTimeOffset">Is subtracted from the current time to determine the start time for the deterministic time watcher. Default is TimeSpan.Zero.</param>
 /// <param name="constantElapsedTime">Controls how much time is elapsed when querying the time watcher. Default is TimeSpan.Zero.</param>
 /// <param name="useRealTimer">Allows you to opt-in to use a real, non-deterministic time watcher.</param>
 public static WaitableLoRaRequest Create(RadioMetadata radioMetadata,
                                          LoRaPayload loRaPayload,
                                          IDownstreamMessageSender downstreamMessageSender = null,
                                          TimeSpan?startTimeOffset     = null,
                                          TimeSpan?constantElapsedTime = null,
                                          bool useRealTimer            = false,
                                          Region region = null) =>
 Create(radioMetadata, LoRaEnumerable.RepeatInfinite(constantElapsedTime ?? TimeSpan.Zero), downstreamMessageSender, startTimeOffset, useRealTimer, loRaPayload, region: region);
 public LoRaRequest(
     RadioMetadata radioMetadata,
     IDownstreamMessageSender downstreamMessageSender,
     DateTime startTime)
 {
     RadioMetadata           = radioMetadata;
     DownstreamMessageSender = downstreamMessageSender;
     StartTime = startTime;
 }
        /// <summary>
        /// Creates a WwaitableLoRaRequest that is configured to miss certain receive windows.
        /// </summary>
        /// <param name="rxpk">Rxpk instance.</param>
        /// <param name="downstreamMessageSender">DownstreamMessageSender instance.</param>
        /// <param name="inTimeForC2DMessageCheck">If set to true it ensures that processing is fast enough that C2D messages can be checked.</param>
        /// <param name="inTimeForAdditionalMessageCheck">If set to true it ensures that processing is fast enough that additional C2D messages can be checked.</param>
        /// <param name="inTimeForDownlinkDelivery">If set to true it ensures that processing is fast enough that C2D messages can be checked.</param>
        public static WaitableLoRaRequest Create(RadioMetadata radioMetadata,
                                                 IDownstreamMessageSender downstreamMessageSender,
                                                 bool inTimeForC2DMessageCheck,
                                                 bool inTimeForAdditionalMessageCheck,
                                                 bool inTimeForDownlinkDelivery,
                                                 LoRaPayloadData loRaPayloadData = null)
        {
            var c2dMessageCheckTimeSpan        = inTimeForC2DMessageCheck ? TimeSpan.FromMilliseconds(10) : TimeSpan.FromSeconds(10);
            var additionalMessageCheckTimeSpan = inTimeForAdditionalMessageCheck ? TimeSpan.FromMilliseconds(10) : TimeSpan.FromSeconds(10);
            var downlinkDeliveryTimeSpan       = inTimeForDownlinkDelivery ? TimeSpan.FromMilliseconds(10) : TimeSpan.FromSeconds(10);

            return(Create(radioMetadata, new[] { c2dMessageCheckTimeSpan, c2dMessageCheckTimeSpan, additionalMessageCheckTimeSpan, downlinkDeliveryTimeSpan }, downstreamMessageSender: downstreamMessageSender, loRaPayload: loRaPayloadData));
        }
 public DefaultClassCDevicesMessageSender(
     NetworkServerConfiguration configuration,
     ILoRaDeviceRegistry loRaDeviceRegistry,
     IDownstreamMessageSender downstreamMessageSender,
     ILoRaDeviceFrameCounterUpdateStrategyProvider frameCounterUpdateStrategyProvider,
     ILogger <DefaultClassCDevicesMessageSender> logger,
     Meter meter)
 {
     this.configuration                      = configuration;
     this.loRaDeviceRegistry                 = loRaDeviceRegistry;
     this.downstreamMessageSender            = downstreamMessageSender;
     this.frameCounterUpdateStrategyProvider = frameCounterUpdateStrategyProvider;
     this.logger            = logger;
     this.c2dMessageTooLong = meter?.CreateCounter <int>(MetricRegistry.C2DMessageTooLong);
 }
예제 #6
0
 public LnsProtocolMessageProcessor(IBasicsStationConfigurationService basicsStationConfigurationService,
                                    WebSocketWriterRegistry <StationEui, string> socketWriterRegistry,
                                    IDownstreamMessageSender downstreamMessageSender,
                                    IMessageDispatcher messageDispatcher,
                                    ILogger <LnsProtocolMessageProcessor> logger,
                                    RegistryMetricTagBag registryMetricTagBag,
                                    Meter meter)
 {
     this.basicsStationConfigurationService = basicsStationConfigurationService;
     this.socketWriterRegistry    = socketWriterRegistry;
     this.downstreamMessageSender = downstreamMessageSender;
     this.messageDispatcher       = messageDispatcher;
     this.logger = logger;
     this.registryMetricTagBag    = registryMetricTagBag;
     this.joinRequestCounter      = meter?.CreateCounter <int>(MetricRegistry.JoinRequests);
     this.uplinkMessageCounter    = meter?.CreateCounter <int>(MetricRegistry.D2CMessagesReceived);
     this.unhandledExceptionCount = meter?.CreateCounter <int>(MetricRegistry.UnhandledExceptions);
 }
 public static WaitableLoRaRequest CreateWaitableRequest(LoRaPayload loRaPayload,
                                                         IDownstreamMessageSender downstreamMessageSender = null) =>
 Create(TestUtils.GenerateTestRadioMetadata(),
        loRaPayload,
        downstreamMessageSender);
 private WaitableLoRaRequest(RadioMetadata radioMetadata, IDownstreamMessageSender downstreamMessageSender, DateTime startTime)
     : base(radioMetadata, downstreamMessageSender, startTime)
 {
 }