using MQTTnet; using MQTTnet.Client; using System.Text.Json; namespace MqttSensorApp { // TODO: Aufgabe 3: Implementieren Sie die SensorData-Klasse public class SensorData { // TODO: Ergänzen Sie Properties für Temperature, Humidity und Location // Nutzen Sie JsonPropertyName-Attribute für die JSON-Deserialisierung } public class Program { private static List receivedTemperatures = new List(); public static async Task Main(string[] args) { Console.WriteLine("MQTT Sensor Data Processor gestartet..."); // MQTT Client Setup (bereits implementiert) var factory = new MqttFactory(); var client = factory.CreateMqttClient(); // Event Handler für empfangene Nachrichten client.ApplicationMessageReceivedAsync += async e => { var payload = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload); await ProcessMessage(payload); }; // Verbindungsoptionen var options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com", 1883) .WithClientId($"SensorClient_{Guid.NewGuid()}") .WithCleanSession() .Build(); try { // Verbindung aufbauen await client.ConnectAsync(options); Console.WriteLine("Mit MQTT Broker verbunden"); // Topic abonnieren await client.SubscribeAsync("sensor/data/room1"); Console.WriteLine("Topic 'sensor/data/room1' abonniert"); // Simulierte Sensordaten senden (für Testing) await SendTestData(client); // Programm laufen lassen Console.WriteLine("Drücken Sie eine Taste zum Beenden..."); Console.ReadKey(); // Verbindung trennen await client.DisconnectAsync(); } catch (Exception ex) { Console.WriteLine($"Fehler: {ex.Message}"); } } private static async Task ProcessMessage(string jsonPayload) { try { Console.WriteLine($"Empfangen: {jsonPayload}"); // TODO: Aufgabe 3: Deserialisieren Sie den JSON zu SensorData // var sensorData = JsonSerializer.Deserialize(jsonPayload); // Temporäre Lösung für Aufgabe 1 und 2 var data = JsonSerializer.Deserialize>(jsonPayload); if (data != null && data.ContainsKey("temperature")) { var temp = Convert.ToDouble(data["temperature"].ToString()); receivedTemperatures.Add(temp); // Nachricht analysieren var analysis = AnalyzeMessage(temp); Console.WriteLine($"Analyse: {analysis}"); } // Alle 5 Nachrichten: Hohe Temperaturen anzeigen if (receivedTemperatures.Count % 5 == 0) { var highTemps = FilterHighTemperatures(receivedTemperatures); Console.WriteLine($"Hohe Temperaturen (>25°C): {string.Join(", ", highTemps.Select(t => $"{t:F1}°C"))}"); } } catch (Exception ex) { Console.WriteLine($"Fehler beim Verarbeiten der Nachricht: {ex.Message}"); } } // TODO: Aufgabe 1: LINQ-Abfrage implementieren private static IEnumerable FilterHighTemperatures(List temperatures) { // TODO: Verwenden Sie LINQ (Where-Klausel), um alle Temperaturen > 25°C zu filtern // Beispiel: return temperatures.Where(...); return new List(); // Platzhalter, ersetzen Sie diese Zeile } // TODO: Aufgabe 2: Pattern Matching implementieren private static string AnalyzeMessage(object value) { // TODO: Implementieren Sie Pattern Matching mit switch expression // Behandeln Sie folgende Fälle: // - double über 30: "WARNUNG: Sehr hohe Temperatur!" // - double zwischen 25-30: "Hohe Temperatur" // - double unter 25: "Normale Temperatur" // - string: "Text-Nachricht erhalten" // - null: "Keine Daten" // - default: "Unbekannter Datentyp" return "TODO: Pattern Matching implementieren"; // Platzhalter } // Hilfsmethode: Testnachrichten senden private static async Task SendTestData(IMqttClient client) { var testData = new[] { new { temperature = 22.5, humidity = 65.0, location = "Room1" }, new { temperature = 28.3, humidity = 58.2, location = "Room1" }, new { temperature = 19.8, humidity = 72.1, location = "Room1" }, new { temperature = 31.2, humidity = 45.3, location = "Room1" }, new { temperature = 26.7, humidity = 62.8, location = "Room1" } }; foreach (var data in testData) { var json = JsonSerializer.Serialize(data); var message = new MqttApplicationMessageBuilder() .WithTopic("sensor/data/room1") .WithPayload(json) .Build(); await client.PublishAsync(message); await Task.Delay(2000); // 2 Sekunden Pause } } } }