我想我的问题是,我每次调用该函数时都会生成新的MQTT客户端。但我不知道如何解决这个问题。我尝试在调用“发布”任务时连接客户端,但随后应用程序就崩溃了。如果我把一个发布部分放在连接函数后面,消息就会被发布。我只是不知道如何在每次调用函数时不被强制生成var MQTTclient新函数。我可能是在监督一些事情,因为我是C#的新手,从来没有用过这个库。
namespace InfiniLight
{
public class MQTT
{
public static async Task<bool> Publish(string channel, string value)
{
var factory = new MqttFactory();
var mqttClient = factory.CreateMqttClient();
if (mqttClient.IsConnected == false)
{
Debug.WriteLine("publishing failed");
return false;
}
var message = new MqttApplicationMessageBuilder()
.WithTopic(channel)
.WithPayload(value)
.WithExactlyOnceQoS()
.WithRetainFlag()
.Build();
await mqttClient.PublishAsync(message);
return true;
}
//connect to mqtt
public static async Task Connect()
{
var factory = new MqttFactory();
var mqttClient = factory.CreateMqttClient();
string clientId = Guid.NewGuid().ToString();
string mqttURI = Preferences.Get("broker_ip", "");
string mqttUser = Preferences.Get("client_username", "");
string mqttPassword = Preferences.Get("client_password", "");
int i;
i = System.Convert.ToInt32(Preferences.Get("broker_port", "1883"));
int mqttPort = i;
bool mqttSecure = false;
var messageBuilder = new MqttClientOptionsBuilder()
.WithClientId(clientId)
.WithCredentials(mqttUser, mqttPassword)
.WithTcpServer(mqttURI, mqttPort)
.WithCleanSession();
var options = mqttSecure
? messageBuilder
.WithTls()
.Build()
: messageBuilder
.Build();
Debug.WriteLine("MQTT: connecting");
await mqttClient.ConnectAsync(options, CancellationToken.None);
Debug.WriteLine("MQTT: connected");
/*
var message = new MqttApplicationMessageBuilder()
//here it does send the message
.WithTopic("hey")
.WithPayload("I'm a mobile")
.WithExactlyOnceQoS()
.WithRetainFlag()
.Build();
await mqttClient.PublishAsync(message); */
}
}
}发布于 2020-09-02 22:35:07
将mqttClient更改为类的静态成员,而不是局部变量。然后在调用Publish()之前创建连接,或者在Publish()中创建一次连接,并使用一个条件检查它是否已经连接。无论哪种方式,您都可以重用相同的对象,而不必重新创建它。
https://stackoverflow.com/questions/59344253
复制相似问题