尝试连接 MQTT 代理并尝试从代理接收消息并将其显示到控制台

问题描述

我正在使用 MQTT 代理凭据来连接 MQTT 代理,但我的代码总是转到断开连接的代码块。之后,它向我显示了一条错误消息,如未处理异常。我对这个主题进行了大量研究,但找不到合适的解决方案。

这是我用于 MQTT 代理连接的完整 C# 代码

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Extensions.ManagedClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TreonConsole
{
class Program
{
    private static IMqttClient _Client;
    private static IMqttClientOptions _options;
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Starting Subscriber...");

            //Create subscriber client
            var factory = new MqttFactory();
            _Client = factory.CreateMqttClient();
            string clientid= Guid.NewGuid().ToString();

            //Configure options
            _options = new MqttClientOptionsBuilder()
                .WithClientId(clientid)
                .WithTcpserver("b925270106984f21be3ae9d1d48b400fh.s112.eu.hivemq.cloud",8883)
                .WithCredentials("iap","Iap321?")
                .WithCleanSession()
                .Build();

            //Handlers
            _Client.UseConnectedHandler(e =>
            {
                Console.WriteLine("Connected successfully with MQTT brokers.");

                //Subscribe to topic
                _Client.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("test").Build()).Wait();
            });

            _Client.UsedisconnectedHandler(e =>
            {
                Console.WriteLine("disconnected from MQTT brokers.");
            });
            _Client.UseApplicationMessageReceivedHandler(e =>
            {
                Console.WriteLine("Received Application Messages");
                Console.WriteLine($"+Topic={e.ApplicationMessage.Topic}");
                Console.WriteLine($"+Payload={Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
                Console.WriteLine($"+Qos={e.ApplicationMessage.QualityOfServiceLevel}");
                Console.WriteLine($"Retaain={e.ApplicationMessage.Retain}");
                Console.WriteLine();

            });

            //actaully connect
            _Client.ConnectAsync(_options).Wait();
            Console.WriteLine("Press Key to Exit");
            Console.ReadLine();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }
  }
}

解决方法

从 HiveMQ 文档端口 8883 的外观来看,期望是 TLS 安全连接,但我没有看到您在代码中设置 TLS 连接的位置。

,

问题在于您没有安全的 TLS 连接。在 MqttClientOptionsBuilder 中添加 WithTls() 选项。