mqt tnet клиент не получает подписанные темы - PullRequest
1 голос
/ 20 января 2020

Я использую mqtt. net (https://github.com/chkr1011/MQTTnet) и написал небольшой класс для обработки моего клиента mqtt. Клиент подключается к брокеру и успешно публикует свои сообщения. Теперь я хочу, чтобы клиент также реагировал на некоторые темы, на которые я подписываю клиента. Но это не похоже на работу. Я не получаю никакого удара точки останова. Это соответствующие части моего кода:

    public async Task StartAsync(CancellationToken cancellationToken)
            {
        //Building the mqtt config
        var options = new MqttClientOptionsBuilder()
            .WithTcpServer(MqttConfig.Server, MqttConfig.Port)
            .WithClientId("HeaterService")
            .WithCredentials(MqttConfig.User, MqttConfig.Password)
            .WithTls(tlsParameters =>
            {
                tlsParameters.AllowUntrustedCertificates = true;
            })
            .WithCleanSession()
            .Build();

        //Getting an mqtt Instance
        MqttClient = new MqttFactory().CreateMqttClient();

        //Wiring up all the events...
        MqttClient.UseApplicationMessageReceivedHandler( e => { HandleMessageReceived(e.ApplicationMessage); });

        MqttClient.UseConnectedHandler(/*async*/ e =>
        {
            Console.WriteLine("### CONNECTED WITH BROKER ###");

        });

      await MqttClient.ConnectAsync(options);
}

Клиент успешно подключается к серверу и может публиковать sh сообщений.

Это моя функция обработчика сообщений:

private void HandleMessageReceived(MqttApplicationMessage applicationMessage)
{
    Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
    Console.WriteLine($"+ Topic = {applicationMessage.Topic}");

    Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(applicationMessage.Payload)}");
    Console.WriteLine($"+ QoS = {applicationMessage.QualityOfServiceLevel}");
    Console.WriteLine($"+ Retain = {applicationMessage.Retain}");
    Console.WriteLine();
}

Это мой код подписки:

public async Task SubscribeTopic(string topic)
{
   var subscribeResult = await MqttClient.SubscribeAsync(new TopicFilterBuilder()
      .WithTopic(topic)
      //.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
      .Build());

   Console.WriteLine("### SUBSCRIBED ###");
   Console.WriteLine("### Result: " + subscribeResult.Items.FirstOrDefault()?.ResultCode);
   Console.WriteLine("### Result: " + subscribeResult.Items.FirstOrDefault()?.TopicFilter);
}

Я вызываю эту функцию моего класса с помощью «Home / Heater / control / *»;

Когда я использую mqtt- Проводник для отправки тестового сообщения в topi c «Дом / Нагреватель / Управление / Тест»

Функция обработчика HandleMessageReceived никогда не срабатывает.

Что я делаю не так?

1 Ответ

0 голосов
/ 13 февраля 2020

Для меня было важно поставить подписку после подключения, иначе у меня была такая же проблема, как и у вас.

objClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(ReceivedMessage);

string[] strTopics = { "test/log", "test/log2" };

MqttClientSubscribeOptions objSubOptions = new MqttClientSubscribeOptions();
List<TopicFilter> objTopics = new List<TopicFilter>();

foreach(string strTopic in strTopics)
{
    TopicFilter objAdd = new TopicFilter();
    objAdd.Topic = strTopic;
    objTopics.Add(objAdd);
}

 objSubOptions.TopicFilters = objTopics;
 objClient.ConnectAsync(objOptions, CancellationToken.None).Wait();
 objClient.SubscribeAsync(objSubOptions); //!!!!subscribe goes here!!!!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...