Moved all services from API to BLL project
This commit is contained in:
parent
f0af8f08e3
commit
6e61fc7756
@ -35,8 +35,6 @@
|
|||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" />
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" />
|
||||||
<PackageReference Include="MQTTnet" Version="3.0.13" />
|
|
||||||
<PackageReference Include="MQTTnet.AspNetCore" Version="3.0.13" />
|
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
<PackageReference Include="NLog" Version="4.7.5" />
|
<PackageReference Include="NLog" Version="4.7.5" />
|
||||||
<PackageReference Include="NLog.Web" Version="4.9.3" />
|
<PackageReference Include="NLog.Web" Version="4.9.3" />
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
using Birdmap.BLL.Interfaces;
|
using Birdmap.BLL.Interfaces;
|
||||||
|
using Birdmap.BLL.Services.CommunicationServices.Hubs;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
|
||||||
using Birdmap.API.Services.Hubs;
|
|
||||||
using Birdmap.API.Services;
|
|
||||||
|
|
||||||
namespace Birdmap.API.Controllers
|
namespace Birdmap.API.Controllers
|
||||||
{
|
{
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using Birdmap.API.DTOs;
|
using Birdmap.API.DTOs;
|
||||||
using Birdmap.API.Services;
|
|
||||||
using Birdmap.API.Services.Hubs;
|
|
||||||
using Birdmap.API.Services.Mqtt;
|
|
||||||
using Birdmap.BLL.Interfaces;
|
using Birdmap.BLL.Interfaces;
|
||||||
|
using Birdmap.BLL.Services.CommunicationServices.Hubs;
|
||||||
|
using Birdmap.BLL.Services.CommunicationServices.Mqtt;
|
||||||
using Birdmap.DAL.Entities;
|
using Birdmap.DAL.Entities;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
using Birdmap.API.Options;
|
|
||||||
using Birdmap.API.Services.Mqtt;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Birdmap.API.Extensions
|
|
||||||
{
|
|
||||||
public static class ServiceCollectionExtensions
|
|
||||||
{
|
|
||||||
public static IServiceCollection AddMqttClientServiceWithConfig(this IServiceCollection services, Action<AspCoreMqttClientOptions> configureOptions)
|
|
||||||
{
|
|
||||||
services.AddSingleton(serviceProvider =>
|
|
||||||
{
|
|
||||||
var optionBuilder = new AspCoreMqttClientOptions(serviceProvider);
|
|
||||||
configureOptions(optionBuilder);
|
|
||||||
return optionBuilder.Build();
|
|
||||||
});
|
|
||||||
services.AddSingleton<MqttClientService>();
|
|
||||||
services.AddSingleton<IHostedService>(serviceProvider =>
|
|
||||||
{
|
|
||||||
return serviceProvider.GetService<MqttClientService>();
|
|
||||||
});
|
|
||||||
services.AddSingleton(serviceProvider =>
|
|
||||||
{
|
|
||||||
var mqttClientService = serviceProvider.GetService<MqttClientService>();
|
|
||||||
var mqttClientServiceProvider = new MqttClientServiceProvider(mqttClientService);
|
|
||||||
return mqttClientServiceProvider;
|
|
||||||
});
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +1,7 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using Birdmap.API.Extensions;
|
|
||||||
using Birdmap.API.Middlewares;
|
using Birdmap.API.Middlewares;
|
||||||
using Birdmap.API.Services.Hubs;
|
|
||||||
using Birdmap.BLL;
|
using Birdmap.BLL;
|
||||||
|
using Birdmap.BLL.Services.CommunicationServices.Hubs;
|
||||||
using Birdmap.DAL;
|
using Birdmap.DAL;
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
@ -42,8 +41,6 @@ namespace Birdmap.API
|
|||||||
|
|
||||||
services.AddAutoMapper(typeof(Startup));
|
services.AddAutoMapper(typeof(Startup));
|
||||||
|
|
||||||
services.AddSignalR();
|
|
||||||
|
|
||||||
var key = Encoding.ASCII.GetBytes(Configuration["Secret"]);
|
var key = Encoding.ASCII.GetBytes(Configuration["Secret"]);
|
||||||
services.AddAuthentication(opt =>
|
services.AddAuthentication(opt =>
|
||||||
{
|
{
|
||||||
@ -64,33 +61,6 @@ namespace Birdmap.API
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
services.AddMqttClientServiceWithConfig(opt =>
|
|
||||||
{
|
|
||||||
var mqtt = Configuration.GetSection("Mqtt");
|
|
||||||
|
|
||||||
var mqttClient = mqtt.GetSection("ClientSettings");
|
|
||||||
var clientSettings = new
|
|
||||||
{
|
|
||||||
Id = mqttClient.GetValue<string>("Id"),
|
|
||||||
Username = mqttClient.GetValue<string>("Username"),
|
|
||||||
Password = mqttClient.GetValue<string>("Password"),
|
|
||||||
Topic = mqttClient.GetValue<string>("Topic"),
|
|
||||||
};
|
|
||||||
|
|
||||||
var mqttBrokerHost = mqtt.GetSection("BrokerHostSettings");
|
|
||||||
var brokerHostSettings = new
|
|
||||||
{
|
|
||||||
Host = mqttBrokerHost.GetValue<string>("Host"),
|
|
||||||
Port = mqttBrokerHost.GetValue<int>("Port"),
|
|
||||||
};
|
|
||||||
|
|
||||||
opt
|
|
||||||
.WithTopic(clientSettings.Topic)
|
|
||||||
.WithCredentials(clientSettings.Username, clientSettings.Password)
|
|
||||||
.WithClientId(clientSettings.Id)
|
|
||||||
.WithTcpServer(brokerHostSettings.Host, brokerHostSettings.Port);
|
|
||||||
});
|
|
||||||
|
|
||||||
// In production, the React files will be served from this directory
|
// In production, the React files will be served from this directory
|
||||||
services.AddSpaStaticFiles(configuration =>
|
services.AddSpaStaticFiles(configuration =>
|
||||||
{
|
{
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Core" Version="1.1.0" />
|
||||||
|
<PackageReference Include="MQTTnet" Version="3.0.13" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ using MQTTnet.Client.Connecting;
|
|||||||
using MQTTnet.Client.Disconnecting;
|
using MQTTnet.Client.Disconnecting;
|
||||||
using MQTTnet.Client.Receiving;
|
using MQTTnet.Client.Receiving;
|
||||||
|
|
||||||
namespace Birdmap.API.Services
|
namespace Birdmap.BLL.Interfaces
|
||||||
{
|
{
|
||||||
public interface IMqttClientService : IHostedService,
|
public interface IMqttClientService : IHostedService,
|
||||||
IMqttClientConnectedHandler,
|
IMqttClientConnectedHandler,
|
@ -1,7 +1,7 @@
|
|||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Birdmap.API.Options
|
namespace Birdmap.BLL.Options
|
||||||
{
|
{
|
||||||
public class AspCoreMqttClientOptions : MqttClientOptionsBuilder
|
public class AspCoreMqttClientOptions : MqttClientOptionsBuilder
|
||||||
{
|
{
|
@ -3,7 +3,7 @@ using Microsoft.Extensions.Logging;
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Birdmap.API.Services.Hubs
|
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
|
||||||
{
|
{
|
||||||
public class DevicesHub : Hub<IDevicesHubClient>
|
public class DevicesHub : Hub<IDevicesHubClient>
|
||||||
{
|
{
|
@ -2,7 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Birdmap.API.Services
|
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
|
||||||
{
|
{
|
||||||
public record Message(Guid DeviceId, DateTime Date, double Probability);
|
public record Message(Guid DeviceId, DateTime Date, double Probability);
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Birdmap.API.Services.Hubs
|
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
|
||||||
{
|
{
|
||||||
public interface IServicesHubClient
|
public interface IServicesHubClient
|
||||||
{
|
{
|
@ -3,7 +3,7 @@ using Microsoft.Extensions.Logging;
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Birdmap.API.Services.Hubs
|
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
|
||||||
{
|
{
|
||||||
public class ServicesHub : Hub<IServicesHubClient>
|
public class ServicesHub : Hub<IServicesHubClient>
|
||||||
{
|
{
|
@ -1,5 +1,5 @@
|
|||||||
using Birdmap.API.Services.Hubs;
|
using Birdmap.BLL.Interfaces;
|
||||||
using Birdmap.BLL.Interfaces;
|
using Birdmap.BLL.Services.CommunicationServices.Hubs;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using MQTTnet;
|
using MQTTnet;
|
||||||
@ -15,7 +15,7 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Timer = System.Timers.Timer;
|
using Timer = System.Timers.Timer;
|
||||||
|
|
||||||
namespace Birdmap.API.Services.Mqtt
|
namespace Birdmap.BLL.Services.CommunicationServices.Mqtt
|
||||||
{
|
{
|
||||||
public class MqttClientService : IMqttClientService
|
public class MqttClientService : IMqttClientService
|
||||||
{
|
{
|
@ -1,4 +1,6 @@
|
|||||||
namespace Birdmap.API.Services.Mqtt
|
using Birdmap.BLL.Interfaces;
|
||||||
|
|
||||||
|
namespace Birdmap.BLL.Services.CommunicationServices.Mqtt
|
||||||
{
|
{
|
||||||
public class MqttClientServiceProvider
|
public class MqttClientServiceProvider
|
||||||
{
|
{
|
@ -1,7 +1,11 @@
|
|||||||
using Birdmap.BLL.Interfaces;
|
using Birdmap.BLL.Interfaces;
|
||||||
|
using Birdmap.BLL.Options;
|
||||||
using Birdmap.BLL.Services;
|
using Birdmap.BLL.Services;
|
||||||
|
using Birdmap.BLL.Services.CommunicationServices.Mqtt;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using System;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
|
||||||
namespace Birdmap.BLL
|
namespace Birdmap.BLL
|
||||||
@ -37,6 +41,57 @@ namespace Birdmap.BLL
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
services.AddSignalR();
|
||||||
|
|
||||||
|
services.AddMqttClientServiceWithConfig(opt =>
|
||||||
|
{
|
||||||
|
var mqtt = configuration.GetSection("Mqtt");
|
||||||
|
|
||||||
|
var mqttClient = mqtt.GetSection("ClientSettings");
|
||||||
|
var clientSettings = new
|
||||||
|
{
|
||||||
|
Id = mqttClient.GetValue<string>("Id"),
|
||||||
|
Username = mqttClient.GetValue<string>("Username"),
|
||||||
|
Password = mqttClient.GetValue<string>("Password"),
|
||||||
|
Topic = mqttClient.GetValue<string>("Topic"),
|
||||||
|
};
|
||||||
|
|
||||||
|
var mqttBrokerHost = mqtt.GetSection("BrokerHostSettings");
|
||||||
|
var brokerHostSettings = new
|
||||||
|
{
|
||||||
|
Host = mqttBrokerHost.GetValue<string>("Host"),
|
||||||
|
Port = mqttBrokerHost.GetValue<int>("Port"),
|
||||||
|
};
|
||||||
|
|
||||||
|
opt
|
||||||
|
.WithTopic(clientSettings.Topic)
|
||||||
|
.WithCredentials(clientSettings.Username, clientSettings.Password)
|
||||||
|
.WithClientId(clientSettings.Id)
|
||||||
|
.WithTcpServer(brokerHostSettings.Host, brokerHostSettings.Port);
|
||||||
|
});
|
||||||
|
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IServiceCollection AddMqttClientServiceWithConfig(this IServiceCollection services, Action<AspCoreMqttClientOptions> configureOptions)
|
||||||
|
{
|
||||||
|
services.AddSingleton(serviceProvider =>
|
||||||
|
{
|
||||||
|
var optionBuilder = new AspCoreMqttClientOptions(serviceProvider);
|
||||||
|
configureOptions(optionBuilder);
|
||||||
|
return optionBuilder.Build();
|
||||||
|
});
|
||||||
|
services.AddSingleton<MqttClientService>();
|
||||||
|
services.AddSingleton<IHostedService>(serviceProvider =>
|
||||||
|
{
|
||||||
|
return serviceProvider.GetService<MqttClientService>();
|
||||||
|
});
|
||||||
|
services.AddSingleton(serviceProvider =>
|
||||||
|
{
|
||||||
|
var mqttClientService = serviceProvider.GetService<MqttClientService>();
|
||||||
|
var mqttClientServiceProvider = new MqttClientServiceProvider(mqttClientService);
|
||||||
|
return mqttClientServiceProvider;
|
||||||
|
});
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,12 +138,12 @@ Egy másik megoldás a SignalR használata, amellyel a klienseket eseményvezér
|
|||||||
Így a kliensek csak akkor indítanak kéréseket amikor az adat tényleg változott. Ezzel a technológiával oldottam meg például, hogy az eszközök állapotainak változására
|
Így a kliensek csak akkor indítanak kéréseket amikor az adat tényleg változott. Ezzel a technológiával oldottam meg például, hogy az eszközök állapotainak változására
|
||||||
frissüljön a felület.
|
frissüljön a felület.
|
||||||
|
|
||||||
Egy másik szolgáltatás a Birdnetes MQTT kommunikációért felelős szolgáltatás,
|
Egy másik szerveroldalon használt szolgáltatás a Birdnetes MQTT kommunikációért felelős szolgáltatás,
|
||||||
mely felregisztrál a \ref{subsect:birdnetes-ai-service}-as alfejezetben bemutatott AI Service által publikált üzenetekre.
|
mely felregisztrál a \ref{subsect:birdnetes-ai-service}-as alfejezetben bemutatott AI Service által publikált üzenetekre.
|
||||||
Ezekben az üzenetekben található a hanganyagok egyedi azonosítója, illetve azok seregélytől való származásának valószínüsége.
|
Ezekben az üzenetekben található a hanganyagok egyedi azonosítója, illetve azok seregélytől való származásának valószínüsége.
|
||||||
Ha a szolgáltatás kap egy ilyen üzenetet akkor lekérdezi a \ref{subsect:birdnetes-input-service}-es alfejezetben bemutatott Input Service-től
|
Ha a szolgáltatás kap egy ilyen üzenetet akkor lekérdezi a \ref{subsect:birdnetes-input-service}-es alfejezetben bemutatott Input Service-től
|
||||||
a hanganyag azonosítójához tartozó metaadatokat.
|
a hanganyag azonosítójához tartozó metaadatokat.
|
||||||
Ezekből felhasználva a kihelyezett eszköz azonosítóját, a hanganyag beérkezésének dátumát és az említett valószínüséget új üzeneteket készítek, melyeket egy pufferben tárolok.
|
Ezekből felhasználva a kihelyezett eszköz azonosítóját, a hanganyag beérkezésének dátumát és az említett valószínüséget új üzenetek készülnek, melyeket egy pufferben tárolódnak.
|
||||||
Ezt a folyamatot a \ref{fig:birdmap-mqtt-service}-es ábra szemlélteti.
|
Ezt a folyamatot a \ref{fig:birdmap-mqtt-service}-es ábra szemlélteti.
|
||||||
|
|
||||||
\begin{figure}[!ht]
|
\begin{figure}[!ht]
|
||||||
@ -163,7 +163,7 @@ Míg a szerver képes is az üzeneteket feldolgozni, ha ezeket rögtön tovább
|
|||||||
A kontrollerek határozzák meg, hogy a szerveroldalon milyen végpontokat, milyen paraméterekkel lehet meghívni, ahhoz milyen jogosultságok kellenek.
|
A kontrollerek határozzák meg, hogy a szerveroldalon milyen végpontokat, milyen paraméterekkel lehet meghívni, ahhoz milyen jogosultságok kellenek.
|
||||||
A jogosultságok kezelését a JSON Web Token-ekkel oldottam meg. A fejlasználó bejelentkezéskor kap egy ilyen token-t,
|
A jogosultságok kezelését a JSON Web Token-ekkel oldottam meg. A fejlasználó bejelentkezéskor kap egy ilyen token-t,
|
||||||
amelyben tárolom a hozzá tartozó szerepet. A \ref{lst:devices-controller}-as listában látszik, hogy hogyan használom ezeket a szerepeket.
|
amelyben tárolom a hozzá tartozó szerepet. A \ref{lst:devices-controller}-as listában látszik, hogy hogyan használom ezeket a szerepeket.
|
||||||
A kontroller végpontjait alapértelmezetten \verb+User+ és \verb+Admin+ jogosultságú felhasználó hívhatja, az online végpontot azonban csak \verb+Admin+ jogosultságú.
|
A \verb+DevicesController+ végpontjait alapértelmezetten \verb+User+ és \verb+Admin+ jogosultságú felhasználó hívhatja, az "online" végpontot azonban csak \verb+Admin+ jogosultságú.
|
||||||
Hasonló képpen oldottam meg ezt a többi kontrollernél is. A \verb+User+ felhasználók csak olyan végpontokat hívhat, mely kizárolag az állapotok olvasásával jár.
|
Hasonló képpen oldottam meg ezt a többi kontrollernél is. A \verb+User+ felhasználók csak olyan végpontokat hívhat, mely kizárolag az állapotok olvasásával jár.
|
||||||
Az \verb+Admin+ felhasználók hívhatnak bármilyen végpontot.
|
Az \verb+Admin+ felhasználók hívhatnak bármilyen végpontot.
|
||||||
|
|
||||||
|
@ -5866,15 +5866,11 @@ endobj
|
|||||||
/Filter /FlateDecode
|
/Filter /FlateDecode
|
||||||
>>
|
>>
|
||||||
stream
|
stream
|
||||||
xÚ<EFBFBD>WÉnãF½û+x¤ |