MQTT:サブスクライバーはプロデューサーに非同期でデータを送信できますか?


7

TCPソケットを介してペイロードを1日1回サーバーに送信するシナリオ IoTデバイス(現在はIPv4デバイス)。サーバーにはパブリックIPアドレスがあり、デバイスはルーター/ NATの背後にあります。ESP8266に基づくモジュール(つまり、Olimexのモジュール)を使用します

目標は、サーバーは、それが必要とする時はいつでも任意のクライアントにデータを送信することができるはずです。ホールパンチングのように、クライアントからクライアントへの直接通信(つまり、スマートフォンからデバイスに接続)には興味がありません。

その他の要件 IoTデバイスは、数千まで成長する可能性があります。インターネット接続は、4G対応のルーター/モデムによって提供されます。

提案される解決策 私が理解している限り、一般的な解決策はMQTTです。クライアントは定期的にブローカー(ホスティングサーバーで実行されているMosquitto)にデータを送信します。ブローカーは同じサーバーで実行されているメインのWebアプリを更新します。

質問 Webアプリは、ブローカーを通じて必要なときにいつでも任意のクライアントにデータを送信できますか?言い換えれば、サブスクライバーは特定のパブリッシャーに非同期に(つまり、次の送信を待たずに)データを送り返すことができますか?

回答:


8

MQTTクライアントはサブスクライブとパブリッシュの両方が可能であり、それらの間に違いはありません(どのユーザーが何を実行できるかを制御する可能なACLルールのみ)。

また、特定のクライアントが別のクライアントにデータを送信するという概念はありません。メッセージは他のクライアントではなくトピックに公開されます。他のクライアントがそのクライアントにメッセージを送信するために使用できる特定のトピックにサブスクライブする特定のクライアントを停止するものはありません。

トピックに関するメッセージを発行する前に、受信サブスクリプションを待つ必要もありません。

MQTT v5は要求/応答スタイルのメッセージングの概念を追加しますが、これを行う方法は、メッセージに追加のトピックフィールドを含めることです。この追加トピックは、サブスクライバーが読み取ることができ、返信メッセージを公開するために使用できます。しかし、それはハード要件ではなくヒントとしてのみ存在します。

WebアプリはWebSocket上のMQTTを使用してブローカーに接続し、他のMQTTクライアントと同じように動作します。


明確な答え。私が正しく理解していれば、ブローカーの観点から見ると、IoTデバイスとWebアプリはどちらも「クライアント」であり、必要に応じてパブリッシャーまたはサブスクライバーとして機能できます。次に、(たとえば)メインアプリがデバイスに「今」再起動するように要求できるトピックを定義するのは私自身です。「今」は、デバイスがブローカーと実際にデータを交換するときです。
マーク・

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.