MQTT messageId praktische Umsetzung
Die Firma für die ich arbeite, hat ausgewertet, MQTT und beschlossen, es zu benutzen als zentrale messaging-Plattform für eine groß angelegte system. Der Hauptgrund ist, wie kompakt das Protokoll ist und wie leicht es tatsächlich umgesetzt werden. Ich habe ein einziges Problem mit MQTT, obwohl, und ich bin auf der Suche nach einer Antwort auf folgende Frage:
QoS1 und QoS2 Nachrichten bedürfen der Bestätigung vom client. Das einzige, was ich weiß, über die Botschaft (die Identifizierung), wenn die empfangende PUBACK, PUBREC, PUBREL und PUBCOMP ist messageId und die clientId. Message-id ist ein unsigned int16 also der max-Wert ist 65535. Es scheint nicht groß genug sein für die lange Laufzeit Kunden, sagen wir ein Jahr, das senden 15 QoS2 Nachrichten eine Stunde.
Ich bin nicht ganz sicher, ob es keine andere Möglichkeit zur Identifizierung der Nachricht? Ich möchte sein wie mit dem standard konform wie möglich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wahrscheinlich der erste Punkt, um klar zu machen, dass message-IDs behandelt werden, pro client und pro Richtung basis. Das heißt, dass der Makler erstellt eine message-ID für jede ausgehende Nachricht mit QoS - >0 für jeden client angeschlossen ist, und diese message-IDs wird völlig unabhängig von allen anderen Nachrichten-IDs für die gleiche Nachricht veröffentlicht, um anderen Kunden. Ebenfalls jeder client erzeugt seine eigene message-IDs für Nachrichten, die es sendet.
Die message-ID nicht eindeutig sein müssen, damit Ihre Kunden senden 15 Nachrichten pro Stunde mit QoS Ebene 2 würde einfach überlaufen, irgendwann. Die wirkliche Einschränkung ist, dass es nur maximal 65535 Nachrichten pro Richtung "im Flug" auf einmal (D. H. Teil Weise durch die Nachricht handshake). Sobald eine Nachricht mit einer bestimmten ID wurde komplett bearbeitet, dann die Nachricht-ID wiederverwendet werden können.
Andere Art der Betrachtung es ist zu überlegen, wie es funktionieren würde, wenn Ihr Kunde hatte immer nur eine Nachricht im Flug auf einmal, ob, weil die Geschwindigkeit der Nachrichten, die übertragen werden, oder beabsichtigt in den Griff, wie Sie die Nachrichten. In diesem Fall könnten Sie behalten message-ID auf 1 gesetzt, für jede einzelne Nachricht, denn es gibt nie eine chance, dass es ein Duplikat ist.
Wenn Sie unterstützen möchten, um mehrere Nachrichten im Flug auf einmal wäre es relativ einfach zu überprüfen, es gibt keine message-ID Duplikate, bevor Sie eine neue zuordnen.
Da die message-ID pro client, wenn Sie senden eine einzelne Nachricht zu >65535 clients gibt es keine chance der message-ID-Kollisionen. Wenn Sie senden >65535 Nachrichten an jeden client auf einmal und die meldungsflüsse sind nicht vollständig, dann gibt es Probleme.
Beantwortung der Kommentar "ich habe bemerkt, dass jedes MQTT-broker neigt zu liefern, wird nur die Letzte QoS1/2 message":
Den broker wird nur das senden von Nachrichten an clients, die es kennt. Wenn Sie connect zum ersten mal gibt es keinen Weg, um Botschaften aus der Vergangenheit, mit einer Ausnahme: die gespeicherten Nachrichten. Wenn eine Nachricht festgelegt ist, beibehalten, dann ist es ein "last known good" - Wert. Wenn ein neuer client abonniert, es wird die Vorbehaltsware unverzüglich Nachricht das es nützlich für die Dinge, die Häufig aktualisiert werden. Ich vermute, dass dies ist, was Sie sich beziehen. Wenn Sie möchten, dass ein client Nachrichten in die Warteschlange eingereiht, wenn es nicht verbunden ist, dann müssen Sie eine Verbindung mit dem "clean-session" - option deaktiviert, um den Kunden dauerhaft. Sie müssen auch die QoS - >0 Abonnements-und QoS - >0 Publikationen. Wenn Ihr client die Verbindung wiederherstellt (mit sauberen session noch auf "deaktiviert" gesetzt), werden die Nachrichten in der Warteschlange zugestellt werden. Sie können in der Regel konfigurieren Sie die Anzahl der Nachrichten in die Warteschlange, die in dieser Art und Weise, in der die broker, bei dem keine weiteren Nachrichten verworfen werden. Ein wichtiger Punkt ist, dass das einreihen von Nachrichten für einen client, der nicht zuvor verbunden ist, nicht unterstützt von design.
Für die Lieferung von mehr-Nachrichten an QOS1 oder QOS2 verwenden, sollten Sie das Konzept des persistenten Speichers. In diesem, wenn jemals ein Teilnehmer ist nicht verfügbar die Meldung gespeichert werden im persistenten Speicher und liefern, sobald der Abonnent verbunden ist. Sie können dies auf QOS0 auch nach der Konfiguration von mosquitto.conf-Datei.