Devo usare i socket Web di Mosquitto o collegare direttamente i client?


11

Secondo questo blog , Mosquitto (il broker MQTT) ora supporta la connessione ai client tramite socket Web. L'articolo del blog sembra suggerire che i socket Web sono più utili per le applicazioni browser, poiché i browser Web non supportano (ancora) i socket TCP corretti, sebbene il protocollo dei socket Web sia supportato dalla maggior parte dei browser moderni.

Se avessi solo vari client in una rete (ad es. Sensori e attuatori basati su microcontrollori come Raspberry Pis), ci sarebbe qualche vantaggio nell'usare i web socket su connessioni TCP dirette? Il sovraccarico del protocollo web socket vale la pena solo quando si comunica con un browser?


1
Puoi dirci se stai programmando tutta la rete? Vale a dire tutti i nodi o sia client che server? O se devi interagire con il software di qualcun altro? Sembra che potresti codificare solo i clienti, ma non posso esserne sicuro
Mawg dice di reintegrare Monica il

1
@Mawg il server sarà il broker Mosquitto MQTT, ma posso scegliere quale protocollo utilizzare per tutti i client (e Mosquitto offre sia socket Web sia connessioni TCP dirette, motivo per cui ho chiesto).
Aurora0001

1
Penso che ci sia un po 'di confusione qui. Suppongo che @ Auroa0001 significhi che "direct TCP" sta usando MQTT su TCP anziché MQTT su Websocket (... su TCP). In entrambi i casi sono disponibili librerie, quindi non è necessario scrivere alcun codice per i socket.
ralight

@ralight sì, quella era la mia intenzione davvero quando facevo la domanda. Le risposte sono andate un po 'fuori strada, a quanto pare.
Aurora0001

Risposte:


7

La domanda qui sembra essere "dovrei usare MQTT su TCP o usare MQTT su websocket (che passa anche su TCP)?" In altre parole, "incapsulare MQTT nel protocollo dei websocket è una buona idea?"

Questo dipende (quasi) interamente dalla tua applicazione e dal fatto che tu abbia bisogno del supporto di websocket, probabilmente per consumare messaggi in un browser o per motivi di firewall. Se non puoi avere il tuo server accessibile sulla porta 1883 o 8883 o meglio per MQTT puro, allora i websocket potrebbero essere la tua migliore opzione.

I websocket richiedono una larghezza di banda aggiuntiva, ma se questo è importante per te è qualcosa che solo tu puoi rispondere.

Vale anche la pena notare che nelle attuali versioni di Mosquitto, i websocket non funzionano come potrebbero, quindi potrebbe esserci ulteriore latenza durante l'invio / la ricezione dei messaggi dei websocket. Questo è qualcosa che non sarà un problema nelle versioni future.


7

Quando si comunica solo all'interno della propria rete ( intranet ), l'utilizzo di TCP puro andrà bene. Ma se devi connetterti a un altro server, sorgeranno problemi.

Perché la maggior parte dei server moderni non consente ai client di connettersi tramite porte casuali. Consentono solo la connessione di alcune porte dedicate. È tutto. Quindi se devi connetterti ad un altro server, meglio usare websocket piuttosto che pura connessione TCP.

Se stai considerando il sovraccarico, non è molto più grande. Puoi fare riferimento a questo articolo , se vuoi saperne di più sull'overhead del websocket.

Secondo la mia opinione personale, è meglio usare sempre websocket, tranne per i seri dubbi.


2
Err, TCP e websocket sono protocolli: tools.ietf.org/html/rfc6455 , inoltre TCP è un socket a basso livello.
Goufalite,

@ThisaruGuruge grazie per la tua risposta - nel mio scenario nella domanda presumo che sceglieresti TCP su socket Web a giudicare dalla tua risposta? Soprattutto perché i socket Web sembrano essere supportati principalmente dai browser, quindi c'è il sovraccarico del codice di dover utilizzare i socket Web su socket TCP.
Aurora0001

1
"la maggior parte dei server moderni non consente ai client di connettersi attraverso porte casuali" - il server può scegliere a quale porta associarsi ( man7.org/linux/man-pages/man2/bind.2.html ), più un firewall può limitarlo ulteriormente. TUTTAVIA, io non sono d'accordo quando si dice "se si dispone di connettersi a un altro server, i problemi saranno sorgere". Sostituire che come " può sorgere". Anche allora, è una questione di configurazione, che i websocket renderanno probabilmente più semplice dei socket grezzi.
Mawg dice di ripristinare Monica il

6

tl; dr - preferisci sempre biblioteche gratuite per codificarti da solo (a meno che tu non abbia requisiti estremi)


Devo usare i socket Web di Mosquitto o collegare direttamente i client?

Quanto dura un pezzo di spago? (YMMV)

Posso solo parlare in generale, ma preferisco sempre le librerie wrapper ai socket grezzi (o, in effetti, alla codifica di tutto ciò che posso ottenere gratuitamente da una libreria).

Rendono la codifica più semplice e meno soggetta a errori. Si occupano di un sacco di pulizie domestiche e gestione degli errori, che è un codice che dovresti scrivere ed eseguire il debug tu stesso, dove una libreria è stata generalmente ben rivista e testata e viene utilizzata da migliaia di altri, tutti i quali segnalerà / risolverà i bug per te.

Inoltre, è meno codice da mantenere (e, possibilmente, porta), il che significa più tempo per sviluppare, testare e lucidare la tua app o passare a quella successiva.

L'unico sovraccarico è senza dubbio una chiamata di funzione, se si accetta che tutta quella bontà bibliotecaria (gestione degli errori, manutenzione dei tubi e simili) è qualcosa che si dovrebbe codificare per ottenere un software buono, stabile.

Se sei preoccupato per le prestazioni, basta profilo. Ma, a meno che il tuo socket non sia attivo centinaia di volte al secondo, non mi preoccuperei nemmeno.


Bene, ci sono librerie gratuite per connessioni TCP e connessioni (web) socket ed entrambe richiedono un evento "messaggio ricevuto".
Goufalite,

2
OP vuole sapere se è meglio usare TCP o websocket per efficienza , e tu dici "usa una libreria di astrazione in modo da non disturbare". Certo, ma quale? In C # Esiste una libreria TcpClient in System.Net.Sockets (bene, bene ...) e una libreria websocket in un pacchetto nuget (WebSocketSharp). Sono d'accordo che esiste una libreria MQTT generica per tutte le lingue ma OP vuole avere il controllo su di essa per scegliere quale protocollo deve usare.
Goufalite,
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.