El cliente MQTT permite el uso de varios tipos de niveles de QoS; cada uno de esos niveles funciona de forma diferente para garantizar que los mensajes se hayan procesado como se esperaba.
Los niveles de QoS disponibles son los siguientes:
mtqsAtMostOnce: (por defecto) el mensaje se entrega según las posibilidades de la red TCP/IP subyacente. No se espera respuesta ni se definen semánticas de reintento en el protocolo. El mensaje llega al servidor una vez o no llega en absoluto.
mtqsAtLeastOnce: la recepción de un mensaje por parte del servidor se confirma mediante un mensaje de CONFIRMACIÓN. Si se produce un fallo identificado en el enlace de comunicaciones o en el dispositivo remitente, o si el mensaje de confirmación no se recibe tras un período de tiempo especificado, el remitente reenvía el mensaje. El mensaje llega al servidor al menos una vez. Un mensaje con nivel QoS 1 tiene un parámetro ID en el mensaje.
mtqsExactlyOnce: donde los mensajes tienen garantía de llegar exactamente una vez. Este nivel podría usarse, por ejemplo, con sistemas de facturación donde los mensajes duplicados o perdidos podrían generar cargos incorrectos. Si se detecta un fallo en el enlace de comunicaciones o en el dispositivo emisor, o si el mensaje de confirmación no se recibe tras un período de tiempo especificado, el emisor reenvía el mensaje.
Puede gestionar los eventos OnPubAck o OnPubComp para saber si el servidor ha procesado el mensaje, o puede usar el método PublishAndWait para saber si el servidor ha procesado el mensaje.
El uso de PublishAndWait es el mismo que el del método Publish normal, pero ahora dispone de un nuevo parámetro llamado Timeout, donde el método devolverá false si tras un determinado período de tiempo no hay respuesta del servidor. Por defecto este valor es de 10 segundos.
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');