O cliente MQTT permite o uso de alguns tipos de níveis de QoS; qualquer um desses níveis funciona em um nível diferente para garantir que as mensagens foram processadas conforme o esperado.
Existem os seguintes níveis de QoS:
mtqsAtMostOnce: (por padrão) a mensagem é entregue de acordo com o melhor esforço da rede TCP/IP subjacente. Uma resposta não é esperada e nenhuma semântica de retry é definida no protocolo. A mensagem chega ao servidor uma vez ou não chega.
mtqsAtLeastOnce: o recebimento de uma mensagem pelo servidor é confirmado por uma mensagem ACKNOWLEDGMENT. Se houver uma falha identificada do link de comunicação ou do dispositivo de envio, ou a mensagem de confirmação não for recebida após um período de tempo especificado, o remetente reenvia a mensagem. A mensagem chega ao servidor pelo menos uma vez. Uma mensagem com QoS nível 1 tem um parâmetro ID na mensagem.
mtqsExactlyOnce: onde as mensagens têm garantia de chegar exatamente uma vez. Este nível pode ser usado, por exemplo, com sistemas de faturamento, onde mensagens duplicadas ou perdidas poderiam levar a cobranças incorretas. Se houver uma falha identificada no link de comunicação ou no dispositivo de envio, ou se a mensagem de confirmação não for recebida após um período de tempo especificado, o remetente reenvia a mensagem.
Você pode tratar os eventos OnPubAck ou OnPubComp para saber se a mensagem foi processada pelo servidor, ou pode usar o método PublishAndWait para saber se a mensagem foi processada pelo servidor.
O uso de PublishAndWait é o mesmo que o método Publish normal, mas agora você tem um novo parâmetro chamado Timeout, onde o método retornará false se, após um certo período de tempo, não houver resposta do servidor. Por padrão, este valor é de 10 segundos.
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');