Klient MQTT obsługuje kilka poziomów QoS, z których każdy działa w inny sposób, aby zapewnić oczekiwane przetwarzanie wiadomości.
Dostępne są następujące poziomy QoS:
mtqsAtMostOnce: (domyślnie) wiadomość jest dostarczana zgodnie z najlepszymi wysiłkami bazowej sieci TCP/IP. Odpowiedź nie jest oczekiwana i w protokole nie są zdefiniowane żadne semantyki ponownych prób. Wiadomość dociera do serwera raz lub wcale.
mtqsAtLeastOnce: odbiór wiadomości przez serwer jest potwierdzany komunikatem ACKNOWLEDGMENT. Jeśli wystąpi zidentyfikowana awaria łącza komunikacyjnego lub urządzenia wysyłającego, albo komunikat potwierdzenia nie zostanie odebrany po określonym czasie, nadawca ponownie wysyła wiadomość. Wiadomość dociera do serwera co najmniej raz. Wiadomość z poziomem QoS 1 ma w wiadomości parametr ID.
mtqsExactlyOnce: gdzie wiadomości mają gwarancję dostarczenia dokładnie raz. Ten poziom może być używany na przykład w systemach rozliczeniowych, gdzie duplikaty lub utracone wiadomości mogą prowadzić do naliczenia nieprawidłowych opłat. W przypadku wykrycia awarii łącza komunikacyjnego lub urządzenia wysyłającego lub gdy komunikat potwierdzenia nie zostanie odebrany po określonym czasie, nadawca ponownie wysyła wiadomość.
Możesz obsługiwać zdarzenia OnPubAck lub OnPubComp, aby dowiedzieć się, czy wiadomość została przetworzona przez serwer, albo użyć metody PublishAndWait, aby sprawdzić, czy wiadomość została przetworzona przez serwer.
Użycie metody PublishAndWait jest takie samo jak zwykłej metody Publish, ale zawiera dodatkowy parametr Timeout. Metoda zwraca False, jeśli po upływie określonego czasu nie otrzyma odpowiedzi z serwera. Domyślna wartość wynosi 10 sekund.
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');