web-dev-qa-db-ja.com

MQTTNetトピックメッセージのリッスン

私は既存のアプリケーションにMQTTを統合しています。組み込みMQTTブローカーを実行するためにこれを使用しました https://github.com/chkr1011/MQTTnet ライブラリ。

現在、ブローカーの起動には次の方法が使用されています。

public async Task StarBrokerAsync()
{
    var optionsBuilder = new MqttServerOptionsBuilder()
        .WithConnectionBacklog(ConnectionBacklog)
        .WithDefaultEndpointPort(Port);

    MqttServer = new MqttFactory().CreateMqttServer();
    await MqttServer.StartAsync(optionsBuilder.Build());
 }

私が欲しいのは、せいぜい別のクライアントを作成することなく、特定のトピックのメッセージをリッスンすることです。ライブラリのドキュメントや同様の質問は見つかりませんでした。

問題の解決策はありますか?

8
Laura Legrand

サーバーインスタンス内で実行できることがわかっている限り、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接続のインスタンスを作成してブローカーにサブスクライブすることもできます。

お役に立てば幸いです。

1
CROSP