mirror of
https://github.com/ckaczor/HomeMonitor.git
synced 2026-02-16 10:58:32 -05:00
Add SignalR for environment service
This commit is contained in:
@@ -2,6 +2,8 @@
|
|||||||
using ChrisKaczor.HomeMonitor.Environment.Service.Data;
|
using ChrisKaczor.HomeMonitor.Environment.Service.Data;
|
||||||
using MQTTnet;
|
using MQTTnet;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
|
using Microsoft.AspNetCore.SignalR.Client;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace ChrisKaczor.HomeMonitor.Environment.Service;
|
namespace ChrisKaczor.HomeMonitor.Environment.Service;
|
||||||
|
|
||||||
@@ -10,6 +12,7 @@ public class MessageHandler : IHostedService
|
|||||||
private readonly IConfiguration _configuration;
|
private readonly IConfiguration _configuration;
|
||||||
private readonly Database _database;
|
private readonly Database _database;
|
||||||
private readonly IMqttClient _mqttClient;
|
private readonly IMqttClient _mqttClient;
|
||||||
|
private HubConnection _hubConnection;
|
||||||
|
|
||||||
private readonly MqttFactory _mqttFactory;
|
private readonly MqttFactory _mqttFactory;
|
||||||
private readonly string _topic;
|
private readonly string _topic;
|
||||||
@@ -30,20 +33,26 @@ public class MessageHandler : IHostedService
|
|||||||
_mqttClient = _mqttFactory.CreateMqttClient();
|
_mqttClient = _mqttFactory.CreateMqttClient();
|
||||||
|
|
||||||
_mqttClient.ApplicationMessageReceivedAsync += OnApplicationMessageReceivedAsync;
|
_mqttClient.ApplicationMessageReceivedAsync += OnApplicationMessageReceivedAsync;
|
||||||
|
|
||||||
|
_hubConnection = new HubConnectionBuilder().WithUrl(configuration["Environment:Hub:Url"] ?? string.Empty).Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task StartAsync(CancellationToken cancellationToken)
|
public async Task StartAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
await _hubConnection.StartAsync(cancellationToken);
|
||||||
|
|
||||||
var mqttClientOptions = new MqttClientOptionsBuilder().WithTcpServer(_configuration["Mqtt:Server"]).Build();
|
var mqttClientOptions = new MqttClientOptionsBuilder().WithTcpServer(_configuration["Mqtt:Server"]).Build();
|
||||||
await _mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
|
await _mqttClient.ConnectAsync(mqttClientOptions, cancellationToken);
|
||||||
|
|
||||||
var mqttSubscribeOptions = _mqttFactory.CreateSubscribeOptionsBuilder().WithTopicFilter($"{_topic}/#").Build();
|
var mqttSubscribeOptions = _mqttFactory.CreateSubscribeOptionsBuilder().WithTopicFilter($"{_topic}/#").Build();
|
||||||
await _mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);
|
await _mqttClient.SubscribeAsync(mqttSubscribeOptions, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task StopAsync(CancellationToken cancellationToken)
|
public async Task StopAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await _mqttClient.DisconnectAsync(new MqttClientDisconnectOptionsBuilder().Build(), CancellationToken.None);
|
await _mqttClient.DisconnectAsync(new MqttClientDisconnectOptionsBuilder().Build(), cancellationToken);
|
||||||
|
|
||||||
|
await _hubConnection.StopAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
|
private async Task OnApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
|
||||||
@@ -59,6 +68,25 @@ public class MessageHandler : IHostedService
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
await _database.StoreMessageAsync(message);
|
await _database.StoreMessageAsync(message);
|
||||||
|
|
||||||
|
await SendLatestReading(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SendLatestReading(Message message)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (_hubConnection.State == HubConnectionState.Disconnected)
|
||||||
|
await _hubConnection.StartAsync();
|
||||||
|
|
||||||
|
var json = JsonSerializer.Serialize(message);
|
||||||
|
|
||||||
|
await _hubConnection.InvokeAsync("SendLatestReading", json);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
WriteLog($"Hub exception: {exception}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void WriteLog(string message)
|
private static void WriteLog(string message)
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
<PackageReference Include="Dapper" Version="2.1.28" />
|
<PackageReference Include="Dapper" Version="2.1.28" />
|
||||||
<PackageReference Include="dbup-sqlserver" Version="5.0.37" />
|
<PackageReference Include="dbup-sqlserver" Version="5.0.37" />
|
||||||
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
|
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.1" />
|
||||||
<PackageReference Include="MQTTnet.AspNetCore" Version="4.3.3.952" />
|
<PackageReference Include="MQTTnet.AspNetCore" Version="4.3.3.952" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,12 @@
|
|||||||
"Host": "localhost",
|
"Host": "localhost",
|
||||||
"User": "sa",
|
"User": "sa",
|
||||||
"Password": "newpassword",
|
"Password": "newpassword",
|
||||||
|
"Port": 1433,
|
||||||
"Name": "Environment",
|
"Name": "Environment",
|
||||||
"TrustServerCertificate": true
|
"TrustServerCertificate": true
|
||||||
|
},
|
||||||
|
"Hub": {
|
||||||
|
"Url": "http://localhost:8080/environment"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,9 @@
|
|||||||
"Name": "Environment",
|
"Name": "Environment",
|
||||||
"TrustServerCertificate": true,
|
"TrustServerCertificate": true,
|
||||||
"Port": 1435
|
"Port": 1435
|
||||||
|
},
|
||||||
|
"Hub": {
|
||||||
|
"Url": "http://hub-server/environment"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user