このセクションでは、Cloud IoT Core の使用時に発生する可能性のある一般的な問題について説明します。
- デバイスで Cloud IoT Core MQTT ブリッジへの TLS 接続が確立できない場合は、環境にルート証明書が必要な場合があります。Google のルート証明書は Google Internet Authority のサイトからインストールできます。
デバイスが MQTT ブリッジに接続できない
デバイスが MQTT 接続に接続しようとしますが、接続に失敗します。残念ながら MQTT プロトコルでは堅牢なエラー報告ができないため、こうした問題をデバッグするのは困難です。
SSL 経由で MQTT ブリッジに接続できることを確認します。多くの企業ファイアウォールではポート 8883 がブロックされています。社内の IT チームと協力してポート 8883 へのアクセスを許可するか、ポート 443 を使用してください。(使用しているポートに応じて)次のいずれかのコマンドを実行して、MQTT ブリッジへの TLS 接続をテストします。
openssl s_client -connect mqtt.googleapis.com:8883
openssl s_client -connect mqtt.googleapis.com:443
MQTT エンドポイントへの接続に成功すると、このコマンドによって証明書チェーンとサーバー証明書情報が出力されます。接続が維持され、入力を待機します。このテストでは、Cloud IoT Core への TLS 接続を確立できることを確認します。
- Google のルート証明書がインストールされていることを確認します。Google Internet Authority のサイトからダウンロードできます。
gcloud を使用してエラーをチェックし、デバイスとレジストリが存在することを確認します。無効なデバイス ID で接続しようとすると、接続は直ちに終了します。
gcloud iot registries describe REGISTRY_ID \ --project=PROJECT_ID \ --region=REGION
gcloud iot devices describe DEVICE_ID \ --project=PROJECT_ID \ --region=REGION \ --registry=REGISTRY_ID
devices describe
コマンドは、デバッグに役立つその他のエラー メッセージを表示することがあります。
devices describe
コマンドを使用して、デバイスの認証情報が期限切れではないことを確認します。認証情報に有効期限が設定されていない場合、期限切れになることはありません。デバイスの認証に使用する JWT の
exp
クレームを確認します。トークンの最大有効時間は 24 時間です。詳細については、JSON ウェブトークンの使用をご覧ください。デバイスの時計が正確であることを確認します。デバイスの時計は MQTT クライアントに接続してセンサーデータを公開するタイミングを決定するため、ネットワーク内のすべてのデバイスを MQTT サーバーと同期させる必要があります。クライアントは、Google Public NTP Server を使用して、デバイスの時計を協定世界時(UTC)と同期できます。
デバイスが MQTT ブリッジから切断される
デバイスは MQTT ブリッジに接続できますが、すぐに切断されるか、予期せず切断されます。サーバーのアップデートと負荷分散が行われると、非常にまれに切断されることがあります。
デバイスの最新のエラー ステータスを確認します。デバイスの最新のエラー ステータスとメッセージを確認するには、以下の gcloud コマンドを使用します。必ずタイムスタンプを記録してください。このフィールドはクリアされず、以前のエラーを示している可能性があります。
gcloud iot devices describe DEVICE_ID \ --project=PROJECT_ID \ --region=REGION \ --registry=REGISTRY_ID
- エラーコード番号は、Google RPC エラーコードを指します。
前のセクションの手順を行って、デバイスが接続できることを確認します。
デバイスが接続直後に切断された場合は、MQTT クライアント ライブラリが MQTT 3.1.1 を使用していることを確認します。多くのライブラリはデフォルトの MQTT 3.1 を使用します。Cloud IoT Core ではサポートされていないため、デバイスの接続が直ちに切断されます。通常、バージョンは最初に接続するときに MQTT ライブラリのクライアント オプションに設定されます。
- たとえば、Paho Java クライアントを使用している場合は、
connectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
を呼び出す必要があります。
- たとえば、Paho Java クライアントを使用している場合は、
テレメトリー データを送信後、すぐにデバイスの接続が解除された場合は、適切な権限が設定されたデバイス テレメトリー用の Cloud Pub/Sub トピックが作成されていることを確認してください。Cloud Pub/Sub でテレメトリー データを受信していないをご覧ください。
デバイスの認証に使用する JWT の
exp
クレームを確認します。トークンの最大有効時間は 24 時間です。詳細については、JSON ウェブトークンの使用をご覧ください。JWT の有効期限が切れると、デバイスの接続は解除され、再接続が必要になります。これは想定されている動作です。新しい JWT を作成して再接続する必要があります。MQTT ブリッジでは、特定のデバイス ID に対して 1 つの接続のみが許可されます。すでに接続しているデバイスの ID で 2 つ目のデバイスが接続すると、古いデバイス接続は自動的に終了します。
デバイスのハートビートが十分の頻度であることを確認します。MQTT クライアント ライブラリを使用すると、ユーザーがハートビート インターバルを指定できます。デバイスから 1.5 倍の時間内に MQTT ブリッジ メッセージを受信しないと、デバイスは切断されます。多くのクライアント ライブラリは、他のメッセージが送信されていない場合(MQTT PINGREQ メッセージ)、空のメッセージを自動的に送信します。ただし、クライアント ライブラリによって自動的に行われない場合があります。さらに、MQTT クライアント構成でハートビート間隔(ハートビート間隔)を増やして、デバイスが確実に機能するようにできます。
Cloud Pub/Sub でテレメトリー データを受信していない
デバイスが接続され、MQTT ブリッジにメッセージが公開されます。 Cloud Pub/Sub トピックには含まれていません。これは通常、Cloud Pub/Sub の構成に誤りがあるか、割り当てが不足していることを意味します。
前のセクションの説明に従って、デバイスが接続可能で、接続解除されていないことを確認します。クライアント ライブラリは、接続と切断のコールバックを提供します。これらを使用して、デバイスが正常に接続していることを確認します。
Google Cloud Console の IAM ページで、関連するプロジェクトのサービス アカウントのメンバーリストに Cloud IoT Core サービス エージェントのロールが表示されていることを確認します(末尾が
@gcp-sa-cloudiot.iam.gserviceaccount.com
のプロジェクト サービス アカウントを探します)。Cloud IoT Core サービス エージェントのロールが [メンバー] リストに表示されない場合は、gcloud を使用して関連するプロジェクト サービス アカウントの
cloudiot.serviceAgent
ロールを追加します。このロールには、Pub/Sub トピックに公開する権限が含まれています。PROJECT_ID と PROJECT_NUMBER を見つけるには、こちらのヘルプ記事をご覧ください。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudiot.iam.gserviceaccount.com \ --role=roles/cloudiot.serviceAgent
レジストリに構成されたトピックが正しいことを確認します。
gcloud iot registries describe REGISTRY_ID \ --project=PROJECT_ID \ --region=REGION
デバイス テレメトリー用のトピックのサブスクリプションが作成されたことを確認します。Cloud Pub/Sub は、すべてのサブスクリプションが確認応答するまでメッセージを保持しますが、サブスクライバーがない場合、メッセージは永続化されません。
サブスクリプションを一覧表示するには:
gcloud pubsub topics list-subscriptions \ projects/my-iot-project/topics/TOPIC_NAME
トピックのサブスクリプションを作成するには:
gcloud pubsub subscriptions create \ projects/my-iot-project/subscriptions/SUBSCRIPTION_NAME \ --topic TOPIC_NAME
gcloud を使用してサブスクリプションからメッセージを pull できるかどうかを確認します。pull できるものの Pub/Sub クライアント ソフトウェアで受信されない場合は、クライアント ソフトウェアが正しく設定されていない可能性があります。
gcloud pubsub subscriptions pull \ projects/my-iot-project/subscriptions/SUBSCRIPTION_NAME
複数の Pub/Sub トピックを含むようにデバイス レジストリを構成した場合は、次の条件に当てはまることを確認してください。
テレメトリー データを公開する MQTT または HTTP サブフォルダに、一致する Pub/Sub トピックがある
デバイス レジストリにデフォルトの Pub/Sub トピックがある
デフォルトの Pub/Sub トピックは、サブフォルダを持たない公開済みテレメトリー イベントや、指定されたサブフォルダ内に一致するトピックがない場合に使用されます。デフォルトの Pub/Sub トピックを選択しないと、これらのテレメトリー イベントは失われます。
デバイス レジストリを作成するときに、デフォルトの Pub/Sub トピックを追加する必要があります。そうしていない場合は、Google Cloud コンソール、
gcloud iot registries update
コマンド、DeviceRegistrypatch
メソッドのいずれかを使用するトピックを追加できます。新しい Pub/Sub トピックをデバイス レジストリのデフォルトにするには、トピックを追加するときにサブフォルダを指定しないでください。
Cloud Pub/Sub から古いテレメトリー データを受信している
Cloud Pub/Sub からテレメトリー イベントを受信できます。サブスクライバーは古いイベントを受信します。これは、Cloud Pub/Sub がバックログを構築したときに発生します。Cloud Pub/Sub は、1 つのトピックについて、各メッセージが少なくとも 1 回は確実に配信されることを保証します。サブスクライバーがメッセージを消費したり、メッセージの確認応答を行わない場合は、メッセージが再配信されます。これは、サブスクライバーが実行されていないか、メッセージの処理速度が遅すぎる場合に発生する可能性があります。
- Cloud Pub/Sub サブスクライバーが、処理したメッセージの確認応答を行っていることを確認します。
- サブスクライバーが遅延している場合は、サブスクライバーを削除して再作成することでバックログを消去できます。
Cloud Pub/Sub のその他の問題
Cloud Pub/Sub のドキュメントをご覧ください。