MQTTとWebソケットの違いは何ですか?また、いつ使用する必要がありますか?


17

MQTTとWeb Socketsの主な違いは何ですか?

ホームオートメーションにIoTを使用する場合-さまざまなデバイスでアクセスを制御および監視します。RestAPIベースおよびブラウザーベースのアクセシビリティが必要な場合は、どちらを使用する必要があります。

Raspberry Pi 2 B +でJava(Pi4Jライブラリ)を使用しています。

明暗、湿度、PIDなどのいくつかのセンサーのセットアップがあります。

また、必要に応じてデータを送信できるクラウドサーバーもあります。


1
現在および将来のすべての要件を明確に定義することにより、使用するものを決定します。次に、要件に最適なテクノロジーを示すクロスマトリックスを生成します。次に、要件を満たすために1つ以上のテクノロジーを使用することを選択します。

回答:


23

ここでの質問の設定は、実際にはこれらのプロトコルをまったく比較できないため、少し誤解を招く可能性があります。それらはTCPとIPのようなものであり、互いの上の層です。[1]

Websocketは、同じレベルにある「競合」RESTful httpでは提供されないものを提供する低レベルのプロトコルです。リクエストごとに開閉する必要のない常に開いているチャネルです。[2]

MQTTは、データを公開またはサブスクライブするための軽量な方法を提供します。混乱は、それらのサブスクリプションが何らかのチャネルであるということかもしれませんが、それは異なるタイプのチャネルです。MQTTで常時オープン接続を確立するには、WebsocketとMQTTが同時に必要です。

IoTでは、どのデザインでも、ストリームが必要かどうか(WebSocketsとRESTful)を選択する必要があり、MQTTについては、アプリでサブスクリプションと公開メカニズムが必要かどうかを考える必要があります。

状況によっては、一般的なことがあれば、MQTT over WebSocketsを検討することもできます。[3]

質問への回答:

あなたは、Rasperry Piのセットアップと場所の周りにいくつかのセンサーがあると言います。センサーが独自のコントローラーを備えたRasperryから遠く離れている場合、MQTTを使用してデータを収集できます。データをクラウドに保存するには、データをHTTPで送信します。クラウドでは、休息を通じてデータを提供します。[4]

WebSocketの場合、必要はありませんが、便利な場合は使用してください。

ソース:

[1] https://www.quora.com/What-are-the-pros-and-cons-of-WebSockets-versus-MQTT-as-real-time-web-infrastructure-for-the-Internet-of -事

[2] https://www.pubnub.com/blog/2015-01-05-websockets-vs-rest-api-understanding-the-difference/

[3] /programming/30624897/direct-mqtt-vs-mqtt-over-websocket

[4] http://www.theinternetofthings.eu/antonio-grasso-mqtt-vs-http-what-best-protocol-iot


3
あなたの最後のポイントにも関連しています:Roger Light、Mosquitto MQTTブローカーの開発によるこの回答は、MQTTを使用してrawソケットとWebソケットの使用例を比較しています。
Aurora0001

素晴らしい説明であるmicoに感謝します。しかし、私はまだ何を使うべきか明確ではありません。私のシナリオに何を勧めますか?
シャクティファルティヤール

3
すばらしい答えですが、「オープンおよびクローズ」 WRT WS:// vs HTTP://の使用は誤解を招くかもしれません。まず、HTTP 1.1リクエストはパイプライン化できるため、リテラルソケットレベル1の接続では、その意味で開いたり閉じたりすることなく、無制限の数のリクエストを含めることができます。websocketの利点は、同期的な「要求と応答」サイクルへのコミットメントがないということです。交換用のルールの最小限のセットを備えたオープンな双方向チャネルがあります。
-goldilocks

「MQTTで常時オープン接続を行うには、WebsocketとMQTTが同時に必要です。」これについて確かですか?クライアントがPINGRESPパケットをサーバーにパブリッシュし続けることができる場合、MQTTがwebSocketsを使用して「常時オープン接続」を維持する必要がある理由を説明してください。MQTTを実装するクライアントは、接続を維持するためにPINGRESPパケットを送信し、webSocketを実装するクライアントはkeepAlive()を使用して空のパケットwebSocket.send( '')をサーバーに送信し、接続を維持します。
ジョン

うーん。そのパケットで接続を維持できます。MQTTがTCP / IP(HTTPではなく)で動作することがわかりました。その場合、接続を開いたままにしておくことができます。
mico

9

どちらも、サーバーがクライアントにデータをポーリングすることなく(HTTPの場合のように)データをすぐにクライアントに渡すことができるように、全二重通信を可能にする点で同等です。

ただし、Websocketsは、クライアントとサーバー間の単純なポイントツーポイント接続用に設計されています。MQTTは、基本的なメッセージ送信の上に追加の抽象化を階層化するため、複数の関係者が興味のあるメッセージをサブスクライブできます。したがって、メッセージは「メッセージトピック」によってルーティングできるため、多くのクライアントが概念キューを共有できます。サーバーは、すべてのクライアントからのすべてのメッセージを聞くことを選択できますが、トピックでフィルタリングすることもできます。

MQTTには、サブスクライバーがメッセージをすぐに受信できるように保持されるメッセージや、クライアントが異常切断した場合に自動的に送信できるメッセージであるLWT(Last Will and Testament)など、その他のさまざまな便利な機能があります。要約すると、MQTTは単純なWebsocketにはない機能と抽象化を提供する「スタックの上位」です。

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