MQTT immer verbunden und 4G Daten laden

10

Ich arbeite an einem IoT-Projekt, an dem Tausende von MQTT-Clients beteiligt sind, die über einen 4G / WiFi-Router / Modem mit einem Broker (Moskito) verbunden sind. Weniger als 10 Clients sind mit demselben Router verbunden, und die Router stammen von verschiedenen Orten (verschiedenen Städten).

Im Moment haben wir nur sehr wenige Kunden, die immer mit dem Broker verbunden sind. Ich weiß aus dieser Diskussion, dass es keine Probleme geben wird, selbst wenn sie auf über 1000 Einheiten anwachsen.

Meine Frage betrifft die Verkehrslast auf der 4G-Verbindung. Der Endbenutzer hat Angst vor dem Datenverbrauch, wenn alle "Kanäle" geöffnet und nicht verwendet werden. Soweit ich weiß, werden, wenn keine Aktivität vorhanden ist, nur die Keep-Alive-Pakete gesendet , obwohl ich diese Informationen in der MQTT-Dokumentation nicht sicher finden kann.

Kann ich davon ausgehen, dass der Datenverkehr, wenn keine Pakete veröffentlicht werden, vernachlässigbar ist?

Kennzeichen
quelle

Antworten:

6

Die MQTT-Spezifikation listet die Details der PINGREQ- und PINGRESP- Pakete auf, aus denen die Keep-Alive-Transaktion besteht.

Jedes ist nur 2 Byte groß, sodass ein vollständiges Keep-Alive-Ereignis insgesamt 4 Byte benötigt. Da Sie steuern können, wie oft Keep-Alive-Pakete für jeden Client gesendet werden, basierend darauf, wie schnell Sie wissen müssen, dass die Verbindung unterbrochen wurde, haben Sie die volle Kontrolle darüber, wie viele Daten verwendet werden, wenn tatsächlich keine Nachrichten veröffentlicht werden.

Wenn Sie die Datenlast noch weiter reduzieren möchten, kann vor dem 4G-Router, mit dem die 10 Geräte verbunden sind, ein separater Broker ausgeführt werden, der dann mit dem zentralen Broker verbunden wird. Dies würde die Anzahl der Keep-Alive-Pakete auf 1 pro 4G-Router anstatt auf 1 pro Client reduzieren. Dies hat den Vorteil, dass die 10 lokalen Geräte weiterhin Nachrichten untereinander weitergeben können, wenn die Verbindung unterbrochen wird, und Sie können beibehaltene Nachrichten / Willens- und Testnachrichten verwenden, um zu verfolgen, wann einzelne Clients ausfallen.

hardillb
quelle
Die Verwendung eines Zwischenbrokers ist ein guter Rat, auch wenn ich befürchte, dass er in diesem speziellen Fall nicht passt. Nützlich zu wissen!
Mark
Wie auch immer, ich kannte das Verhalten von PINGREQ / RESP, aber ich habe nicht festgestellt, dass es sich um die einzigen Pakete handelt, die ausgetauscht werden, wenn keine echte Aktivität vorliegt (dh von den Benutzeranwendungen initiiert wurde). Ich könnte dies aus Ihrer Antwort ableiten, aber die Dokumente scheinen dies nicht explizit anzugeben.
Mark
Der Keep-Alive-Timer wird jedes Mal zurückgesetzt, wenn ein Paket empfangen wird. Ich kann mich nicht erinnern, wo in der Spezifikation dies auf meinem Kopf steht
hardillb
2
Ich wollte nur darauf hinweisen, dass der Vorschlag, einen lokalen Broker einzuführen, noch sinnvoller ist, wenn wir nicht über 2 Bytes pro Nachricht sprechen, aber aufgrund von TCP / IP eher 42 Bytes pro Nachricht, also 84 für einen Ping-Zyklus.
Xwoker
1
@Mark Die Tatsache, dass nur Ping-Pakete gesendet werden, wenn keine Nachrichten gesendet werden, wird durch die Sätze nach dieser Tabelle impliziert: docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/…
hardillb