Ejemplo n.º 1
0
        public FunctionBundler CreateIfRequired(
            string gatewayId,
            LoRaPayloadData loRaPayload,
            LoRaDevice loRaDevice,
            IDeduplicationStrategyFactory deduplicationFactory,
            LoRaRequest request)
        {
            if (!string.IsNullOrEmpty(loRaDevice.GatewayID))
            {
                // single gateway mode
                return(null);
            }

            var context = new FunctionBundlerExecutionContext
            {
                DeduplicationFactory = deduplicationFactory,
                FCntDown             = loRaDevice.FCntDown,
                FCntUp      = loRaPayload.GetFcnt(),
                GatewayId   = gatewayId,
                LoRaDevice  = loRaDevice,
                LoRaPayload = loRaPayload,
                Request     = request
            };

            var qualifyingExecutionItems = new List <IFunctionBundlerExecutionItem>(functionItems.Count);

            for (var i = 0; i < functionItems.Count; i++)
            {
                var itm = functionItems[i];
                if (itm.RequiresExecution(context))
                {
                    qualifyingExecutionItems.Add(itm);
                }
            }

            if (qualifyingExecutionItems.Count == 0)
            {
                return(null);
            }

            var bundlerRequest = new FunctionBundlerRequest
            {
                ClientFCntDown = context.FCntDown,
                ClientFCntUp   = context.FCntUp,
                GatewayId      = gatewayId,
                Rssi           = context.Request.Rxpk.Rssi,
            };

            for (var i = 0; i < qualifyingExecutionItems.Count; i++)
            {
                qualifyingExecutionItems[i].Prepare(context, bundlerRequest);
            }

            Logger.Log(loRaDevice.DevEUI, "FunctionBundler request: ", bundlerRequest, LogLevel.Debug);

            return(new FunctionBundler(loRaDevice.DevEUI, this.deviceApi, bundlerRequest, qualifyingExecutionItems, context));
        }
Ejemplo n.º 2
0
 public FunctionBundlerExecutionContext(string gatewayId, uint fCntUp, uint fCntDown,
                                        LoRaPayloadData loRaPayload, LoRaDevice loRaDevice,
                                        IDeduplicationStrategyFactory deduplicationFactory, LoRaRequest request)
 {
     GatewayId            = gatewayId;
     FCntUp               = fCntUp;
     FCntDown             = fCntDown;
     LoRaPayload          = loRaPayload;
     LoRaDevice           = loRaDevice;
     DeduplicationFactory = deduplicationFactory;
     Request              = request;
 }
 public DefaultLoRaDataRequestHandler(
     NetworkServerConfiguration configuration,
     ILoRaDeviceFrameCounterUpdateStrategyProvider frameCounterUpdateStrategyProvider,
     ILoRaPayloadDecoder payloadDecoder,
     IDeduplicationStrategyFactory deduplicationFactory,
     ILoRaADRStrategyProvider loRaADRStrategyProvider,
     ILoRAADRManagerFactory loRaADRManagerFactory,
     IFunctionBundlerProvider functionBundlerProvider,
     IClassCDeviceMessageSender classCDeviceMessageSender = null)
 {
     this.configuration = configuration;
     this.frameCounterUpdateStrategyProvider = frameCounterUpdateStrategyProvider;
     this.payloadDecoder            = payloadDecoder;
     this.deduplicationFactory      = deduplicationFactory;
     this.classCDeviceMessageSender = classCDeviceMessageSender;
     this.loRaADRStrategyProvider   = loRaADRStrategyProvider;
     this.loRaADRManagerFactory     = loRaADRManagerFactory;
     this.functionBundlerProvider   = functionBundlerProvider;
 }
 public TestLoRaDeviceFactory(
     NetworkServerConfiguration configuration,
     ILoRaDeviceFrameCounterUpdateStrategyProvider frameCounterUpdateStrategyProvider,
     ILoRaDeviceClient loRaDeviceClient,
     IDeduplicationStrategyFactory deduplicationFactory,
     ILoRaADRStrategyProvider adrStrategyProvider,
     ILoRAADRManagerFactory adrManagerFactory,
     IFunctionBundlerProvider functionBundlerProvider,
     ILoRaDeviceClientConnectionManager connectionManager)
     : this(loRaDeviceClient)
 {
     this.configuration = configuration;
     this.frameCounterUpdateStrategyProvider = frameCounterUpdateStrategyProvider;
     this.deduplicationFactory    = deduplicationFactory;
     this.adrStrategyProvider     = adrStrategyProvider;
     this.adrManagerFactory       = adrManagerFactory;
     this.functionBundlerProvider = functionBundlerProvider;
     this.connectionManager       = connectionManager;
 }
 public TestDefaultLoRaRequestHandler(
     NetworkServerConfiguration configuration,
     ILoRaDeviceFrameCounterUpdateStrategyProvider frameCounterUpdateStrategyProvider,
     IConcentratorDeduplication concentratorDeduplication,
     ILoRaPayloadDecoder payloadDecoder,
     IDeduplicationStrategyFactory deduplicationFactory,
     ILoRaADRStrategyProvider loRaADRStrategyProvider,
     ILoRAADRManagerFactory loRaADRManagerFactory,
     IFunctionBundlerProvider functionBundlerProvider,
     ITestOutputHelper testOutputHelper) : base(
         configuration,
         frameCounterUpdateStrategyProvider,
         concentratorDeduplication,
         payloadDecoder,
         deduplicationFactory,
         loRaADRStrategyProvider,
         loRaADRManagerFactory,
         functionBundlerProvider,
         new TestOutputLogger <DefaultLoRaDataRequestHandler>(testOutputHelper),
         TestMeter.Instance)
 {
     this.configuration = configuration;
 }
        public FunctionBundler CreateIfRequired(
            string gatewayId,
            LoRaPayloadData loRaPayload,
            LoRaDevice loRaDevice,
            IDeduplicationStrategyFactory deduplicationFactory,
            LoRaRequest request)
        {
            if (loRaPayload is null)
            {
                throw new System.ArgumentNullException(nameof(loRaPayload));
            }
            if (loRaDevice is null)
            {
                throw new System.ArgumentNullException(nameof(loRaDevice));
            }
            if (!string.IsNullOrEmpty(loRaDevice.GatewayID))
            {
                // single gateway mode
                return(null);
            }

            var context = new FunctionBundlerExecutionContext(gatewayId, loRaPayload.Fcnt, loRaDevice.FCntDown,
                                                              loRaPayload, loRaDevice, deduplicationFactory, request);

            var qualifyingExecutionItems = new List <IFunctionBundlerExecutionItem>(functionItems.Count);

            for (var i = 0; i < functionItems.Count; i++)
            {
                var itm = functionItems[i];
                if (itm.RequiresExecution(context))
                {
                    qualifyingExecutionItems.Add(itm);
                }
            }

            if (qualifyingExecutionItems.Count == 0)
            {
                return(null);
            }

            var bundlerRequest = new FunctionBundlerRequest
            {
                ClientFCntDown = context.FCntDown,
                ClientFCntUp   = context.FCntUp,
                GatewayId      = gatewayId,
                Rssi           = context.Request.RadioMetadata.UpInfo.ReceivedSignalStrengthIndication,
            };

            for (var i = 0; i < qualifyingExecutionItems.Count; i++)
            {
                qualifyingExecutionItems[i].Prepare(context, bundlerRequest);
                this.logger.LogDebug("FunctionBundler request finished preparing.");
            }

            if (this.logger.IsEnabled(LogLevel.Debug))
            {
                this.logger.LogDebug($"FunctionBundler request: {JsonSerializer.Serialize(bundlerRequest)}");
            }

            return(new FunctionBundler(loRaDevice.DevEUI, this.deviceApi, bundlerRequest, qualifyingExecutionItems, context, loggerFactory.CreateLogger <FunctionBundler>()));
        }