Qual è la differenza tra MQTT e Web Socket e quando dovrei usarli?


17

Quali sono le principali differenze tra MQTT e Web Socket?

Quando si utilizza l'IoT per l'automazione domestica, controllare e monitorare l'accesso su diversi dispositivi, quale di questi dovrebbe essere utilizzato quando è richiesta l'accessibilità basata su API Rest e basata su browser.

Sto usando Java (Libreria Pi4J) su un Raspberry Pi 2 B +.

Ho una configurazione di diversi sensori come luce e buio, umidità, PID ecc.

Ho anche un server cloud dove posso inviare i dati se necessario.


1
Decidi tu quale utilizzare definendo chiaramente tutti i tuoi requisiti attuali e probabili futuri. Quindi si genera una matrice incrociata che mostra quale tecnologia soddisfa meglio le proprie esigenze. Scegli quindi di utilizzare una o più tecnologie per soddisfare le tue esigenze.

Risposte:


23

L'impostazione della domanda qui è un po 'fuorviante, perché in realtà questi protocolli non possono assolutamente essere confrontati insieme. Sono come TCP e IP, strati uno sopra l'altro. [1]

Websocket è un protocollo di basso livello per fornire cose che il suo http RESTful 'concorrente' allo stesso livello non fornisce: un canale sempre aperto senza necessità di aprire e chiudere ad ogni richiesta. [2]

MQTT offre un modo leggero per pubblicare o sottoscrivere dati. La confusione potrebbe essere che tali abbonamenti siano una sorta di canali, ma questo è un diverso tipo di canale. Per stabilire una connessione aperta costante in MQTT sono necessari Websocket E MQTT contemporaneamente.

In IoT, così come in qualsiasi progetto, devi selezionare se hai bisogno di un flusso o meno (WebSocket vs RESTful) e su MQTT potresti dover pensare se vuoi un abbonamento e un meccanismo di pubblicazione sulla tua app.

In alcune circostanze puoi considerare MQTT su WebSocket, se c'è qualcosa di comune in giro. [3]

Rispondi alla domanda:

Dici di avere una configurazione di un Rasperry Pi e diversi sensori in tutto il luogo. Se i sensori sono lontani da Rasperry con i propri controller, è possibile utilizzare MQTT per raccogliere i dati. Per archiviare i dati nel cloud, inviare i dati in HTTP. Nel cloud fornire dati attraverso il resto. [4]

Per i websocket non è necessario, ma se lo trovi utile, usalo.

fonti:

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

[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
Rilevante anche per il tuo ultimo punto: questa risposta di Roger Light, sviluppatore del broker Mosquitto MQTT che confronta i casi d'uso di socket grezzi con socket Web con MQTT.
— Aurora0001

Grazie mico questa è una spiegazione meravigliosa. ma non sono ancora chiaro cosa usare .. cosa consiglieresti per il mio scenario?
— Shakti Phartiyal,

3
Ottima risposta, ma: l'utilizzo di "apri e chiudi" WRT WS: // vs. HTTP: // potrebbe essere fuorviante; in primo luogo, le richieste HTTP 1.1 possono essere pipeline, quindi a livello letterale socket una connessione può includere un numero indefinito di richieste senza aprirsi e chiudersi in quel senso. Sarebbe meglio dire che il vantaggio dei websocket è che non c'è impegno per un ciclo sincrono di "richiesta e risposta" ; hai un canale aperto e bidirezionale con un insieme minimo di regole per lo scambio.
— Riccioli d'oro,

"Per stabilire una connessione aperta costante in MQTT sono necessari Websocket E MQTT allo stesso tempo." Ne sei sicuro? Spiegare perché MQTT deve utilizzare webSocket per mantenere una "connessione aperta costante" se il client può semplicemente continuare a pubblicare i pacchetti PINGRESP sul server? Un client che implementa MQTT invierà un pacchetto PINGRESP per mantenere attiva la connessione e un client che impianta webSocket utilizzerà keepAlive () per inviare un pacchetto vuoto webSocket.send ('') al server per mantenere attiva la connessione.
— Giovanni

Hmm .. Puoi mantenere viva la connessione con quel pacchetto . Ho scoperto che MQTT funziona su TCP / IP (non HTTP). In tal caso è possibile lasciare aperta la connessione.
— mico,

9

Sono comparabili in quanto entrambi consentono di avere una comunicazione full duplex in modo tale che il server possa passare immediatamente i dati al client, senza che il client esegua il polling (come potrebbe essere con HTTP).

Tuttavia, Websocket è progettato per una semplice connessione punto-punto tra un client e un server. MQTT sovrappone ulteriori astrazioni oltre all'invio di messaggi di base, in modo che più parti interessate possano sottoscrivere messaggi che potrebbero interessarli. I messaggi possono quindi essere instradati per "argomento del messaggio" in modo che molti client possano condividere una coda nozionale, in cui un server può scegliere di ascoltare tutti i messaggi di tutti i client, ma può anche filtrare per argomento.

MQTT ha una varietà di altre utili funzioni, ad esempio messaggi conservati, in modo tale che gli abbonati ricevano immediatamente il messaggio e LWT (Last Will and Testament) che è un messaggio che può essere inviato automaticamente se il client si disconnette in modo anomalo. In sintesi, MQTT è "più in alto nello stack" offrendo funzionalità e astrazioni che un semplice WebSocket non offre.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.