문제 해결

이 섹션에서는 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 서버를 사용하여 협정 세계시(UTC)로 기기 시계를 동기화할 수 있습니다.

MQTT 브리지에서 기기 연결이 끊어짐

기기가 MQTT 브리지에 연결할 수 있지만 즉시 또는 예상치 않게 연결이 끊어집니다. 서버 업데이트 및 부하 분산에 따라 아주 가끔 연결이 끊어질 수 있습니다.

  • 기기의 최근 오류 상태를 확인합니다. 아래의 gcloud 명령어를 사용하여 기기의 최근 오류 상태 및 메시지를 검토합니다. 타임스탬프를 확인합니다. 이 필드는 지워지지 않으며, 이전 오류를 나타낼 수 있습니다.

    gcloud iot devices describe DEVICE_ID \
      --project=PROJECT_ID \
      --region=REGION \
      --registry=REGISTRY_ID
    
  • 이전 섹션의 단계를 실행하여 기기에 연결할 수 있는지 확인합니다.

  • 연결 후 기기가 즉시 연결 해제되면 MQTT 클라이언트 라이브러리가 MQTT 3.1.1을 사용 중인지 확인합니다. 많은 클라이언트에서 기본적으로 MQTT 3.1이 사용되지만 Cloud IoT Core에서는 이 버전이 지원되지 않습니다. 이 경우 기기가 즉시 연결 해제됩니다. 버전은 일반적으로 처음 연결할 때 MQTT 라이브러리의 클라이언트 옵션에 설정됩니다.

    • 예를 들어 Paho 자바 클라이언트를 사용하는 경우 connectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);을 호출해야 합니다.
  • 원격 분석 데이터를 전송한 후 기기가 즉시 연결 해제되면 적절한 권한 집합을 사용해서 기기 원격 분석에 대해 Cloud Pub/Sub 주제를 만들었는지 확인합니다. Cloud Pub/Sub에서 원격 분석 데이터가 수신되지 않음을 참조하세요.

  • 기기 인증을 위해 사용되는 JWT에서 exp 클레임을 확인합니다. 토큰의 최대 수명은 24시간입니다. 자세한 내용은 JSON 웹 토큰 사용을 참조하세요. JWT가 만료되면 기기의 연결이 끊어지고 다시 연결해야 합니다. 이는 예상 동작입니다. 기기에서 새 JWT를 만들고 다시 연결해야 합니다.

  • MQTT 브리지는 특정 기기 ID에 대해 단일 연결만 허용합니다. 두 번째 기기가 이미 연결된 기기의 ID로 연결될 경우 이전 기기 연결이 자동으로 해제됩니다.

  • 기기 하트비트가 충분히 자주 수행되는지 확인합니다. heartbeat_interval은 MQTT 클라이언트 라이브러리를 사용하여 지정할 수 있습니다. 이 시간의 1.5배에 해당하는 기간 내에 MQTT 브리지가 기기에서 메시지를 수신하지 못하면 기기 연결이 해제됩니다. MQTT PINGREQ 메시지와 같은 다른 메시지가 전송되지 않은 경우에는 많은 클라이언트 라이브러리가 빈 메시지를 자동으로 전송합니다. 하지만 사용자의 클라이언트 라이브러리가 이를 자동으로 수행하지 못할 수 있습니다. 또한 기기가 연결 상태를 유지할 수 있도록 MQTT 클라이언트 구성에서 heartbeat_interval을 늘려볼 수 있습니다.

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_IDPROJECT_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를 통해 구독에서 메시지를 가져올 수 있는지 확인합니다. 메시지를 가져올 수 있지만 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 주제를 추가합니다. 그렇지 않으면 Cloud Console, gcloud iot registries update 명령어, DeviceRegistry patch 메서드를 사용하여 추가할 수 있습니다. 새 Pub/Sub 주제를 기기 레지스트리의 기본값으로 만들려면 주제를 추가할 때 하위 폴더를 지정하지 않습니다.

Cloud Pub/Sub에서 오래된 원격 분석 데이터가 수신됨

Cloud Pub/Sub에서 원격 분석 이벤트를 수신할 수 있지만, 구독자가 이전 이벤트를 수신합니다. 이 문제는 Cloud Pub/Sub가 백로그를 생성할 때 발생합니다. Cloud Pub/Sub는 주제에 대해 각 구독에 한 번 이상 각 메시지를 전달하도록 보장하고, 구독자가 메시지를 사용하지 않거나 확인하지 않는 경우 메시지가 다시 전송되도록 합니다. 이 문제는 구독자가 실행 중이 아니거나 메시지 처리 속도가 너무 느릴 때 발생할 수 있습니다.

  • Cloud Pub/Sub 구독자에서 처리된 메시지가 확인되는지 살펴봅니다.
  • 구독자가 뒤에 쳐져 있으면 구독자를 삭제하고 다시 만들어서 백로그를 지울 수 있습니다.

기타 Cloud Pub/Sub 문제

Cloud Pub/Sub 문서를 참조하세요.