デバイスが予期せず切断された場合は、[デバイス追跡クエリ] (別名:ログ取得) を使用して接続履歴を確認します。クエリ結果には、各接続、切断、クローズのイベントと、その詳細な理由が表示されます。これにより、接続が切断された原因を特定できます。
前提条件
開始する前に、次の項目を満たしていることを確認してください:
稼働中の ApsaraMQ for MQTT インスタンス
対象デバイスの グループ ID と デバイス ID
デバイス接続イベントの照会
ApsaraMQ for MQTT コンソールにログオンします。左側のナビゲーションペインで、[インスタンス]をクリックします。
上部メニューで、インスタンスが存在するリージョンを選択します。インスタンス名をクリックして [インスタンス詳細] ページを開きます。
管理するインスタンスを見つけます。[アクション] 列で、[その他] > [デバイストレースクエリ] を選択します。
[デバイス追跡クエリ] ページで、[グループ ID]、[デバイス ID]、および [時間範囲] を指定し、[検索] をクリックします。
説明照会できる最大期間は 1 日です。
クエリ結果
クエリは、次の列を含むテーブルを返します:
| 列 | 説明 |
|---|---|
| Channel ID | 接続 ID。 |
| デバイスアクション | 接続イベントの種類。詳細は、後述の「デバイスアクション」を参照してください。 |
| アクションの説明 | イベントの理由または結果。詳細は、後述の「アクションの説明」を参照してください。 |
| Time | イベントが発生したタイムスタンプ。 |
デバイスアクション
各デバイスアクションは、MQTT 接続のライフサイクルにおけるステージを表します:
| 値 | 意味 | ライフサイクルステージ |
|---|---|---|
connect | クライアントがブローカーに CONNECT リクエストを送信しました。 | 接続の開始 |
close | TCP 接続がクローズされました。 | 接続の終了 (パッシブ) |
disconnect | クライアントがブローカーに DISCONNECT リクエストを送信しました。 | 接続の終了 (アクティブ) |
アクションの説明
各アクションの説明は、接続状態が変化した理由を示します:
| 値 | 意味 |
|---|---|
accepted | ブローカーがクライアントの接続リクエストを受け入れました。 |
権限なし | 接続がクローズされました。クライアントはインスタンスにアクセスするための権限確認に失敗しました。 |
トピック認証の失敗 | 接続がクローズされました。クライアントはトピックにアクセスするための権限確認に失敗しました。 |
クライアント ID の競合 | クライアント ID の競合により接続がクローズされました。 |
ハートビートなし | 接続がクローズされました。ブローカーがクライアントからのハートビートを検出できませんでした。 |
クライアントによるクローズ | クライアント側の例外により接続がクローズされました。クライアントは DISCONNECT パケットを送信していません。一般的な要因には、クライアント プロセスのクラッシュまたは強制終了 (例: kill -9)、または TCP 接続を異常終了させる内部 MQTT SDK 例外が含まれます。クライアント ログを確認し、切断のタイムスタンプと、クライアント プロセスが異常終了したかどうかを確認してください。 |
Socket IOException | 接続がクローズされました。ネットワークジッターまたはパケットロスにより TCP 接続が切断されました。一般的な要因には、クライアント側ローカルネットワークの一時的な中断、または MQTT 接続をブロックするファイアウォールやプロキシサーバーが含まれます。クライアントのネットワーク接続性を確認し、ファイアウォールおよびセキュリティグループのルールで MQTT ポート (TCP は 1883、TLS は 8883) の通信が許可されていることを確認してください。 |
無効なパラメーター | 接続がクローズされました。リクエストに無効なパラメーターが含まれていました。 |
クライアントによる切断 | クライアントが DISCONNECT パケットを送信して、正常に切断しました。 |
サーバーシャットダウン | 接続がクローズされました。ブローカーがアップグレードされたか、メンテナンスのためにオフラインになりました。 |
クエリ結果が空の場合のトラブルシューティング
クエリ結果が空の場合、選択した時間範囲内にデバイスの接続記録がないことを意味します。次の手順で問題を切り分けてください:
デバイスが接続リクエストを開始したことがあるかを確認する:ルール管理を通じてオンライン/オフライン通知をサブスクライブし、デバイスの接続状態をリアルタイムで監視してください。
デバイス側のネットワークを確認する:デバイスが ApsaraMQ for MQTT のエンドポイントドメインにアクセスできることと、ファイアウォールルールで接続が許可されていることを確認してください。
認証情報を確認する:トークンまたは証明書が期限切れになっておらず、設定が正しいことを確認してください。
再接続ロジックを確認する:デバイスの再接続間隔と最大リトライ回数を確認してください。
時間範囲を確認する:照会できる最大期間は 1 日です。選択した時間範囲に、デバイスが接続した可能性のある期間が含まれていることを確認してください。
切断のトラブルシューティング
アクションの説明の値を使用して、切断の根本原因を特定します:
権限確認の失敗
指標: 権限なし、トピック認証の失敗
クライアントの認証情報が正しいこと、およびインスタンスと対象トピックの両方に対して必要な権限が付与されていることを確認してください。次の項目を確認してください:
クライアントの認証情報が有効であり、期限切れになっていないこと。
クライアントがサブスクライブまたはパブリッシュする特定のトピックに対して、トピック権限が付与されていること。
クライアント ID の競合
指標: クライアント ID の競合
同一のクライアント ID を共有する 2 つのクライアントは、同時接続を維持できません。解決するには、次のように対応してください:
各クライアントで一意のクライアント ID を使用してください。
重複デプロイや、複数のデバイスに同一 ID を割り当てる誤ったデバイスプロビジョニング設定がないか確認してください。
ハートビートタイムアウト
指標: ハートビートなし
ブローカーは、クライアントからハートビートを受信しない場合に接続をクローズします。考えられる原因は次のとおりです:
ネットワークが不安定で、ハートビートパケットがブローカーに到達しません。
クライアント プロセスがブロックされている、または過負荷のため、ハートビートを適時に送信できません。
クライアント側の予期しないクローズ
指標: クライアントによるクローズ
クライアントが DISCONNECT パケットを送信しないまま、TCP 接続が終了しました。これは通常、次の状況を示します:
内部 MQTT SDK 例外を含む、クライアント アプリケーションのクラッシュまたは未処理例外。
kill -9の実行などにより、クライアント プロセスが強制終了された。
クライアント アプリケーションのログで、切断のタイムスタンプとクライアント プロセスが異常終了したかどうかを確認してください。
一時的なネットワーク障害や、接続をブロックするファイアウォールなどのネットワーク レベルの中断は、別の理由として報告されます。詳細は、後述の「ネットワークジッターまたはパケットロス」を参照してください。
ネットワークジッターまたはパケットロス
指標: Socket IOException
クライアントとブローカー間のネットワークジッターまたはパケットロスにより、TCP 接続が切断されました。考えられる原因は次のとおりです:
NIC 障害による OS レベルのネットワーク中断など、クライアント側での一時的なネットワーク障害。
MQTT 接続をブロックするファイアウォールまたはプロキシサーバー。
クライアントが ApsaraMQ for MQTT のエンドポイントに到達できることと、ファイアウォールおよびセキュリティグループのルールで MQTT ポート (TCP は 1883、TLS は 8883) の通信が許可されていることを確認してください。
無効なパラメーター
指標: 無効なパラメーター
クライアントが無効なパラメーターを含むリクエストを送信したため、接続がクローズされました。クライアント側の接続パラメーターをプロトコル要件と照合し、無効な値を修正してください。
ブローカーのメンテナンス
指標: サーバーシャットダウン
対応は不要です。ブローカーは、計画されたアップグレードまたはメンテナンス期間中に接続をクローズしました。
関連トピック
デバイスのステータスの照会:デバイスが現在オンラインかオフラインかを確認します。