MQTTクライアントは複数種類のQoSレベルの使用をサポートしており、各レベルはメッセージが期待通りに処理されたことを確認するための異なるレベルで機能します。
次のQoSレベルがあります。
mtqsAtMostOnce:(デフォルトでは)メッセージは基盤となる TCP/IP ネットワークのベストエフォートに従って配信されます。レスポンスは期待されず、プロトコルではリトライのセマンティクスは定義されていません。メッセージはサーバーに1回届くか、まったく届かないかのいずれかです。
mtqsAtLeastOnce: サーバーによる メッセージの受信は、ACKNOWLEDGMENTメッセージによって確認応答されます。 通信リンク、送信デバイス、または確認応答メッセージのいずれかに 識別された障害があり、指定された期間後に 確認応答メッセージが受信されない場合、送信者はメッセージを再送します。 メッセージは少なくとも1回サーバーに到着します。QoS レベル1のメッセージには、メッセージにIDパラメータがあります。
mtqsExactlyOnce: メッセージが正確に1回届くことが保証されます。このレベルは例えば、メッセージの重複や損失が誤った請求につながる可能性がある課金システムで使用できます。通信リンクまたは送信デバイスの障害が特定された場合、または指定期間内に確認応答メッセージが受信されない場合、送信者はメッセージを再送します。
OnPubAck または OnPubComp イベントを処理してメッセージがサーバーで処理されたかどうかを確認するか、メソッド PublishAndWait を使用してメッセージがサーバーで処理されたかどうかを確認できます。
PublishAndWait の使用方法は通常の Publish メソッドと同じですが、Timeout という新しいパラメータがあります。一定の時間が経過してもサーバーからの応答がない場合、メソッドは false を返します。デフォルトでは 10 秒です。
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');