Der MQTT-Client erlaubt die Verwendung einiger QoS-Stufen-Typen, jede dieser Stufen funktioniert auf einer anderen Ebene, um sicherzustellen, dass Nachrichten wie erwartet verarbeitet wurden.
Es gibt die folgenden QoS-Stufen:
mtqsAtMostOnce: (standardmäßig) die Nachricht wird gemäß den bestmöglichen Bemühungen des zugrunde liegenden TCP/IP-Netzwerks zugestellt. Es wird keine Antwort erwartet und im Protokoll sind keine Wiederholungssemantiken definiert. Die Nachricht erreicht den Server entweder einmal oder gar nicht.
mtqsAtLeastOnce: der Empfang einer Nachricht durch den Server wird durch eine ACKNOWLEDGMENT-Nachricht bestätigt. Wenn es einen identifizierten Ausfall der Kommunikationsverbindung oder des sendenden Geräts gibt oder die Bestätigungsnachricht nicht nach einem bestimmten Zeitraum empfangen wird, sendet der Sender die Nachricht erneut. Die Nachricht trifft mindestens einmal am Server ein. Eine Nachricht mit QoS- Level 1 hat einen ID-Parameter in der Nachricht.
mtqsExactlyOnce: wobei Nachrichten garantiert genau einmal ankommen. Diese Stufe könnte beispielsweise bei Abrechnungssystemen verwendet werden, bei denen doppelte oder verlorene Nachrichten zu falschen Gebührenabrechnungen führen könnten. Wenn ein identifizierter Ausfall entweder der Kommunikationsverbindung oder des Sendegeräts vorliegt oder die Bestätigungsnachricht nicht innerhalb eines bestimmten Zeitraums empfangen wird, sendet der Sender die Nachricht erneut.
Sie können die Ereignisse OnPubAck oder OnPubComp behandeln, um zu erfahren, ob die Nachricht vom Server verarbeitet wurde, oder Sie können die Methode PublishAndWait verwenden, um zu erfahren, ob die Nachricht vom Server verarbeitet wurde.
Die Verwendung von PublishAndWait ist dieselbe wie die der normalen Publish-Methode, aber jetzt haben Sie einen neuen Parameter namens Timeout, bei dem die Methode false zurückgibt, wenn nach einem bestimmten Zeitraum keine Antwort vom Server vorliegt. Standardmäßig beträgt dieser Wert 10 Sekunden.
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');