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; }
public void Prepare(FunctionBundlerExecutionContext context, FunctionBundlerRequest request) { if (request is null) { throw new ArgumentNullException(nameof(request)); } request.FunctionItems |= FunctionBundlerItemType.FCntDown; }
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)); }
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; }
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);
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>())); }
public void Prepare(FunctionBundlerExecutionContext context, FunctionBundlerRequest request) { request.FunctionItems |= FunctionBundlerItemType.PreferredGateway; Logger.Log(context.LoRaDevice.DevEUI, "FunctionBundler ADR request finished preparing.", LogLevel.Debug); }