MQTT Client ASP.NET Core
На самом деле то, что я искал, было событием. Это в значительной степени решает мою текущую проблему. Мне нужно было передать данные другому объекту при их получении, поэтому мой текущий код выглядит так:
public class MqttClientService : IMqttClientService
{
private IMqttClient mqttClient;
private IMqttClientOptions options;
public event EventHandler MqttReceivedData;
public MqttClientService(IMqttClientOptions options)
{
this.options = options;
mqttClient = new MqttFactory().CreateMqttClient();
ConfigureMqttClient();
}
private void ConfigureMqttClient()
{
mqttClient.ConnectedHandler = this;
mqttClient.DisconnectedHandler = this;
mqttClient.ApplicationMessageReceivedHandler = this;
}
public Task HandleApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs eventArgs)
{
MqttReceivedData?.Invoke(this, eventArgs);
throw new System.NotImplementedException();
}
}
Для подписки на событие я использую:
public class IndexModel : PageModel
{
private readonly ILogger _logger;
private readonly MqttClientService _mqttClientService;
public string MQTTResponse;
public IndexModel(MqttClientService mqttClientService, ILogger logger)
{
_logger = logger;
_mqttClientService = mqttClientService;
_mqttClientService.MqttReceivedData += _mqttClientService_MqttReceivedData;
}
private void _mqttClientService_MqttReceivedData(object sender, MqttApplicationMessageReceivedEventArgs e)
{
MQTTResponse = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
Console.WriteLine(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
}
public async Task OnGetAsync()
{
await _mqttClientService.PublishAsync("hello/world","welcome!");
}
}
Но это правда, что значение не обновляется в реальном времени на веб-странице. Думаю, для этого мне понадобится Balzor или JavaScript.
Я видел также ваше другое приложение IOT hub . И мне нравится, как вы там обрабатываете сообщения MQTT. Вы в основном передаете их с SignalIR.
Я думаю, что это было бы идеальным решением для моего конечного приложения, которое в основном будет выполнять CRUD данных базы данных, которые будут считываться или записываться считывателем RFID, использующим протокол MQTT.
https://github.com/mqttnettest/Issue637Test-2/tree/master/BlazorApp1
OnGetAsync()
запускается только один раз, но обработчик сообщений работает до тех пор, пока вы не закроете веб-сайт (или по истечении тайм-аута, я не уверен).
Что касается остального, я не совсем уверен, чего вы хотите добиться с помощью этого, но вы можете хранить данные в списке/очереди или что-то еще и загружать данные оттуда.
using System.Collections;
public class Something
{
private Queue myData = new Queue();
public async Task OnGetAsync()
{
try
{
await this.mqttClient.ConnectAsync(this.mqttClientOptions);
this.mqttClient.UseApplicationMessageReceivedHandler(e =>
{
// Stores the data in the queue
this.myData.Enqueue(e);
});
var topic = new MqttTopicFilterBuilder().WithTopic("my/topic").Build();
await mqttClient.SubscribeAsync(topic);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public async Task SomethingElse()
{
while(this.myData.TryDequeue(out var data))
{
// Do something
var x = data.Topic;
}
}
}
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.