CSharpProjekt/mqtt_task_pr3.cs

151 lines
5.9 KiB
C#

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<double> receivedTemperatures = new List<double>();
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<SensorData>(jsonPayload);
// Temporäre Lösung für Aufgabe 1 und 2
var data = JsonSerializer.Deserialize<Dictionary<string, object>>(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<double> FilterHighTemperatures(List<double> temperatures)
{
// TODO: Verwenden Sie LINQ (Where-Klausel), um alle Temperaturen > 25°C zu filtern
// Beispiel: return temperatures.Where(...);
return new List<double>(); // 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
}
}
}
}