151 lines
5.8 KiB
C#
151 lines
5.8 KiB
C#
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<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}");
|
|
|
|
// LÖSUNG Aufgabe 3: Deserialisieren des JSON zu SensorData
|
|
var sensorData = JsonSerializer.Deserialize<SensorData>(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<double> FilterHighTemperatures(List<double> 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
|
|
}
|
|
}
|
|
}
|
|
} |