タイムアウトエラーについて (MQTT / IoT Device SDK for Java)

今回は IoT Device SDK for Java で MQTT プロトコルを利用した時のタイムアウト値について説明いたします。
Device SDK for Java における MQTT プロトコルでは、IoT Hub とのキープアライブのタイムアウト値として 230 秒という値が設定されております。このキープアライブタイムアウト値はハードコードされており、デバイス アプリ側からは変更することができません。また、キープアライブのインターバル値も 230 秒で、こちらも変更できません。
これは SDK の MqttConnection.java に定義されています。

    //mqtt connection options
    private static final int KEEP_ALIVE_INTERVAL = 230;

ソースコードはこちら
https://github.com/Azure/azure-iot-sdk-java/blob/master/device/iot-device-client/src/main/java/com/microsoft/azure/sdk/iot/device/transport/mqtt/MqttConnection.java

タイムアウトが発生すると、次のようなエラーメッセージが出力されます。

Timed out as no activity, keepAlive=230,000 lastOutboundActivity=2,623,682,362,159 lastInboundActivity=2,623,672,132,304 time=2,623,672,592,158 lastPing=2,623,672,362,159 [水 03 27 12:53:02 JST 2020]

タイムアウトが発生するまでの流れは、次の図のようになります。
image
図を見ていただければ解る通り、タイムアウト値は 230 秒 (3分50秒) ですがキープアライブ間隔も 230 秒です。キープアライブの応答が得られなかった場合 (図中の「応答時間」に依存しますが) 7分以上は接続が確認できなかった状況となります。

一度タイムアウトが発生して接続が切断された場合でも、通常再接続処理がすぐに行われます。再接続処理に失敗する場合、何らかの理由によりデバイスやネットワークの接続状態に問題がある可能性があります。デバイスやネットワーク側に問題がなく IoT Hub 側の問題が疑われる場合は弊社までお問い合わせください。

Azure IoT 開発サポートチーム 祝田