Il client MQTT consente l'utilizzo di alcuni tipi di livelli QoS, ognuno dei quali funziona in modo diverso per garantire che i messaggi siano stati elaborati come previsto.
Esistono i seguenti livelli QoS:
mtqsAtMostOnce: (per impostazione predefinita) il messaggio viene consegnato secondo il massimo impegno della rete TCP/IP sottostante. Non è prevista una risposta e nessuna semantica di retry è definita nel protocollo. Il messaggio arriva al server una volta o non arriva affatto.
mtqsAtLeastOnce: la ricezione di un messaggio da parte del server è confermata da un messaggio di ACKNOWLEDGMENT. Se si verifica un errore identificato nel collegamento di comunicazione o nel dispositivo mittente, oppure se il messaggio di conferma non viene ricevuto entro un periodo di tempo specificato, il mittente reinvia il messaggio. Il messaggio arriva al server almeno una volta. Un messaggio con livello QoS 1 ha un parametro ID nel messaggio.
mtqsExactlyOnce: dove si garantisce che i messaggi arrivino esattamente una volta. Questo livello potrebbe essere utilizzato, per esempio, con sistemi di fatturazione dove messaggi duplicati o persi potrebbero portare a addebiti errati. Se si verifica un guasto identificato del collegamento di comunicazione o del dispositivo di invio, oppure il messaggio di conferma non viene ricevuto dopo un periodo di tempo specificato, il mittente reinvia il messaggio.
Può gestire gli eventi OnPubAck o OnPubComp per sapere se il messaggio è stato elaborato dal server, oppure può usare il metodo PublishAndWait per sapere se il messaggio è stato elaborato dal server.
L'utilizzo di PublishAndWait è uguale al normale metodo Publish, ma ora si dispone di un nuovo parametro chiamato Timeout, dove il metodo restituirà false se trascorso un determinato periodo di tempo, non vi è risposta dal server. Per impostazione predefinita questo valore è 10 secondi.
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');