【问题标题】:MQTTnet Connection Issue with HiveMQ CloudHiveMQ 云的 MQTTnet 连接问题
【发布时间】:2022-01-19 19:11:53
【问题描述】:

我是 MQTT 世界的新手,我正在尝试创建一个连接到 HiveMQ 云代理的 .Net 5.0 应用程序。

我创建了一个免费的代理,我可以使用 HiveMQ Websocket 客户端连接到它。

这是我主机的截图。

我已经为主机创建了 MQTT 凭据,并且能够通过示例客户端进行连接。这是该客户端的屏幕截图。

这行得通,我可以发布和订阅消息队列。

但是,现在我正在尝试将其翻译为 c#,但无法连接。我从这个示例项目开始:https://github.com/rafiulgits/mqtt-client-dotnet-core

然后从我的集群实例中插入值,但我在启动时遇到连接超时。

这是我的服务配置的样子:

public static IServiceCollection AddMqttClientHostedService(this IServiceCollection services)
{
    services.AddMqttClientServiceWithConfig(aspOptionBuilder =>
    {
        //var clientSettinigs = AppSettingsProvider.ClientSettings;
        //var brokerHostSettings = AppSettingsProvider.BrokerHostSettings;

        aspOptionBuilder
        .WithCredentials("Test1", "xxxxx") //clientSettinigs.UserName, clientSettinigs.Password)
        .WithClientId("clientId-jqE8uIw6Pp") //clientSettinigs.Id)
        .WithTcpServer("xxxxxxxxxxxxxx.s2.eu.hivemq.cloud", 8884); //brokerHostSettings.Host, brokerHostSettings.Port);
    });
    return services;
}

private static IServiceCollection AddMqttClientServiceWithConfig(this IServiceCollection services, Action<AspCoreMqttClientOptionBuilder> configure)
{
    services.AddSingleton<IMqttClientOptions>(serviceProvider =>
    {
        var optionBuilder = new AspCoreMqttClientOptionBuilder(serviceProvider);
        configure(optionBuilder);
        return optionBuilder.Build();
    });
    services.AddSingleton<MqttClientService>();
    services.AddSingleton<IHostedService>(serviceProvider =>
    {
        return serviceProvider.GetService<MqttClientService>();
    });
    services.AddSingleton<MqttClientServiceProvider>(serviceProvider =>
    {
        var mqttClientService = serviceProvider.GetService<MqttClientService>();
        var mqttClientServiceProvider = new MqttClientServiceProvider(mqttClientService);
        return mqttClientServiceProvider;
    });
    return services;
}

我不确定我哪里出错了,任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net-core mqtt hivemq mqttnet


    【解决方案1】:

    当我怀疑您确实应该使用普通的 TLS 端点(端口 8883)时,您似乎正在尝试连接到代码中的 WebSocket 端点(端口 8884)

    此外,如果您想让两个客户端同时连接,您将需要使用不同的 clientid 值,因为匹配意味着客户端将不断地互相踢出代理。

    (编辑:仔细观察,客户端 ID 实际上是不同的,但仅在最后一个字符中)

    【讨论】:

    • 感谢您的回复,当我将其切换为使用 TLS 并将证书设置为 AllowUntrustedCertificates = true、IgnoreCertificateChainErrors = true、IgnoreCertificateRevocationErrors = true 时,它​​连接成功。我认为这仅用于测试目的是安全的,并且我必须在部署时安装实际证书。
    • 如果您需要服务器证书,您可以使用 OpenSSL s_client 创建它。 openssl s_client -connect :8883 -showcerts /dev/null | sed -n '/BEGIN/,/END/p' > server.pem 这将创建一个名为“server.pem”的文件,您可以将其用作“服务器证书”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2019-07-16
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多