/// <summary> /// Publish MQTT message /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { // Get id of device var deviceId = e.Topic.Split('/')[2]; if (e.Message.Length < 200) { // ignore rogue messages return; } WriteLine("MQTT handling uplink"); // Create or get device var device = await AddDeviceAsync(deviceId); if (!_whiteList.Accept(deviceId)) { WriteLine($"Device {deviceId} is not whitelisted"); return; } if (device.Status != DeviceStatus.Enabled) { WriteLine($"Device {deviceId} disabled"); return; } // Convert message to json var jsonText = Encoding.UTF8.GetString(e.Message); dynamic jsonObject = JsonConvert.DeserializeObject(jsonText); var counter = jsonObject.counter?.ToString(); var deviceMessage = jsonObject.payload_fields?.ToString(); if (string.IsNullOrEmpty(deviceMessage)) { WriteLine($"Device {deviceId} seen"); return; } var metadata = jsonObject.metadata; var frequency = metadata?.frequency?.ToString(); var gateway = metadata?.gateways?[0]; var gatewayEui = gateway?.gtw_id?.ToString(); var latitude = gateway?.latitude?.ToString(); var longitude = gateway?.longitude?.ToString(); var rssi = gateway?.rssi?.ToString(); // construct message for IoT Hub dynamic iotHubMessage = JsonConvert.DeserializeObject(deviceMessage); if (_addGatewayInfo) { iotHubMessage.ttnCounter = jsonObject.counter ?? -1; iotHubMessage.ttnGatewayEui = gateway?.gtw_id?.ToString(); iotHubMessage.ttnGatewayLat = gateway?.latitude ?? 0.0; iotHubMessage.ttnGatewayLon = gateway?.longitude ?? 0.0; iotHubMessage.ttnGatewayFreq = metadata?.frequency ?? 0.0; iotHubMessage.ttnGatewayRssi = gateway?.rssi ?? 0; } var iotHubMessageString = JsonConvert.SerializeObject(iotHubMessage); Write($"{DateTime.Now:HH:mm:ss} Message received ({counter}/{deviceId}/{gatewayEui}/{latitude}/{longitude}/{frequency}/{rssi}): {iotHubMessageString}"); // create device client var key = (_deviceKeyKind == "Primary") ? device.Authentication.SymmetricKey.PrimaryKey : device.Authentication.SymmetricKey.SecondaryKey; var deviceClient = _deviceClientList.GetDeviceClient(deviceId, key); // send message var message = new Microsoft.Azure.Devices.Client.Message(Encoding.UTF8.GetBytes(iotHubMessageString)); await deviceClient.SendEventAsync(message); WriteLine("-IoT Hub message sent"); }
/// <summary> /// Publish MQTT message /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static async void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { Console.WriteLine("MQTT handling uplink"); // Convert message to json var jsonText = Encoding.ASCII.GetString(e.Message); dynamic jsonMessage = JsonConvert.DeserializeObject(jsonText); // Get id of device var deviceId = (string)jsonMessage.dev_eui; // Create or get device var device = (Device) await AddDeviceAsync(deviceId); if (device.Status != DeviceStatus.Enabled) { Console.WriteLine($"Device {deviceId} disabled"); return; } // extract data from json var deviceMessage = jsonMessage.fields.ToString(); var metaText = jsonMessage.metadata.ToString(); var jsonMeta = JsonConvert.DeserializeObject(metaText); var time = jsonMeta[0].server_time.ToString(); // construct message for IoT Hub dynamic iotHubMessage = JsonConvert.DeserializeObject(deviceMessage); iotHubMessage.deviceId = deviceId; iotHubMessage.time = time; string iotHubMessageString = JsonConvert.SerializeObject(iotHubMessage); Console.WriteLine($"IoT Hub message {iotHubMessageString}"); // create device client var key = string.Empty; if (ConfigurationManager.AppSettings["DeviceKeyKind"] == "Primary") { key = device.Authentication.SymmetricKey.PrimaryKey; } else { key = device.Authentication.SymmetricKey.SecondaryKey; } var deviceClient = _deviceClientList.GetDeviceClient(deviceId, key); // send message var message = new Message(Encoding.UTF8.GetBytes(iotHubMessageString)); await deviceClient.SendEventAsync(message); Console.WriteLine("IoT Hub message sent"); }