Push Aufgabe 3
parent
5a9ad6e1eb
commit
81032f5eb1
|
@ -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<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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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<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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue