![](/img/trans.png)
[英]MqttNet - MQTT Client cannot receive all the messages that were published by MQTT Server
[英]MQTTNet Listen for Topic Messages
我正在我們現有的應用程序中集成MQTT
,我使用這個https://github.com/chkr1011/MQTTnet庫來運行嵌入式 MQTT 代理。
目前使用以下方法啟動代理:
public async Task StarBrokerAsync()
{
var optionsBuilder = new MqttServerOptionsBuilder()
.WithConnectionBacklog(ConnectionBacklog)
.WithDefaultEndpointPort(Port);
MqttServer = new MqttFactory().CreateMqttServer();
await MqttServer.StartAsync(optionsBuilder.Build());
}
我想要的是在不創建單獨的客戶端的情況下監聽特定主題中的消息。 我沒有找到圖書館的文檔或任何類似的問題。
有沒有解決問題的辦法?
據我所知,可以在服務器實例中執行此操作,您需要提供IMqttApplicationMessageReceivedHandler
接口的實現。
讓我們考慮一個簡單的實現:
public class MessageHandler: IMqttApplicationMessageReceivedHandler
{
public Task HandleApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs eventArgs)
{
if (eventArgs.ApplicationMessage.Topic == "name_of_desired_topic")
{
// Handle event
}
}
}
然后可以向MqttServer
提供此處理程序的實例,如下所示:
public async Task StarBrokerAsync()
{
// Start broker ...
MqttServer.ApplicationMessageReceivedHandler = new MessageHandler();
}
在這種情況下,您只會收到來自特定主題的消息。 或者,您可以創建MqttClient
connect實例並訂閱代理。
希望對您有所幫助。
mqttServer.UseApplicationMessageReceivedHandler(e =>
{
try
{
string topic = e.ApplicationMessage.Topic;
if (string.IsNullOrWhiteSpace(topic) == false)
{
string payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
Console.WriteLine($"Topic: {topic}. Message Received: {payload}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message, ex);
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.