Клиент Android не может подключиться к серверу C # MQTT, код ошибки 32103 - PullRequest
0 голосов
/ 15 февраля 2019

Я разрабатываю действительно простой клиент MQTT для Android, поэтому я могу подключиться к нему с помощью сервера MQTT, который я создал в C #, используя библиотеку MQTTnet .

Сначала я протестировал брокер C # с клиентом C # и Node-RED, и он работал просто отлично.Я также протестировал Android-клиент с CloudMQTT, следуя этому учебному пособию, и он также прекрасно работал.

Но когда я попытался подключить свой Android-клиент к серверу C #, Android-клиент дал мнеследующая ошибка:

Mqtt: не удалось подключиться: tcp: // localhost: 1883 Невозможно подключиться к серверу (32103) - java.net.ConnectException: соединение отклонено

Я использую BlueStacks в качестве эмулятора (я постараюсь проверить его на реальном устройстве Android как можно скорее).Я попытался перезапустить эмулятор (как было сказано в Paho Mqtt Android, при подключении к брокеру не удается (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 голосов
/ 15 февраля 2019

Я собираюсь предположить, что ваш брокер C # прослушивает только localhost, а не внешний IP-адрес компьютера, на котором он находится.

Это будет работать, когда клиент C # запускается на той же машине, но некогда вы используете внешний IP-адрес от клиента Android.

Другой возможный вариант - использование брандмауэра на компьютере-посреднике, который останавливает подключение клиента Android.

0 голосов
/ 15 февраля 2019

A java.net.ConnectException: Connection refused исключение означает, что на хосте и на порте, к которому вы пытаетесь подключиться, не происходит прослушивание службы, например, из-за неправильного адреса или порта хоста или службы не запущена.

Использование "tcp://localhost:1883" в качестве адреса сервера работает только в том случае, если сервер работает на той же машине, что и клиент (т. Е. В вашем случае устройство Android).Вы должны использовать имя сервера или IP-адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...