如何在 Android 上使用 Xamarin System.Net.Mqtt 调试与 MQTT 服务器的连接?

How to debug connection to MQTT server using Xamarin System.Net.Mqtt on Android?

我正在尝试使用 Xamarin 构建一个简单的 MQTT 应用程序,并在 Android 模拟器和 phone 上对其进行测试。不幸的是,我正在努力与 CreateAsync 建立连接,并且不知道如何调试它。

我已经检查过我可以按如下方式连接到我的 RabbitMQ 服务器:

using System.Net.Mqtt;
Console.WriteLine("Trying to connect...");
var configuration = new MqttConfiguration();
var client = MqttClient.CreateAsync("127.0.0.1", configuration).Result;
var sessionState = await client.ConnectAsync(new MqttClientCredentials(clientId: "test", userName:"mqtt", password:"mqtt"));
Console.WriteLine("...it worked.");
Console.Read();

正如代码告诉我的那样……它起作用了。 :o) RabbitMQ 显示连接。我尝试使用“localhost”、我的 PC 的主机名和 IP 来检查它们是否正常工作,并使用不正确的主机名来查看引发了什么异常(“Socketexception:没有这样的主机是已知的”)。

当我尝试在实际应用程序中执行此操作时,我的麻烦就开始了。连接代码基本上是相同的,但是 运行 在我读到的单独任务中你不应该在 GUI 线程中这样做:

    private async Task<SessionState> Connect(string BrokerHostName, Action<MqttApplicationMessage> publishEventHandler)
    {
        MqttConfiguration config = new MqttConfiguration();
        _client = MqttClient.CreateAsync(BrokerHostName, config).Result;
        SessionState sessionState = await _client.ConnectAsync(
            new MqttClientCredentials(clientId: Id, userName: "mqtt", password: "mqtt")
            );

        await _client.SubscribeAsync("common", MqttQualityOfService.AtMostOnce);

        _client.MessageStream.Subscribe(publishEventHandler);
        return sessionState;
    }

呼叫者:

    var task = Connect(BrokerHostName, publishEventHandler);

但是没有任何反应 - 代码到达这一行并挂起。如果我休息一下,继续继续什么也不做。我确保在 Android 清单中勾选了 INTERNET 和 ACCESS_NETWORK_STATE 权限(尽管没有明显区别)。

这是我在谷歌搜索几个小时后尝试过的:

这感觉像是一个网络问题,因为我可以将任何旧垃圾作为主机地址并且它的行为是一样的,但我完全 运行 不知道接下来要尝试什么或如何查看这是怎么回事。非常感谢收到任何建议!

我现在可以正常工作了。这是我采取的步骤,以防对其他人有所帮助:

  1. 我写了一些测试应用程序来检查 TCP 通信。首先是 Windows 中的客户端和服务器以检查它们是否正常工作,然后是 Xamarin 客户端应用程序。这有效并证明网络连接正常。
  2. 在 Android 模拟器上安装了 MQTT 测试器以证明可以连接到 RabbitMQ。
  3. 尝试了不同的 MQTT 框架:MQTTnet。

类似的问题,但症状不同:代码会卡在 .Wait() 上,而不是在任务本身内。然后我删除了所有的异步代码,然后它就连接上了。

我的结论是,问题可能是我对异步编程缺乏理解。 System.Net.Mqtt 似乎需要它,而 MQTTnet 不需要,所以一切顺利!