Xamarin.Forms MQTT 在按钮单击时发布

Posted

技术标签:

【中文标题】Xamarin.Forms MQTT 在按钮单击时发布【英文标题】:Xamarin.Forms MQTT Publish upon button click 【发布时间】:2019-02-23 22:42:07 【问题描述】:

我一直在 Xamarin Forms(Visual Studio - 我的第一个项目)中编写一小段代码,以便在按下按钮时发送一条 mqtt 消息。 我已经编写了将 mqtt 消息发布到 C# 控制台应用程序中的 test.mosquitto.org 服务器的代码,并且运行良好

using System;
using System.Net.Mqtt;
using System.Text;

namespace MqttTest.Client

class Program

const string topic = "test/test/button";

    static void Main (string[] args)
    
        var config = new MqttConfiguration  Port = 1883 ;
        var client = MqttClient.CreateAsync("test.mosquitto.org", config).Result;
        var clientId = "myClientID";
        string message = "test";


        client.ConnectAsync (new MqttClientCredentials (clientId)).Wait ();
        client.SubscribeAsync (topic, MqttQualityOfService.AtLeastOnce).Wait ();
        //Publishes "message" Var 
        client.PublishAsync(new MqttApplicationMessage(topic, Encoding.UTF8.GetBytes($"message")), MqttQualityOfService.AtLeastOnce).Wait();
    



我现在编写了一个非常简单的 xamarin 跨平台应用程序,其中包含 1 个按钮、1 个 button_clicked 事件以及在上述控制台应用程序中编写的按钮单击事件代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using System.Net.Mqtt;

namespace App1

public partial class MainPage : ContentPage

public MainPage()

InitializeComponent();

const string topic = "test/test/button";

    private void Button_Clicked(object sender, EventArgs e)
    
        var config = new MqttConfiguration  Port = 1883 ;
        var client = MqttClient.CreateAsync("test.mosquitto.org", config).Result;
        var clientId = "clientIdhGHvpYY9uM";
        string message = "Hello";


        client.ConnectAsync(new MqttClientCredentials(clientId)).Wait();
        client.SubscribeAsync(topic, MqttQualityOfService.AtLeastOnce).Wait();
        client.PublishAsync(new MqttApplicationMessage(topic, Encoding.UTF8.GetBytes($"message")), MqttQualityOfService.AtLeastOnce).Wait();
    



在模拟器中测试应用程序时,它加载正常,但是当我单击按钮时,它会冻结(我无法重新单击按钮)应用程序并且不会发布到测试 mqtt 服务器。

任何人都可以提供有关如何使其正常工作的任何建议

谢谢

【问题讨论】:

我想你在 UI/主线程上死锁了,使用 async/await 而不是 .Result 和 .Wait 有很多关于使用异步调用的问题的 SO 问题/答案。 ... 非常感谢您抽出宝贵时间发表评论......我将开始使用 async/await 进行调查 @LinuxVirgin 你找到解决方案了吗? 【参考方案1】:

我有同样的问题。正如 SushiHangover 所指出的,按钮冻结的原因只是您正在连接主线程。异步连接方法可能如下所示:

public async Task<bool> ConnectAsync()

    return await Task.Run(() =>
    
        Log($"Connecting to MqttSettings.Host:MqttSettings.Port");

        try
        
            var configuration = new MqttConfiguration();
            configuration.Port = SolaceSettings.Port;
            _mqttClient = MqttClient.CreateAsync(MqttSettings.Host, configuration).Result;
            _sessionState = _mqttClient.ConnectAsync(new MqttClientCredentials(MqttSettings.MqttClientId, MqttSettings.Username, MqttSettings.Password)).Result;

            Log("Connected.");
            return true;
        
        catch (Exception ex)
        
            Log($"Could not connect. ex");
            return false;
        
    );

但是,这并不能解决无法连接的根本原因。对我来说有两个主要问题:

不要在模拟器中运行,使用真实设备(至少如果您的 Mac 位于代理/防火墙后面)。 我指定了一个随机的客户端 ID。在代理上配置客户端 ID 并在客户端中使用相同的 ID 后,它起作用了。 更新:显然这是错误的,不需要。使用新 ID 连接时会自动生成客户端 ID 条目。

【讨论】:

以上是关于Xamarin.Forms MQTT 在按钮单击时发布的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms:如何为网格内单击的按钮添加背景颜色(单词搜索游戏)

单击按钮上的 Xamarin.Forms 动画(Flash 背景)

我们如何处理 Xamarin Forms Picker 的完成按钮单击事件?

在 Xamarin.Forms 中打开通知

我怎么看我的代码如何执行xamarin.forms

如何在单击 xamarin.forms.maps iOS c# 时更改 pin 图标