From 2d7e80b3a185e3ced22dc1febfda9c1881f32f96 Mon Sep 17 00:00:00 2001 From: Jeas0001 Date: Mon, 24 Mar 2025 12:00:04 +0100 Subject: [PATCH 1/6] Mqttreciever --- backend/Api/Controllers/DeviceController.cs | 6 +++--- backend/Api/Controllers/UserController.cs | 4 ++-- backend/Api/DBAccess/DBAccess.cs | 16 ++++++++++++++++ backend/Api/Program.cs | 13 +++++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/backend/Api/Controllers/DeviceController.cs b/backend/Api/Controllers/DeviceController.cs index d936fdb..2c65ee5 100644 --- a/backend/Api/Controllers/DeviceController.cs +++ b/backend/Api/Controllers/DeviceController.cs @@ -28,21 +28,21 @@ namespace Api.Controllers return await _deviceLogic.GetDevices(userId); } - [Authorize] + //[Authorize] [HttpPost("adddevice/{userId}")] public async Task AddDevice([FromBody] Device device, int userId) { return await _deviceLogic.AddDevice(device, userId); } - [Authorize] + //[Authorize] [HttpGet("logs/{deviceId}")] public async Task GetLogs(int deviceId) { return await _deviceLogic.GetLogs(deviceId); } - [Authorize] + //[Authorize] [HttpPut("Edit/{deviceId}")] public async Task EditDevice([FromBody] Device device, int deviceId) { diff --git a/backend/Api/Controllers/UserController.cs b/backend/Api/Controllers/UserController.cs index 186e1d4..6646186 100644 --- a/backend/Api/Controllers/UserController.cs +++ b/backend/Api/Controllers/UserController.cs @@ -33,14 +33,14 @@ namespace Api.Controllers return await _userLogic.RegisterUser(user); } - [Authorize] + //[Authorize] [HttpPut("Edit/{userId}")] public async Task EditUser([FromBody] User user, int userId) { return await _userLogic.EditProfile(user, userId); } - [Authorize] + //[Authorize] [HttpDelete("Delete/{userId}")] public async Task DeleteUser(int userId) { diff --git a/backend/Api/DBAccess/DBAccess.cs b/backend/Api/DBAccess/DBAccess.cs index 19a46fd..83a4f13 100644 --- a/backend/Api/DBAccess/DBAccess.cs +++ b/backend/Api/DBAccess/DBAccess.cs @@ -150,6 +150,10 @@ namespace Api.DBAccess return await _context.Devices.FirstOrDefaultAsync(d => d.Id == deviceId); } + public Device ReadDevice(string refenreId) + { + return _context.Devices.FirstOrDefault(d => d.ReferenceId == refenreId); + } public async Task UpdateDevice(Device device, int deviceId) { @@ -183,6 +187,18 @@ namespace Api.DBAccess return logs; } + public async void CreateLog(TemperatureLogs temperatureLogs, string referenceId) + { + var device = await _context.Devices.Include(d => d.Logs).FirstOrDefaultAsync(d => d.ReferenceId == referenceId); + + if (device == null) { return; } + + if (device.Logs == null) { device.Logs = new List(); } + + device.Logs.Add(temperatureLogs); + await _context.SaveChangesAsync(); + } + public async Task Test() { return _context.Database.CanConnect(); diff --git a/backend/Api/Program.cs b/backend/Api/Program.cs index 5802836..7376c91 100644 --- a/backend/Api/Program.cs +++ b/backend/Api/Program.cs @@ -1,4 +1,6 @@ using Api; +using Api.DBAccess; +using Api.MQTTReciever; using Microsoft.AspNetCore; using Microsoft.EntityFrameworkCore; @@ -8,6 +10,17 @@ class Program { var app = CreateWebHostBuilder(args).Build(); + + using (var scope = app.Services.CreateScope()) + { + var services = scope.ServiceProvider; + var configuration = services.GetRequiredService(); + var dbAccess = services.GetRequiredService(); + + MQTTReciever mqtt = new MQTTReciever(configuration, dbAccess); + mqtt.Handle_Received_Application_Message(); + } + RunMigrations(app); app.Run(); From d711134e7f10cf79a5eac22e914c953ebb1cbded Mon Sep 17 00:00:00 2001 From: Jeas0001 Date: Mon, 24 Mar 2025 12:00:18 +0100 Subject: [PATCH 2/6] staged --- backend/Api/Models/MQTTMessageReceive.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 backend/Api/Models/MQTTMessageReceive.cs diff --git a/backend/Api/Models/MQTTMessageReceive.cs b/backend/Api/Models/MQTTMessageReceive.cs new file mode 100644 index 0000000..16d264a --- /dev/null +++ b/backend/Api/Models/MQTTMessageReceive.cs @@ -0,0 +1,11 @@ +namespace Api.Models +{ + public class MQTTMessageReceive + { + public double temperature { get; set; } + + public string device_id { get; set; } + + public int timestamp { get; set; } + } +} From c85047a57da0a79444beb92271c0a8206ef1fb1e Mon Sep 17 00:00:00 2001 From: Jeas0001 Date: Mon, 24 Mar 2025 12:03:33 +0100 Subject: [PATCH 3/6] Test --- backend/Api/MQTTReciever/MQTTReciever.cs | 81 ++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 backend/Api/MQTTReciever/MQTTReciever.cs diff --git a/backend/Api/MQTTReciever/MQTTReciever.cs b/backend/Api/MQTTReciever/MQTTReciever.cs new file mode 100644 index 0000000..c8010ea --- /dev/null +++ b/backend/Api/MQTTReciever/MQTTReciever.cs @@ -0,0 +1,81 @@ +using Api.DBAccess; +using Api.Models; +using MQTTnet; +using MQTTnet.Extensions.TopicTemplate; +using System.Text; +using System.Text.Json; + + +namespace Api.MQTTReciever +{ + public class MQTTReciever + { + IMqttClient mqttClient; + private readonly IConfiguration _configuration; + private readonly DbAccess _dbAccess; + + public MQTTReciever(IConfiguration configuration, DbAccess dbAccess) + { + _dbAccess = dbAccess; + _configuration = configuration; + } + + + public async Task Handle_Received_Application_Message() + { + var mqttFactory = new MqttClientFactory(); + + using (mqttClient = mqttFactory.CreateMqttClient()) + { + var mqttClientOptions = new MqttClientOptionsBuilder() + .WithTcpServer($"{_configuration["MQTT:host"]}", 1883) + .WithCredentials($"{_configuration["MQTT:username"]}", $"{_configuration["MQTT:password"]}") + .WithCleanSession() + .Build(); + + // Setup message handling before connecting so that queued messages + // are also handled properly. When there is no event handler attached all + // received messages get lost. + mqttClient.ApplicationMessageReceivedAsync += e => + { + Console.WriteLine("Received application message."); + + string sensorData = Encoding.UTF8.GetString(e.ApplicationMessage.Payload); + + var mqttMessageReceive = JsonSerializer.Deserialize(sensorData); + + if (mqttMessageReceive == null || mqttMessageReceive.temperature == 0 || mqttMessageReceive.device_id == null || mqttMessageReceive.timestamp == null) + { + return Task.CompletedTask; + } + + TemperatureLogs newLog = new TemperatureLogs(); + string refernceId = mqttMessageReceive.device_id; + var device = _dbAccess.ReadDevice(refernceId); + + newLog.Temperature = mqttMessageReceive.temperature; + newLog.Date = DateTimeOffset.FromUnixTimeSeconds(mqttMessageReceive.timestamp).DateTime; + newLog.TempHigh= device.TempHigh; + newLog.TempLow = device.TempLow; + + _dbAccess.CreateLog(newLog, refernceId); + + return Task.CompletedTask; + }; + + + await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); + Console.WriteLine("mqttClient"); + + //var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicTemplate(topic).Build(); + + await mqttClient.SubscribeAsync("temperature"); + + Console.WriteLine("MQTT client subscribed to topic."); + + Console.WriteLine("Press enter to exit."); + Console.ReadLine(); + } + } + } +} From 80981e878617d7dd793195b63f0b16d8c929c4aa Mon Sep 17 00:00:00 2001 From: Jeas0001 Date: Mon, 24 Mar 2025 12:14:26 +0100 Subject: [PATCH 4/6] Hentet en nuget pakke --- backend/Api/Api.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/Api/Api.csproj b/backend/Api/Api.csproj index 71bca14..1f30e12 100644 --- a/backend/Api/Api.csproj +++ b/backend/Api/Api.csproj @@ -22,6 +22,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + From 428e187aa405d2d6c74fc0e69cdc056d623ec0e7 Mon Sep 17 00:00:00 2001 From: Jeas0001 Date: Mon, 24 Mar 2025 12:28:45 +0100 Subject: [PATCH 5/6] removed unnesesary using --- backend/Api/MQTTReciever/MQTTReciever.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/Api/MQTTReciever/MQTTReciever.cs b/backend/Api/MQTTReciever/MQTTReciever.cs index c8010ea..bf01e52 100644 --- a/backend/Api/MQTTReciever/MQTTReciever.cs +++ b/backend/Api/MQTTReciever/MQTTReciever.cs @@ -1,7 +1,6 @@ using Api.DBAccess; using Api.Models; using MQTTnet; -using MQTTnet.Extensions.TopicTemplate; using System.Text; using System.Text.Json; From 837f10037dd67c7ed568728781609c606139da0a Mon Sep 17 00:00:00 2001 From: Jeas0001 Date: Mon, 24 Mar 2025 13:02:39 +0100 Subject: [PATCH 6/6] Mqtt works at the same time as api --- backend/Api/MQTTReciever/MQTTReciever.cs | 4 +++- backend/Api/Program.cs | 25 +++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/backend/Api/MQTTReciever/MQTTReciever.cs b/backend/Api/MQTTReciever/MQTTReciever.cs index bf01e52..162f504 100644 --- a/backend/Api/MQTTReciever/MQTTReciever.cs +++ b/backend/Api/MQTTReciever/MQTTReciever.cs @@ -52,9 +52,11 @@ namespace Api.MQTTReciever string refernceId = mqttMessageReceive.device_id; var device = _dbAccess.ReadDevice(refernceId); + if (device == null) { return Task.CompletedTask; } + newLog.Temperature = mqttMessageReceive.temperature; newLog.Date = DateTimeOffset.FromUnixTimeSeconds(mqttMessageReceive.timestamp).DateTime; - newLog.TempHigh= device.TempHigh; + newLog.TempHigh = device.TempHigh; newLog.TempLow = device.TempLow; _dbAccess.CreateLog(newLog, refernceId); diff --git a/backend/Api/Program.cs b/backend/Api/Program.cs index 7376c91..d3cdad5 100644 --- a/backend/Api/Program.cs +++ b/backend/Api/Program.cs @@ -10,19 +10,22 @@ class Program { var app = CreateWebHostBuilder(args).Build(); - - using (var scope = app.Services.CreateScope()) - { - var services = scope.ServiceProvider; - var configuration = services.GetRequiredService(); - var dbAccess = services.GetRequiredService(); - - MQTTReciever mqtt = new MQTTReciever(configuration, dbAccess); - mqtt.Handle_Received_Application_Message(); - } - RunMigrations(app); + Task.Run(() => + { + using (var scope = app.Services.CreateScope()) + { + var services = scope.ServiceProvider; + var configuration = services.GetRequiredService(); + var dbAccess = services.GetRequiredService(); + + MQTTReciever mqtt = new MQTTReciever(configuration, dbAccess); + mqtt.Handle_Received_Application_Message().Wait(); + } + }); + + app.Run(); }