c# - mqttnet 客户端没有得到订阅的主题

标签 c# linux mqtt

我正在使用 mqtt.net ( https://github.com/chkr1011/MQTTnet ) 并编写了一个小类来处理我的 mqtt 客户端。客户端连接到代理并成功发布它的消息。现在我希望客户也对我订阅客户的一些主题使用react。但这似乎不起作用。我没有遇到任何断点。这是我的代码的相关部分:

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

客户端成功连接到服务器并可以发布消息。

这是我的消息处理函数:
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-explorer 向主题“Home/Heater/control/test”发送测试消息时

函数处理程序 HandleMessageReceived 永远不会被命中。

我做错了什么?

最佳答案

看来你目前没有给你的 SubscribeTopic(string topic) 打电话您的 StartAsync(CancellationToken cancellationToken) 中的方法方法。

除此之外,我个人在开始使用 MQTTNet 时也遇到了一些问题。
Like @Linuxx said注意您调用订阅和连接的顺序。
我还建议添加 Disconnected_Handler给您的客户,以确保连接不会在您不知情的情况下终止。

关于c# - mqttnet 客户端没有得到订阅的主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59818055/

相关文章:

c# - 如何以编程方式将 JavaScript 插入网页?

c# - Azure Web应用程序突然给出500个错误

c# - 如何在运行时设置端点

Python tkinter 无法在 crontab 上工作

c++ - 通过网络运行 Qt 应用程序

linux - svn 合并单个文件。添加新文件

c# - 同时优化一组非线性方程中的参数

unit-testing - 如何为 MQTT 客户端编写测试?

c# - M2MQTT如何自动重连

google-cloud-platform - 是否可以通过 Javascript 连接到 Google IOT Core MQTT Bridge?