【问题标题】:Android client cannot connect to C# MQTT Server, error code 32103Android 客户端无法连接到 C# MQTT 服务器,错误代码 32103
【发布时间】:2019-02-15 11:14:50
【问题描述】:

我正在开发一个非常简单的 MQTT Android 客户端,因此我可以使用我在 C# 中使用 MQTTnet 库创建的 MQTT 服务器连接到它。

我首先使用 C# 客户端和 Node-RED 测试了 C# 代理,它运行良好。 我还按照this 教程使用 CloudMQTT 测试了 Android 客户端,它也运行良好。

但是当我尝试将我的 Android 客户端连接到 C# 服务器时,Android 客户端给了我以下错误:

Mqtt: 无法连接到: tcp://localhost:1883 无法连接到服务器 (32103) - java.net.ConnectException: 连接被拒绝

我正在使用 BlueStacks 作为模拟器(我会尽快在真正的 Android 设备上对其进行测试)。我尝试重新启动模拟器(如Paho Mqtt Android connecting to broker fails with (32103) 中所说),但它也不起作用。

Android 客户端的代码和我之前提到的教程中的完全一样(使用 Paho-MQTT 库),但是改变了 serverUri 和订阅主题:

final String serverUri = "tcp://localhost:1883";
final String subscriptionTopic = "step/time";

该应用只有一个 TextView,我在其中设置接收到的消息。

对于 C# 服务器,我每 10 秒发送一次时间戳。这是我的代码:

namespace MQTTServerExample
{
    class Program
    {
        static void Main(string[] args)
        {
            serverAsync();
        }

        private static async Task serverAsync()
        {
            // Starting the MQTT Server
            var mqttServer = new MqttFactory().CreateMqttServer();
            var options = new MqttServerOptions();

            //Saving retained application messages
            options.Storage = new RetainedMessageHandler();

            // Publishing messages
            await mqttServer.StartAsync(options);
            Console.WriteLine("### SERVER CONNECTED ###");
            Console.WriteLine("Press ENTER to exit.");
            MqttApplicationMessage message;

#pragma warning disable CS4014
            Task.Run(async () =>
             {
                 while (true)
                 {
                     message = new MqttApplicationMessageBuilder()
                             .WithTopic("step/time")
                             .WithPayload(DateTime.Now.ToString())
                             .WithExactlyOnceQoS()
                             .WithRetainFlag(true)
                             .Build();
                     await mqttServer.PublishAsync(message);
                     await Task.Delay(10000); // Every 10 seconds
                 }
             });
#pragma warning restore CS4014

            //await mqttServer.PublishAsync(message);

            Console.ReadKey();
            await mqttServer.StopAsync();
        }
    }

我是连接协议的新手,但我仍然不清楚它们,所以我希望你能帮助我理解这个问题。

【问题讨论】:

  • 我发现将模拟器连接到本地服务器很棘手。一旦您获得正确的地址,它很可能会在真实设备上运行。

标签: c# android mqtt


【解决方案1】:

java.net.ConnectException: Connection refused 异常表示没有服务在您尝试连接的主机和端口上侦听,例如因为主机地址或端口错误,或者服务未启动。

使用"tcp://localhost:1883" 作为服务器地址仅在服务器与客户端在同一台机器上运行时才有效(即在您的情况下为 Android 设备)。您应该使用服务器的名称或 IP 地址。

【讨论】:

  • 您好,谢谢!我实际上用我机器的 IP 尝试过,它给了我同样的错误,所以我不确定为什么会这样。
  • 所以它可以从 C# 客户端运行,但不能从 Android 客户端运行? C# 客户端与服务器在同一台机器上吗?如果是这样,可能是防火墙问题
  • 没错!我想那一定是防火墙问题。我会在星期一试试这个,然后回复你。谢谢!
【解决方案2】:

我猜你的 C# 代理只监听 localhost 而不是托管它的机器的外部 IP 地址。

这在同一台机器上运行 C# 客户端时会起作用,但在您使用来自 Android 客户端的外部 IP 地址时不起作用。

另一个可能的选择是您在代理机器上运行防火墙,阻止 Android 客户端连接。

【讨论】:

  • 如果它是第一个选项,我怎样才能让代理也监听外部 IP?我会在星期一研究这两个选项并回复您,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2018-10-14
  • 2015-08-21
  • 1970-01-01
  • 2013-12-05
  • 2014-05-21
相关资源
最近更新 更多