Beispiel #1
0
 internal FunctionBundler(string devEui, LoRaDeviceAPIServiceBase deviceApi, FunctionBundlerRequest request, IList <IFunctionBundlerExecutionItem> executionItems, FunctionBundlerExecutionContext executionContext)
 {
     this.devEui           = devEui;
     this.deviceApi        = deviceApi;
     this.request          = request;
     this.executionItems   = executionItems;
     this.executionContext = executionContext;
 }
Beispiel #2
0
 public void Prepare(FunctionBundlerExecutionContext context, FunctionBundlerRequest request)
 {
     if (request is null)
     {
         throw new ArgumentNullException(nameof(request));
     }
     request.FunctionItems |= FunctionBundlerItemType.FCntDown;
 }
Beispiel #3
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));
        }
Beispiel #4
0
 internal FunctionBundler(DevEui devEui,
                          LoRaDeviceAPIServiceBase deviceApi,
                          FunctionBundlerRequest request,
                          IList <IFunctionBundlerExecutionItem> executionItems,
                          FunctionBundlerExecutionContext executionContext,
                          ILogger <FunctionBundler> logger)
 {
     this.devEui           = devEui;
     this.deviceApi        = deviceApi;
     this.request          = request;
     this.executionItems   = executionItems;
     this.executionContext = executionContext;
     this.logger           = logger;
 }
        public void Prepare(FunctionBundlerExecutionContext context, FunctionBundlerRequest request)
        {
            request.AdrRequest = new LoRaADRRequest
            {
                DataRate              = context.Request.Region.GetDRFromFreqAndChan(context.Request.Rxpk.Datr),
                FCntDown              = context.FCntDown,
                FCntUp                = context.FCntUp,
                GatewayId             = context.GatewayId,
                MinTxPowerIndex       = context.Request.Region.TXPowertoMaxEIRP.Count - 1,
                PerformADRCalculation = context.LoRaPayload.IsAdrReq,
                RequiredSnr           = (float)context.Request.Rxpk.RequiredSnr
            };

            request.FunctionItems |= FunctionBundlerItemType.ADR;
        }
Beispiel #6
0
        public void Prepare(FunctionBundlerExecutionContext context, FunctionBundlerRequest request)
        {
            if (context is null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (request is null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            request.AdrRequest = new LoRaADRRequest
            {
                DataRate              = context.Request.RadioMetadata.DataRate,
                FCntDown              = context.FCntDown,
                FCntUp                = context.FCntUp,
                GatewayId             = context.GatewayId,
                MinTxPowerIndex       = context.Request.Region.TXPowertoMaxEIRP.Count - 1,
                PerformADRCalculation = context.LoRaPayload.IsAdrAckRequested,
                RequiredSnr           = (float)context.Request.Region.RequiredSnr(context.Request.RadioMetadata.DataRate)
            };

            request.FunctionItems |= FunctionBundlerItemType.ADR;
        }
 public abstract Task <FunctionBundlerResult> ExecuteFunctionBundlerAsync(string devEUI, FunctionBundlerRequest request);
Beispiel #8
0
 public void Prepare(FunctionBundlerExecutionContext context, FunctionBundlerRequest request)
 {
     request.FunctionItems |= FunctionBundlerItemType.FCntDown;
 }
        public override async Task <FunctionBundlerResult> ExecuteFunctionBundlerAsync(string devEUI, FunctionBundlerRequest request)
        {
            var client = this.serviceFacadeHttpClientProvider.GetHttpClient();
            var url    = $"{this.URL}FunctionBundler/{devEUI}?code={this.AuthCode}";

            var requestBody = JsonConvert.SerializeObject(request);

            var response = await client.PostAsync(url, PreparePostContent(requestBody));

            if (!response.IsSuccessStatusCode)
            {
                Logger.Log(devEUI, $"error calling the bundling function, check the function log. {response.ReasonPhrase}", LogLevel.Error);
                return(null);
            }

            var payload = await response.Content.ReadAsStringAsync();

            return(JsonConvert.DeserializeObject <FunctionBundlerResult>(payload));
        }
        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>()));
        }
Beispiel #11
0
        public void Prepare(FunctionBundlerExecutionContext context, FunctionBundlerRequest request)
        {
            request.FunctionItems |= FunctionBundlerItemType.PreferredGateway;

            Logger.Log(context.LoRaDevice.DevEUI, "FunctionBundler ADR request finished preparing.", LogLevel.Debug);
        }