using MQTTnet; using MQTTnet.Client; using System.Text.Json; using System.Text.Json.Serialization; namespace MqttSensorApp { // LÖSUNG Aufgabe 3: SensorData-Klasse implementieren public class SensorData { [JsonPropertyName("temperature")] public double Temperature { get; set; } [JsonPropertyName("humidity")] public double Humidity { get; set; } [JsonPropertyName("location")] public string Location { get; set; } = string.Empty; } 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}"); // LÖSUNG Aufgabe 3: Deserialisieren des JSON zu SensorData var sensorData = JsonSerializer.Deserialize(jsonPayload); if (sensorData != null) { receivedTemperatures.Add(sensorData.Temperature); // LÖSUNG Aufgabe 2: Pattern Matching anwenden var analysis = AnalyzeMessage(sensorData.Temperature); 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}"); } } // LÖSUNG Aufgabe 1: LINQ-Abfrage implementieren private static IEnumerable FilterHighTemperatures(List temperatures) { // LINQ Where-Klausel verwenden, um Temperaturen > 25°C zu filtern return temperatures.Where(temp => temp > 25.0); } // LÖSUNG Aufgabe 2: Pattern Matching implementieren private static string AnalyzeMessage(object value) { // Switch expression mit Pattern Matching return value switch { double temp when temp > 30.0 => "WARNUNG: Sehr hohe Temperatur!", double temp when temp >= 25.0 && temp <= 30.0 => "Hohe Temperatur", double temp when temp < 25.0 => "Normale Temperatur", string text => "Text-Nachricht erhalten", null => "Keine Daten", _ => "Unbekannter Datentyp" }; } // 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 } } } }