Яка різниця між MQTT та веб-сокетами, і коли я повинен їх використовувати?


17

Які основні відмінності між MQTT та веб-сокетами?

При використанні IoT для домашньої автоматизації - контроль та моніторинг доступу через різні пристрої, який із них слід використовувати, коли потрібна програма Rest API та доступність на основі браузера.

Я використовую Java (Pi4J Library) на Raspberry Pi 2 B +.

У мене встановлено кілька датчиків, таких як світло і темнота, вологість, PID і т.д.

У мене також є хмарний сервер, куди я можу надсилати дані, якщо потрібно.


1
Ви вирішите, який використовувати, чітко визначивши всі ваші поточні та ймовірні майбутні вимоги. Потім ви генеруєте перехресну матрицю, яка показує, яка технологія найкраще відповідає вашим вимогам. Потім ви вирішите використовувати одну або кілька технологій для задоволення ваших потреб.

Відповіді:


23

Постановка питань тут трохи не вводить в оману, оскільки насправді ці протоколи взагалі не можна порівнювати. Вони схожі на TCP та IP, шари один над одним. [1]

Websockets - це протокол низького рівня, який надає речі, які його "конкурент" RESTful http, який знаходиться на одному рівні, не забезпечує: завжди відкритий канал без необхідності відкривати і закривати при кожному запиті. [2]

MQTT забезпечує легкий спосіб публікації або передплати даних. Плутанина може полягати в тому, що ці підписки - це якісь канали, але це інший тип каналу. Щоб встановити постійне відкрите з'єднання в MQTT, вам потрібно одночасно Websockets І MQTT.

В IoT, як і в будь-якому дизайні, вам потрібно вибрати, потрібен вам потік чи ні (WebSockets vs RESTful), і про MQTT вам, можливо, доведеться думати, чи хочете ви підписатись і публікувати механізм у вашому додатку.

За деяких обставин ви можете розглянути MQTT через WebSockets, якщо навколо є якась звичайна річ. [3]

Відповідь на запитання:

Ви кажете, що у вас є установка Rasperry Pi і кілька датчиків навколо цього місця. Якщо датчики далекі від Rasperry з власними контролерами, ви можете використовувати MQTT для збору даних. Щоб зберігати дані у хмарі, надішліть їх у HTTP. У хмарі надають дані через відпочинок. [4]

У веб-розетках немає потреби, але якщо ви вважаєте це корисним, використовуйте його.

Джерела:

[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
Також стосується вашого останнього пункту: Ця відповідь Роджера Лайт, розробника брокера Mosquitto MQTT, порівнюючи випадки використання сирих розеток з веб-розетками з MQTT.
Aurora0001

Дякую, Міко, це чудове пояснення. але мені все одно не зрозуміло, що використовувати .. що б ви порадили для мого сценарію?
Шакти Фартіял

3
Відмінна відповідь, але: Використання "відкриття та закриття" WRT WS: // vs. HTTP: // може ввести в оману; по-перше, HTTP 1.1 запити можуть бути конвеєрними, тому на рівні буквальних сокетів одне з'єднання може включати невизначене число запитів без відкриття та закриття в цьому сенсі. Перевагою веб-сокетів було б краще сказати, що немає прихильності до синхронного циклу "запит і відповідь" ; у вас відкритий двосторонній канал з мінімальним набором правил обміну.
золотинки

"Щоб встановити постійне відкрите з'єднання в MQTT, вам потрібно одночасно Websockets І MQTT." Ви впевнені в цьому? Поясніть, будь ласка, чому MQTT повинен використовувати webSockets, щоб підтримувати "постійне відкрите з'єднання", якщо клієнт може просто продовжувати публікувати пакети PINGRESP назад на сервер? Клієнт, що реалізує MQTT, надішле пакет PINGRESP, щоб підтримувати з'єднання живим, а клієнт, що імпортує webSockets, буде використовувати KeepAlive () для відправлення порожнього пакета webSocket.send ('') на сервер, щоб зберегти з'єднання живим.
Джон

Хм .. Ви можете підтримувати з'єднання живим із цим пакетом . Я дізнався, що MQTT працює над TCP / IP (не HTTP). У такому випадку ви можете залишити з'єднання відкритим.
mico

9

Вони порівнянні тим, що обидва дозволяють вам мати повний дуплексний зв’язок таким чином, що сервер може негайно передавати дані клієнтові, без того, щоб клієнт опитував їх (як це може бути з HTTP).

Однак Websockets розроблений для простого з'єднання між клієнтом і сервером. MQTT розшаровує додаткові абстракції поверх основного надсилання повідомлень, щоб кілька зацікавлених сторін могли підписатися на повідомлення, які можуть їх зацікавити. Отже, повідомлення можуть бути спрямовані на "тему повідомлень", так що багато клієнтів можуть спільно використовувати умовну чергу, де сервер може вибрати всі повідомлення клієнтів, але може також фільтрувати за темою.

MQTT має цілий ряд інших корисних функцій, наприклад, збережені повідомлення, такі, що підписники негайно отримують повідомлення, і LWT (Last Will and Testament), яке є повідомленням, яке може бути відправлено автоматично, якщо клієнт ненормально відключається. Підводячи підсумок, MQTT "вище на стек", пропонує функції та абстракції, яких не має простий Websocket.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.