web-dev-qa-db-ja.com

接続されたMQTTクライアントの詳細を見つける方法

別のクライアントから接続されているすべてのクライアントの詳細(IPと名前)を見つける方法はありますか?現在接続されているクライアントの数を示すトピック「$ SYS/broker/clients/active」があることは知っていますが、接続されている各クライアントについて詳しく知りたい場合は、方法はありますか?

サーバー上にあるMQTTブローカーに(ワイヤレスネットワークを使用して)多数のクライアントを接続するソリューションを開発しています。また、同じマシンで実行され、ブローカーに接続されている別のクライアントがあります。ブローカーに接続されている新しいクライアントがあるかどうか、またはクライアントが切断されているかどうかを監視します。新しいクライアントが接続したとき、または接続したクライアントが切断されたときに、ブローカーコンソールにメッセージが表示されます。ブローカーに接続されているクライアントから同様のものを取得できますか?これを達成するための最善の方法を提案してください。

前もって感謝します。

-ディリップ

16
Dilip

元の質問も、後続の質問への回答も、使用しているブローカーの実装を識別します。したがって、あなたの質問に対するより効率的な答えがあるかもしれません。

その情報がなければ、プロトコル自体で何ができるかに焦点を当てましょう。

MQTTはRETAINEDメッセージをサポートします。これは、ブローカーが各トピックに対して保持されている最新のメッセージを保存する場所です。クライアントがトピックをサブスクライブすると、保持されたメッセージ(存在する場合)を受信します。

また、Last Will and Testament(LWT)機能(goetzchrが参照)もあります。これは、クライアントが異常に切断した場合に、クライアントに代わってメッセージを公開するために使用できます。

これら2つの機能を組み合わせることで、すべてプロトコル内で、ブローカー上にシンプルなプレゼンスサービスを構築できます。それはこのように動作します:

  1. クライアントが接続すると、クライアントはRETAINEDメッセージをそのクライアントに固有のトピックに公開します。次に例を示します。

    clients/my_client_id/state

    ペイロードは1です。 (my_client_idをクライアント自身のIDに置き換えます。

  2. また、接続時に、同じトピックに公開されるようにLWTメッセージを設定しますが、ペイロードは0です。これもRETAINEDメッセージである必要があります。

  3. クライアントが正常に切断されると、ペイロードが0のRETAINEDメッセージが同じトピックに公開されます。

これにより、別のクライアントがclients/#にサブスクライブして、クライアントの接続状態の変化を示すすべてのメッセージ(クライアントを識別する完全なトピック、および接続状態を示すペイロードの値)を受信できます。

接続状態だけでなく、より多くの情報を取得するために、クライアントは、接続時に別の保持メッセージを別のトピックに公開できます。たとえば、関心のあるすべての情報を含むclients/my_client_id/infoです。

これは、ブローカーに接続しているすべてのクライアントを制御し、それらをこのように動作させることができる場合にのみ機能します。

これは理想的なアプローチではありません。うまくいけば、ブローカーの実装がこれを行うためのサーバー側の手段を提供するでしょう。

25
knolleary

knollearyがすでに述べたように、これは実装固有であり、MQTT自体によって提供されるものではありません。

1つの解決策は、 HiveMQ MQTTブローカー を使用することです。プラグインSDKがあり、コールバックを介してこのようなカスタマイズを行うことができます。つまり、クライアントが接続、切断、メッセージの送信、メッセージのサブスクライブを行うたびに、電子メールの送信のようにカスタムコードを実行できます。カスタムコードを作成すると、コールバックを呼び出したクライアントに関するすべての情報にアクセスできます。したがって、動作を実装するのは簡単です。唯一のことは、メールアドレスをどこに保存するかです。それはユーザー名ですか?

カスタムHiveMQプラグインの作成の詳細については、 入門ガイド および GitHubのプラグインの例 を参照してください。

(開示:私はHiveMQ開発者の1人です)

乾杯、クリス

6
Christian Götz