Я разрабатываю действительно простой клиент 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();
}
}
Я новичок в протоколах соединений и до сих пор не понимаю их четко, поэтому я надеялся, что вы поможете мне разобраться в этой проблеме.