public async Task <IActionResult> GetDeviceByDevEUI([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log, ExecutionContext context) { try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { log.LogError(ex, "Invalid version"); return(new BadRequestObjectResult(ex.Message)); } return(await this.RunGetDeviceByDevEUI(req, log, context, ApiVersion.LatestVersion)); }
public async Task <IActionResult> GetDevice( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { return(new BadRequestObjectResult(ex.Message)); } // ABP parameters string devAddr = req.Query["DevAddr"]; // OTAA parameters string devEUI = req.Query["DevEUI"]; string devNonce = req.Query["DevNonce"]; string gatewayId = req.Query["GatewayId"]; if (devEUI != null) { EUIValidator.ValidateDevEUI(devEUI); } try { var results = await this.GetDeviceList(devEUI, gatewayId, devNonce, devAddr, log); string json = JsonConvert.SerializeObject(results); return(new OkObjectResult(json)); } catch (DeviceNonceUsedException) { return(new BadRequestObjectResult("UsedDevNonce")); } catch (JoinRefusedException ex) { log.LogDebug("Join refused: {msg}", ex.Message); return(new BadRequestObjectResult("JoinRefused: " + ex.Message)); } catch (ArgumentException ex) { return(new BadRequestObjectResult(ex.Message)); } }
public async Task <IActionResult> GetDeviceByDevEUI([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { if (req is null) { throw new ArgumentNullException(nameof(req)); } try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { log.LogError(ex, "Invalid version"); return(new BadRequestObjectResult(ex.Message)); } return(await RunGetDeviceByDevEUI(req, log)); }
public async Task <IActionResult> FetchConcentratorCredentials([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, CancellationToken cancellationToken) { if (req is null) { throw new ArgumentNullException(nameof(req)); } try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { this.logger.LogError(ex, "Invalid version"); return(new BadRequestObjectResult(ex.Message)); } return(await RunFetchConcentratorCredentials(req, cancellationToken)); }
public IActionResult NextFCntDownInvoke( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { return(new BadRequestObjectResult(ex.Message)); } string devEUI = req.Query["DevEUI"]; string fCntDown = req.Query["FCntDown"]; string fCntUp = req.Query["FCntUp"]; string gatewayId = req.Query["GatewayId"]; string abpFcntCacheReset = req.Query["ABPFcntCacheReset"]; uint newFCntDown = 0; EUIValidator.ValidateDevEUI(devEUI); if (!string.IsNullOrEmpty(abpFcntCacheReset)) { this.deviceCache.KeyDelete(devEUI); return((ActionResult) new OkObjectResult(null)); } // validate input parameters if (!uint.TryParse(fCntDown, out uint clientFCntDown) || !uint.TryParse(fCntUp, out uint clientFCntUp) || string.IsNullOrEmpty(gatewayId)) { string errorMsg = "Missing FCntDown or FCntUp or GatewayId"; throw new ArgumentException(errorMsg); } newFCntDown = this.GetNextFCntDown(devEUI, gatewayId, clientFCntUp, clientFCntDown); return((ActionResult) new OkObjectResult(newFCntDown)); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = "cloudtodevicemessage/{devEUI}")] HttpRequest req, string devEUI) { DevEui parsedDevEui; try { VersionValidator.Validate(req); if (!DevEui.TryParse(devEUI, EuiParseOptions.ForbidInvalid, out parsedDevEui)) { return(new BadRequestObjectResult("Dev EUI is invalid.")); } } catch (IncompatibleVersionException ex) { return(new BadRequestObjectResult(ex.Message)); } catch (ArgumentException ex) { return(new BadRequestObjectResult(ex.Message)); } var requestBody = await req.ReadAsStringAsync(); if (string.IsNullOrEmpty(requestBody)) { return(new BadRequestObjectResult("missing body")); } var c2dMessage = JsonConvert.DeserializeObject <LoRaCloudToDeviceMessage>(requestBody); c2dMessage.DevEUI = parsedDevEui; return(await SendCloudToDeviceMessageImplementationAsync(parsedDevEui, c2dMessage)); }
public async Task <IActionResult> GetDevice( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { if (req is null) { throw new ArgumentNullException(nameof(req)); } try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { return(new BadRequestObjectResult(ex.Message)); } // ABP parameters string devAddrString = req.Query["DevAddr"]; // OTAA parameters string rawDevEui = req.Query["DevEUI"]; string rawDevNonce = req.Query["DevNonce"]; var gatewayId = req.Query["GatewayId"]; DevEui?devEui = null; if (!string.IsNullOrEmpty(rawDevEui)) { if (DevEui.TryParse(rawDevEui, EuiParseOptions.ForbidInvalid, out var parsedDevEui)) { devEui = parsedDevEui; } else { return(new BadRequestObjectResult("Dev EUI is invalid.")); } } try { DevNonce?devNonce = ushort.TryParse(rawDevNonce, NumberStyles.None, CultureInfo.InvariantCulture, out var d) ? new DevNonce(d) : null; DevAddr? devAddr = DevAddr.TryParse(devAddrString, out var someDevAddr) ? someDevAddr : null; var results = await GetDeviceList(devEui, gatewayId, devNonce, devAddr, log); var json = JsonConvert.SerializeObject(results); return(new OkObjectResult(json)); } catch (DeviceNonceUsedException) { return(new BadRequestObjectResult("UsedDevNonce")); } catch (JoinRefusedException ex) { log.LogDebug("Join refused: {msg}", ex.Message); return(new BadRequestObjectResult("JoinRefused: " + ex.Message)); } catch (ArgumentException ex) { return(new BadRequestObjectResult(ex.Message)); } }
public async Task <IActionResult> NextFCntDownInvoke( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { if (req is null) { throw new ArgumentNullException(nameof(req)); } try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { return(new BadRequestObjectResult(ex.Message)); } string rawDevEui = req.Query["DevEUI"]; var fCntDown = req.Query["FCntDown"]; var fCntUp = req.Query["FCntUp"]; var gatewayId = req.Query["GatewayId"]; var abpFcntCacheReset = req.Query["ABPFcntCacheReset"]; if (!DevEui.TryParse(rawDevEui, EuiParseOptions.ForbidInvalid, out var devEui)) { return(new BadRequestObjectResult("Dev EUI is invalid.")); } if (!uint.TryParse(fCntUp, out var clientFCntUp)) { throw new ArgumentException("Missing FCntUp"); } if (abpFcntCacheReset != StringValues.Empty) { using (var deviceCache = new LoRaDeviceCache(this.deviceCache, devEui, gatewayId)) { if (await deviceCache.TryToLockAsync()) { if (deviceCache.TryGetInfo(out var deviceInfo)) { // only reset the cache if the current value is larger // than 1 otherwise we likely reset it from another device // and continued processing if (deviceInfo.FCntUp > 1) { log.LogDebug("Resetting cache for device {devEUI}. FCntUp: {fcntup}", devEui, deviceInfo.FCntUp); deviceCache.ClearCache(); } } } } return(new OkObjectResult(null)); } // validate input parameters if (!uint.TryParse(fCntDown, out var clientFCntDown) || StringValues.IsNullOrEmpty(gatewayId)) { var errorMsg = "Missing FCntDown or GatewayId"; throw new ArgumentException(errorMsg); } var newFCntDown = await GetNextFCntDownAsync(devEui, gatewayId, clientFCntUp, clientFCntDown); return(new OkObjectResult(newFCntDown)); }
public async Task <IActionResult> NextFCntDownInvoke( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { try { VersionValidator.Validate(req); } catch (IncompatibleVersionException ex) { return(new BadRequestObjectResult(ex.Message)); } string devEUI = req.Query["DevEUI"]; string fCntDown = req.Query["FCntDown"]; string fCntUp = req.Query["FCntUp"]; string gatewayId = req.Query["GatewayId"]; string abpFcntCacheReset = req.Query["ABPFcntCacheReset"]; uint newFCntDown = 0; EUIValidator.ValidateDevEUI(devEUI); if (!uint.TryParse(fCntUp, out uint clientFCntUp)) { string errorMsg = "Missing FCntUp"; throw new ArgumentException(errorMsg); } if (!string.IsNullOrEmpty(abpFcntCacheReset)) { using (var deviceCache = new LoRaDeviceCache(this.deviceCache, devEUI, gatewayId)) { if (await deviceCache.TryToLockAsync()) { if (deviceCache.TryGetInfo(out var deviceInfo)) { // only reset the cache if the current value is larger // than 1 otherwise we likely reset it from another device // and continued processing if (deviceInfo.FCntUp > 1) { log.LogDebug("Resetting cache. FCntUp: {fcntup}", deviceInfo.FCntUp); deviceCache.ClearCache(); } } } } return((ActionResult) new OkObjectResult(null)); } // validate input parameters if (!uint.TryParse(fCntDown, out uint clientFCntDown) || string.IsNullOrEmpty(gatewayId)) { string errorMsg = "Missing FCntDown or GatewayId"; throw new ArgumentException(errorMsg); } newFCntDown = await this.GetNextFCntDownAsync(devEUI, gatewayId, clientFCntUp, clientFCntDown); return((ActionResult) new OkObjectResult(newFCntDown)); }