MQTT Client ASP.NET Core

  • Михаил
  • 12 мин. на прочтение
  • 56
  • 15 Dec 2022
  • 06 Jan 2023

Смотрим пример

На самом деле то, что я искал, было событием. Это в значительной степени решает мою текущую проблему. Мне нужно было передать данные другому объекту при их получении, поэтому мой текущий код выглядит так:

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;
       }
   }
}