From cfecf1424dcddff944dde7aae444d55d212dd0c0 Mon Sep 17 00:00:00 2001 From: Gerardo Date: Wed, 9 Jul 2025 01:27:22 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adido=20log=20en=20BBDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyInjectionService.cs | 1 + .../Interfaces/External/IMqttService.cs | 5 +- .../Interfaces/IPersistenciaService.cs | 6 +- .../configuration/MapperProfile.cs | 4 ++ .../mqtt/IMqttLissener.cs | 13 ++++ .../mqtt/MqttBackgroundService.cs | 52 ++++++++++++++++ .../mqtt/commands/CreateMqttModel.cs | 32 ++++++++++ .../Entities/Mqtt/MqttEntity.cs | 20 +++++++ .../src/Mqtt.App.External/Mqtt/MqttService.cs | 60 +++++++++++++++++++ mqttApi/src/Mqtt.App.api/appsettings.json | 1 + .../Configurations/UserConfiguration.cs | 16 +++++ .../Services/PersistenciaService.cs | 14 ++++- 12 files changed, 221 insertions(+), 3 deletions(-) create mode 100644 mqttApi/src/Mqtt.App.Application/mqtt/IMqttLissener.cs create mode 100644 mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs create mode 100644 mqttApi/src/Mqtt.App.Application/mqtt/commands/CreateMqttModel.cs create mode 100644 mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs diff --git a/mqttApi/src/Mqtt.App.Application/DependencyInjectionService.cs b/mqttApi/src/Mqtt.App.Application/DependencyInjectionService.cs index 3e997a1..90a4d65 100644 --- a/mqttApi/src/Mqtt.App.Application/DependencyInjectionService.cs +++ b/mqttApi/src/Mqtt.App.Application/DependencyInjectionService.cs @@ -39,6 +39,7 @@ namespace Mqtt.App.Application services.AddTransient(); services.AddTransient(); + services.AddHostedService(); #endregion diff --git a/mqttApi/src/Mqtt.App.Application/Interfaces/External/IMqttService.cs b/mqttApi/src/Mqtt.App.Application/Interfaces/External/IMqttService.cs index c2aae5d..f5646c5 100644 --- a/mqttApi/src/Mqtt.App.Application/Interfaces/External/IMqttService.cs +++ b/mqttApi/src/Mqtt.App.Application/Interfaces/External/IMqttService.cs @@ -1,4 +1,5 @@ -using System; +using Mqtt.App.Application.mqtt; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -10,5 +11,7 @@ namespace Mqtt.App.Application.Interfaces.External { Task publishAsync(string topic, string payload); public bool CompruebaKey(string key); + + Task TastOnReceive(CancellationToken stoppingToken, IMqttLissener lisenner); } } diff --git a/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs b/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs index 774386f..c89ec99 100644 --- a/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs +++ b/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs @@ -1,4 +1,5 @@ -using Mqtt.App.Domain.Entities.User; +using Mqtt.App.Domain.Entities.Mqtt; +using Mqtt.App.Domain.Entities.User; using System; using System.Collections.Generic; using System.Linq; @@ -20,5 +21,8 @@ namespace Mqtt.App.Application.Interfaces public Task GetUserByPassAndName(string pass, string name); + public Task AddMqtt(MqttEntity e); + + } } diff --git a/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs b/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs index 5d8982a..eb36d70 100644 --- a/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs +++ b/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs @@ -1,9 +1,11 @@ using AutoMapper; +using Mqtt.App.Application.mqtt.commands; using Mqtt.App.Application.Persistencia.user.commands.CreateUser; using Mqtt.App.Application.Persistencia.user.commands.UpdateUser; using Mqtt.App.Application.Persistencia.user.Queries.GetAllUser; using Mqtt.App.Application.Persistencia.user.Queries.GetUserById; using Mqtt.App.Application.Persistencia.user.Queries.GetUserByPassAndName; +using Mqtt.App.Domain.Entities.Mqtt; using Mqtt.App.Domain.Entities.User; using System; using System.Collections.Generic; @@ -17,6 +19,8 @@ namespace Mqtt.App.Application.configuration { public MapperProfile() { + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/IMqttLissener.cs b/mqttApi/src/Mqtt.App.Application/mqtt/IMqttLissener.cs new file mode 100644 index 0000000..2c09463 --- /dev/null +++ b/mqttApi/src/Mqtt.App.Application/mqtt/IMqttLissener.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mqtt.App.Application.mqtt +{ + public interface IMqttLissener + { + void onReceived(string topic, string payload); + } +} diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs b/mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs new file mode 100644 index 0000000..2901009 --- /dev/null +++ b/mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs @@ -0,0 +1,52 @@ +using AutoMapper; +using Microsoft.Extensions.Hosting; +using Mqtt.App.Application.Interfaces; +using Mqtt.App.Application.Interfaces.External; +using Mqtt.App.Application.mqtt.commands; +using Mqtt.App.Domain.Entities.Mqtt; +using Mqtt.App.Domain.Entities.User; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Mqtt.App.Application.mqtt +{ + public class MqttBackgroundService : BackgroundService, IMqttLissener + { + + + private readonly IMqttService _mqttService; + private readonly IPersistenciaService _persistenciaService; + private IMapper _mapper; + public MqttBackgroundService(IPersistenciaService persistenciaService, + IMqttService mqttService, + IMapper mapper) + { + _persistenciaService = persistenciaService; + _mqttService = mqttService; + _mapper = mapper; + } + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + + + while (!stoppingToken.IsCancellationRequested) + { + _mqttService.TastOnReceive(stoppingToken, this); + } + + + } + + public void onReceived(string topic, string payload) + { + var model = new CreateMqttModel(); + model.Procesa(topic, payload); + var entity = _mapper.Map(model); + _persistenciaService.AddMqtt(entity); + } + } +} diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/commands/CreateMqttModel.cs b/mqttApi/src/Mqtt.App.Application/mqtt/commands/CreateMqttModel.cs new file mode 100644 index 0000000..a4157b4 --- /dev/null +++ b/mqttApi/src/Mqtt.App.Application/mqtt/commands/CreateMqttModel.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mqtt.App.Application.mqtt.commands +{ + public class CreateMqttModel + { + public Int64 Id { get; set; } + public string Payload { get; set; } + public string Topic { get; set; } + public string KeyTopic { get; set; } + public string TypeTopic { get; set; } + public DateTime Fecha { get; set; } + public bool IsActive { get; set; } + + + public void Procesa(string topic, string payload) + { + Topic = topic; + Payload = payload; + string ultimaParte = Topic.Split('/').LastOrDefault(); + + TypeTopic = String.IsNullOrWhiteSpace(ultimaParte) ? "no" : ultimaParte; + + KeyTopic = String.IsNullOrWhiteSpace(ultimaParte) ? Topic : Topic.Split("/" + ultimaParte).FirstOrDefault(); + Fecha = DateTime.Now; + } + } +} diff --git a/mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs b/mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs new file mode 100644 index 0000000..1433a4c --- /dev/null +++ b/mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mqtt.App.Domain.Entities.Mqtt +{ + public class MqttEntity + { + public Int64 Id { get; set; } + public string Payload { get; set; } + public string Topic { get; set; } + public string KeyTopic { get; set; } + public string TypeTopic { get; set; } + public DateTime Fecha { get; set; } + public bool IsActive { get; set; } + + } +} diff --git a/mqttApi/src/Mqtt.App.External/Mqtt/MqttService.cs b/mqttApi/src/Mqtt.App.External/Mqtt/MqttService.cs index 7472312..4877860 100644 --- a/mqttApi/src/Mqtt.App.External/Mqtt/MqttService.cs +++ b/mqttApi/src/Mqtt.App.External/Mqtt/MqttService.cs @@ -11,6 +11,8 @@ using System.IdentityModel.Tokens.Jwt; using Microsoft.AspNetCore.Hosting.Server; using Mqtt.App.Application.Interfaces.External; using Microsoft.AspNetCore.DataProtection.KeyManagement; +using Microsoft.Extensions.Logging; +using Mqtt.App.Application.mqtt; namespace Mqtt.App.External.Mqtt { public class MqttService: IMqttService @@ -70,6 +72,64 @@ namespace Mqtt.App.External.Mqtt } return res; } + public async Task TastOnReceive(CancellationToken stoppingToken, IMqttLissener lisenner) + { + if (_config == null || stoppingToken==null) + return; + string server = _config["ServerMqtt"]; + string sttopicFilter = _config["TopicFilterMqtt"]; + + + if (String.IsNullOrWhiteSpace(server) ) + return; + + bool res = true; + var mqttFactory = new MqttClientFactory(); + using (var mqttClient = mqttFactory.CreateMqttClient()) + { + var mqttClientOptions = new MqttClientOptionsBuilder().WithTcpServer(server).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 => + { + + onReceived(e, lisenner); + return Task.CompletedTask; + }; + + var conect = await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); + if (conect.ResultCode == MqttClientConnectResultCode.Success) + { + var topicFilter = new MqttTopicFilterBuilder().WithTopic(sttopicFilter).Build(); + var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topicFilter).Build(); + //var susb = await mqttClient.SubscribeAsync("casa"); + var susb = await mqttClient.SubscribeAsync(subscribeOptions); + + } + + while (!stoppingToken.IsCancellationRequested) + { + await Task.Delay(1000, stoppingToken); + } + await mqttClient.DisconnectAsync(); + } + } + public void onReceived(MqttApplicationMessageReceivedEventArgs e, IMqttLissener lisenner) + { + StringBuilder sb = new StringBuilder(); + SequenceReader reader = new SequenceReader(e.ApplicationMessage.Payload); + + while (!reader.End) + { + sb.Append(Encoding.UTF8.GetString(reader.UnreadSpan)); + reader.Advance(reader.UnreadSpan.Length); + } + + string result = sb.ToString(); + lisenner.onReceived(e.ApplicationMessage.Topic, result); + } } } diff --git a/mqttApi/src/Mqtt.App.api/appsettings.json b/mqttApi/src/Mqtt.App.api/appsettings.json index 47a4be3..fed3cd1 100644 --- a/mqttApi/src/Mqtt.App.api/appsettings.json +++ b/mqttApi/src/Mqtt.App.api/appsettings.json @@ -13,6 +13,7 @@ "MasterKey": "bdasbvña78678,.p``´dshnihfp", "ServerMqtt": "192.168.2.50", "TopicFormatMqtt": "casa/Api/{0}", + "TopicFilterMqtt": "casa/#", "ApiKeyMqtt": "hola" diff --git a/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs b/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs index cb3cc29..fb7cbf0 100644 --- a/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs +++ b/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Mqtt.App.Domain.Entities.Mqtt; namespace Mqtt.App.Persistencia.Configurations { @@ -21,6 +22,21 @@ namespace Mqtt.App.Persistencia.Configurations + } + public UserConfiguration(EntityTypeBuilder entityBuilder) + { + entityBuilder.ToTable("UserEntity"); + entityBuilder.HasKey(x => x.Id); + entityBuilder.Property(x => x.Payload).IsRequired(); + entityBuilder.Property(x => x.Topic).IsRequired(); + entityBuilder.Property(x => x.Fecha).IsRequired(); + entityBuilder.Property(x => x.IsActive).IsRequired(); + entityBuilder.Property(x => x.KeyTopic).IsRequired(); + entityBuilder.Property(x => x.TypeTopic).IsRequired(); + + + + } } } diff --git a/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs b/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs index b93ca14..510f4c7 100644 --- a/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs +++ b/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Mqtt.App.Domain.Entities.Mqtt; namespace Mqtt.App.Persistencia.Services { @@ -17,6 +18,8 @@ namespace Mqtt.App.Persistencia.Services } public DbSet User { get; set; } + public DbSet Mqtt { get; set; } + #region user public async Task AddUser(UserEntity user) { User.Add(user); @@ -73,7 +76,14 @@ namespace Mqtt.App.Persistencia.Services return enty; } - + #endregion + #region mqtt + public async Task AddMqtt(MqttEntity e) + { + Mqtt.Add(e); + return await BoolAsync(); + } + #endregion private async Task BoolAsync() { @@ -88,6 +98,8 @@ namespace Mqtt.App.Persistencia.Services { //configuras entidades relaccionadas con bbdd new UserConfiguration(model.Entity()); + new UserConfiguration(model.Entity()); + } } }