151 lines
6.0 KiB
C#
151 lines
6.0 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
|
|
}
|
|
}
|
|
}
|
|
} |