Android客户端无法连接到C#MQTT Server,错误代码32103

时间:2019-02-15 11:14:51

标签: c# android mqtt

我正在开发一个非常简单的MQTT Android客户端,因此可以使用使用MQTTnet库在C#中创建的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();
        }
    }

我是连接协议的新手,但我仍然不太清楚它们,因此希望您能帮助我理解此问题。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我猜您的C#代理仅在localhost上侦听,而不在托管它的计算机的外部IP地址上侦听。

这是在同一台计算机上运行C#客户端时起作用的,但是当您使用Android客户端中的外部IP地址时则无效。

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