Soll ich die Web-Sockets von Mosquitto verwenden oder Clients direkt verbinden?

11

Laut diesem Blog unterstützt Mosquitto (der MQTT-Broker) jetzt die Verbindung zu Kunden über Web-Sockets. Der Blog - Artikel scheint anzudeuten , dass Web - Sockets für Browser - Anwendungen nützlicher sind, da Web - Browser (noch) nicht die richtige TCP - Sockets unterstützen, obwohl die Web - Socket - Protokoll wird von der Mehrheit der modernen Browsern unterstützt.

Wenn ich nur verschiedene Clients in einem Netzwerk habe (z. B. Sensoren und Aktoren, die auf Mikrocontrollern wie Raspberry Pis basieren), hat die Verwendung von Web-Sockets gegenüber direkten TCP-Verbindungen einen Vorteil? Lohnt sich der Overhead des Web-Socket-Protokolls nur, wenn Sie mit einem Browser kommunizieren?

Aurora0001
quelle
1
Können Sie uns bitte mitteilen, ob Sie das gesamte Netzwerk codieren? Dh alle Knoten oder sowohl Client als auch Server? Oder wenn Sie mit der Software eines anderen interagieren müssen? Es hört sich so an, als würden Sie nur die Clients codieren, aber ich kann nicht sicher sein
Mawg sagt, Monica
1
@Mawg der Server wird der Mosquitto MQTT-Broker sein, aber ich kann wählen, welches Protokoll ich für alle Clients verwende (und Mosquitto bietet sowohl Web-Sockets als auch direkte TCP-Verbindungen an, weshalb ich gefragt habe).
Aurora0001
1
Ich denke, hier gibt es einige Verwirrung. Ich nehme an, was @ Auroa0001 unter "direktem TCP" versteht, ist die Verwendung von MQTT über TCP anstelle von MQTT über Websockets (... über TCP). In beiden Fällen sind Bibliotheken verfügbar, sodass kein Code für Sockets geschrieben werden muss.
Ralight
@ralight ja, das war wirklich meine Absicht, als ich die Frage stellte. Die Antworten sind anscheinend etwas in die Irre gegangen.
Aurora0001

Antworten:

7

Die Frage hier scheint zu sein: "Soll ich MQTT über TCP oder MQTT über Websockets (die auch über TCP gehen) verwenden?" Mit anderen Worten, ist "das Einkapseln von MQTT in das Websockets-Protokoll eine gute Idee?"

Dies hängt (fast) ausschließlich von Ihrer Anwendung ab und davon, ob Sie Unterstützung für Websockets benötigen - wahrscheinlich zum Konsumieren von Nachrichten in einem Browser oder aus Firewall-Gründen. Wenn Ihr Server nicht über Port 1883 oder besser 8883 für reines MQTT zugänglich sein kann, sind Websockets möglicherweise die beste Option.

Websockets erfordern zwar zusätzliche Bandbreite, aber ob dies für Sie wichtig ist, können nur Sie beantworten.

Es ist auch erwähnenswert, dass in aktuellen Versionen von Mosquitto Websockets nicht so gut funktionieren wie sie könnten, so dass es beim Senden / Empfangen von Websockets-Nachrichten zu einer zusätzlichen Latenz kommen kann. Dies ist jedoch in zukünftigen Versionen kein Problem.

ralight
quelle
7

Wenn Sie nur innerhalb Ihres Netzwerks ( Intranet ) kommunizieren , ist die Verwendung von reinem TCP in Ordnung. Wenn Sie jedoch eine Verbindung zu einem anderen Server herstellen müssen, treten Probleme auf.

Weil die meisten modernen Server es Clients nicht erlauben, über zufällige Ports eine Verbindung herzustellen. Sie erlauben nur einigen dedizierten Ports, eine Verbindung herzustellen. Das ist alles. Wenn Sie daher eine Verbindung zu einem anderen Server herstellen müssen, verwenden Sie lieber einen Websocket als eine reine TCP-Verbindung.

Wenn Sie den Overhead in Betracht ziehen, ist er nicht viel größer. Sie können auf diesen Artikel verweisen , wenn Sie mehr über den Overhead des Websockets erfahren möchten.

Meiner persönlichen Meinung nach ist es besser, immer Websocket zu verwenden, es sei denn, Sie haben ernsthafte Bedenken.

ThisaruG
quelle
2
Err, TCP und Websockets sind Protokolle: tools.ietf.org/html/rfc6455 , außerdem ist TCP ein Socket auf niedriger Ebene.
Goufalite
@ThisaruGuruge, danke für deine Antwort - in meinem Szenario in der Frage gehe ich davon aus, dass du nach deiner Antwort TCP über Web-Sockets auswählen würdest? Insbesondere, da Web-Sockets hauptsächlich von Browsern unterstützt werden, besteht der Code-Overhead für die Verwendung von Web-Sockets über TCP-Sockets.
Aurora0001
1
"Die meisten modernen Server erlauben es Clients nicht, über zufällige Ports eine Verbindung herzustellen " - der Server kann auswählen, an welchen Port gebunden werden soll ( man7.org/linux/man-pages/man2/bind.2.html ), sowie eine Firewall schränken das weiter ein. Allerdings glaube ich nicht zustimmen , wenn Sie sagen „ wenn Sie auf einen anderen Server verbinden, Problemen wird auftreten“. Formulieren Sie dies als " kann entstehen". Selbst dann ist es eine Frage der Konfiguration, welche Websockets wahrscheinlich einfacher machen als Raw-Sockets.
Mawg sagt, Monica
6

tl; dr - bevorzugen Sie immer freie Bibliotheken, um sie selbst zu codieren (es sei denn, Sie haben extreme Anforderungen)


Soll ich die Web-Sockets von Mosquitto verwenden oder Clients direkt verbinden?

Wie lang ist ein Stück Schnur? (YMMV)

Ich kann nur allgemein sprechen, aber ich ziehe Wrapper-Bibliotheken immer Raw-Sockets vor (oder der Codierung von allem, was ich kostenlos aus einer Bibliothek bekommen kann).

Sie machen die Codierung einfacher und weniger fehleranfällig. Sie kümmern sich um eine Menge Hausarbeit und Fehlerbehandlung. Dies ist Code, den Sie selbst schreiben und debuggen müssten, da eine Bibliothek im Allgemeinen gut überprüft und getestet wurde und von Tausenden anderen verwendet wird, die alle von ihnen verwendet werden wird Fehler für Sie melden / beheben.

Außerdem müssen Sie weniger Code warten (und möglicherweise portieren), was mehr Zeit bedeutet, um Ihre App zu entwickeln, zu testen und zu polieren oder mit der nächsten fortzufahren.

Der einzige Aufwand ist wohl ein Funktionsaufruf, wenn Sie akzeptieren, dass all diese Bibliothekargüte (Fehlerbehandlung, Schlauchhaltung und dergleichen) etwas ist, das Sie selbst codieren müssten, um eine gute, stabile Software zu erhalten.

Wenn Sie über die Leistung besorgt sind, nur Profil. Aber wenn Ihre Steckdose nicht hunderte Male pro Sekunde aktiv ist, würde ich mich nicht einmal darum kümmern.

Mawg sagt, Monica wieder einzusetzen
quelle
Nun, es gibt kostenlose Bibliotheken für TCP-Verbindungen und (Web-) Socket-Verbindungen, und beide erfordern ein Ereignis "Empfangene Nachricht".
Goufalite
2
OP möchte wissen, ob es aus Effizienzgründen besser ist, TCP oder Websockets zu verwenden , und Sie sagen "Verwenden Sie eine Abstraktionsbibliothek, damit Sie sich nicht darum kümmern". Sicher, aber welches? In C # gibt es eine TcpClient-Bibliothek in System.Net.Sockets (na ja ...) und eine Websocket-Bibliothek in einem Nuget-Paket (WebSocketSharp). Ich bin damit einverstanden, dass es eine generische MQTT-Bibliothek für alle Sprachen gibt, aber OP möchte die Kontrolle darüber haben, um zu entscheiden, welches Protokoll es verwenden muss.
Goufalite