Xamarin.Forms 单击按钮时 MQTT 发布
Xamarin.Forms MQTT Publish upon button click
我一直在使用 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 服务器。
任何人都可以提供有关如何使其正常工作的任何建议
谢谢
我遇到了同样的问题。正如 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 条目。
我一直在使用 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 服务器。
任何人都可以提供有关如何使其正常工作的任何建议
谢谢
我遇到了同样的问题。正如 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 条目。