diff --git a/mqtt_task_pr3.cs b/mqtt_task_pr3.cs new file mode 100644 index 0000000..6eb0ce4 --- /dev/null +++ b/mqtt_task_pr3.cs @@ -0,0 +1,151 @@ +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 + } + } + } +} \ No newline at end of file diff --git a/mqtt_task_pr3_solution.cs b/mqtt_task_pr3_solution.cs new file mode 100644 index 0000000..4545933 --- /dev/null +++ b/mqtt_task_pr3_solution.cs @@ -0,0 +1,151 @@ +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 + } + } + } +} \ No newline at end of file