【发布时间】: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();
}
}
我是连接协议的新手,但我仍然不清楚它们,所以我希望你能帮助我理解这个问题。
【问题讨论】:
-
我发现将模拟器连接到本地服务器很棘手。一旦您获得正确的地址,它很可能会在真实设备上运行。