我正在开发一个非常简单的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();
}
}
我是连接协议的新手,但我仍然不太清楚它们,因此希望您能帮助我理解此问题。
答案 0 :(得分:1)
java.net.ConnectException: Connection refused
异常表示您尝试连接的主机和端口上没有监听服务,例如,因为主机地址或端口错误或服务未启动。
仅当服务器与客户端在同一台计算机上运行(即您的Android设备)时,才将"tcp://localhost:1883"
用作服务器地址。您应该使用服务器的名称或IP地址。
答案 1 :(得分:0)
我猜您的C#代理仅在localhost上侦听,而不在托管它的计算机的外部IP地址上侦听。
这是在同一台计算机上运行C#客户端时起作用的,但是当您使用Android客户端中的外部IP地址时则无效。
另一个可能的选择是您正在代理计算机上运行防火墙,该防火墙正在阻止Android客户端连接。