Le client MQTT permet l'utilisation de certains niveaux de QoS, chacun de ces niveaux fonctionnant différemment pour s'assurer que les messages ont été traités comme prévu.
Il existe les niveaux QoS suivants :
mtqsAtMostOnce : (par défaut) le message est livré selon les meilleurs efforts du réseau TCP/IP sous-jacent. Aucune réponse n'est attendue et aucune sémantique de nouvelle tentative n'est définie dans le protocole. Le message arrive au serveur une fois ou pas du tout.
mtqsAtLeastOnce: la réception d'un message par le serveur est accusée réception par un message d'ACCUSÉ DE RÉCEPTION. En cas de défaillance identifiée de la liaison de communication ou du dispositif émetteur, ou si le message d'accusé de réception n'est pas reçu après un délai spécifié, l'expéditeur renvoie le message. Le message arrive au serveur au moins une fois. Un message avec le niveau QoS 1 a un paramètre ID dans le message.
mtqsExactlyOnce : où les messages sont assurés d'arriver exactement une fois. Ce niveau pourrait être utilisé, par exemple, avec des systèmes de facturation où des messages en double ou perdus pourraient entraîner l'application de frais incorrects. En cas d'échec identifié du lien de communication ou du dispositif émetteur, ou si le message d'accusé de réception n'est pas reçu après une période de temps spécifiée, l'émetteur renvoi le message.
Vous pouvez gérer les événements OnPubAck ou OnPubComp pour savoir si le message a été traité par le serveur ou vous pouvez utiliser la méthode PublishAndWait pour savoir si le message a été traité par le serveur.
L'utilisation de PublishAndWait est identique à la méthode Publish normale, mais vous disposez d'un nouveau paramètre appelé Timeout, où la méthode retournera false si après un certain délai il n'y a pas de réponse du serveur. Par défaut, cette valeur est de 10 secondes.
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');