public async Task <bool> SendEventAsync(LoRaDeviceTelemetry telemetry, Dictionary <string, string> properties) { if (telemetry != null) { try { var messageJson = JsonConvert.SerializeObject(telemetry, Formatting.None); using var message = new Message(Encoding.UTF8.GetBytes(messageJson)); this.logger.LogDebug($"sending message {messageJson} to hub"); message.ContentType = System.Net.Mime.MediaTypeNames.Application.Json; message.ContentEncoding = Encoding.UTF8.BodyName; if (properties != null) { foreach (var prop in properties) { message.Properties.Add(prop); } } await this.deviceClient.SendEventAsync(message); return(true); } catch (OperationCanceledException ex) when(ExceptionFilterUtility.True(() => this.logger.LogError($"could not send message to IoTHub/Edge with error: {ex.Message}"))) { // continue } } return(false); }
// Sends device telemetry data to IoT Hub private async Task <bool> SendDeviceEventAsync(LoRaDevice loRaDevice, Rxpk rxpk, object decodedValue, LoRaPayloadData loRaPayloadData, LoRaOperationTimeWatcher timeWatcher) { var deviceTelemetry = new LoRaDeviceTelemetry(rxpk, loRaPayloadData, decodedValue) { DeviceEUI = loRaDevice.DevEUI, GatewayID = this.configuration.GatewayID, Edgets = (long)(timeWatcher.Start - DateTime.UnixEpoch).TotalMilliseconds }; Dictionary <string, string> eventProperties = null; if (loRaPayloadData.IsUpwardAck()) { eventProperties = new Dictionary <string, string>(); Logger.Log(loRaDevice.DevEUI, $"Message ack received for C2D message id {loRaDevice.LastConfirmedC2DMessageID}", LogLevel.Information); eventProperties.Add(C2D_MSG_PROPERTY_VALUE_NAME, loRaDevice.LastConfirmedC2DMessageID ?? C2D_MSG_ID_PLACEHOLDER); loRaDevice.LastConfirmedC2DMessageID = null; } var macCommand = loRaPayloadData.GetMacCommands(); if (macCommand.MacCommand.Count > 0) { eventProperties = eventProperties ?? new Dictionary <string, string>(); for (int i = 0; i < macCommand.MacCommand.Count; i++) { eventProperties[macCommand.MacCommand[i].Cid.ToString()] = JsonConvert.SerializeObject(macCommand.MacCommand[i], Formatting.None); // in case it is a link check mac, we need to send it downstream. if (macCommand.MacCommand[i].Cid == CidEnum.LinkCheckCmd) { // linkCheckCmdResponse = new LinkCheckCmd(rxPk.GetModulationMargin(), 1).ToBytes(); } } } if (await loRaDevice.SendEventAsync(deviceTelemetry, eventProperties)) { var payloadAsRaw = deviceTelemetry.Data as string; if (payloadAsRaw == null && deviceTelemetry.Data != null) { payloadAsRaw = JsonConvert.SerializeObject(deviceTelemetry.Data, Formatting.None); } Logger.Log(loRaDevice.DevEUI, $"message '{payloadAsRaw}' sent to hub", LogLevel.Information); return(true); } return(false); }
public async Task <bool> SendEventAsync(LoRaDeviceTelemetry telemetry, Dictionary <string, string> properties) { if (telemetry != null) { try { this.deviceClient.OperationTimeoutInMilliseconds = 120000; // Enable retry for this send message, off by default this.SetRetry(true); var messageJson = JsonConvert.SerializeObject(telemetry, Formatting.None); var message = new Message(Encoding.UTF8.GetBytes(messageJson)); Logger.Log(this.devEUI, $"sending message {messageJson} to hub", LogLevel.Debug); message.ContentType = System.Net.Mime.MediaTypeNames.Application.Json; message.ContentEncoding = Encoding.UTF8.BodyName; if (properties != null) { foreach (var prop in properties) { message.Properties.Add(prop); } } await this.deviceClient.SendEventAsync(message); Logger.Log(this.devEUI, $"sent message {messageJson} to hub", LogLevel.Debug); return(true); } catch (Exception ex) { Logger.Log(this.devEUI, $"could not send message to IoTHub/Edge with error: {ex.Message}", LogLevel.Error); } finally { // disable retry, this allows the server to close the connection if another gateway tries to open the connection for the same device this.SetRetry(false); } } return(false); }
private async Task <bool> SendDeviceEventAsync(LoRaRequest request, LoRaDevice loRaDevice, LoRaOperationTimeWatcher timeWatcher, object decodedValue, DeduplicationResult deduplicationResult, byte[] decryptedPayloadData) { var loRaPayloadData = (LoRaPayloadData)request.Payload; var deviceTelemetry = new LoRaDeviceTelemetry(request.Rxpk, loRaPayloadData, decodedValue, decryptedPayloadData) { DeviceEUI = loRaDevice.DevEUI, GatewayID = this.configuration.GatewayID, Edgets = (long)(timeWatcher.Start - DateTime.UnixEpoch).TotalMilliseconds }; if (deduplicationResult != null && deduplicationResult.IsDuplicate) { deviceTelemetry.DupMsg = true; } Dictionary <string, string> eventProperties = null; if (loRaPayloadData.IsUpwardAck()) { eventProperties = new Dictionary <string, string>(); Logger.Log(loRaDevice.DevEUI, $"message ack received for cloud to device message id {loRaDevice.LastConfirmedC2DMessageID}", LogLevel.Information); eventProperties.Add(Constants.C2D_MSG_PROPERTY_VALUE_NAME, loRaDevice.LastConfirmedC2DMessageID ?? Constants.C2D_MSG_ID_PLACEHOLDER); loRaDevice.LastConfirmedC2DMessageID = null; } this.ProcessAndSendMacCommands(loRaPayloadData, ref eventProperties); if (await loRaDevice.SendEventAsync(deviceTelemetry, eventProperties)) { string payloadAsRaw = null; if (deviceTelemetry.Data != null) { payloadAsRaw = JsonConvert.SerializeObject(deviceTelemetry.Data, Formatting.None); } Logger.Log(loRaDevice.DevEUI, $"message '{payloadAsRaw}' sent to hub", LogLevel.Information); return(true); } return(false); }