이 섹션에서는 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
- 오류 코드 번호는 Google RPC 오류 코드를 나타냅니다.
이전 섹션의 단계를 실행하여 기기에 연결할 수 있는지 확인합니다.
연결 후 기기가 즉시 연결 해제되면 MQTT 클라이언트 라이브러리가 MQTT 3.1.1을 사용 중인지 확인합니다. 많은 클라이언트에서 기본적으로 MQTT 3.1이 사용되지만 Cloud IoT Core에서는 이 버전이 지원되지 않습니다. 이 경우 기기가 즉시 연결 해제됩니다. 버전은 일반적으로 처음 연결할 때 MQTT 라이브러리의 클라이언트 옵션에 설정됩니다.
- 예를 들어 Paho 자바 클라이언트를 사용하는 경우
connectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
을 호출해야 합니다.
- 예를 들어 Paho 자바 클라이언트를 사용하는 경우
원격 분석 데이터를 전송한 후 기기가 즉시 연결 해제되면 적절한 권한 집합을 사용해서 기기 원격 분석에 대해 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_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를 통해 구독에서 메시지를 가져올 수 있는지 확인합니다. 메시지를 가져올 수 있지만 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는 주제에 대해 각 구독에 한 번 이상 각 메시지를 전달하도록 보장하고, 구독자가 메시지를 사용하지 않거나 확인하지 않는 경우 메시지가 다시 전송되도록 합니다. 이 문제는 구독자가 실행 중이 아니거나 메시지 처리 속도가 너무 느릴 때 발생할 수 있습니다.
- Cloud Pub/Sub 구독자에서 처리된 메시지가 확인되는지 살펴봅니다.
- 구독자가 뒤에 쳐져 있으면 구독자를 삭제하고 다시 만들어서 백로그를 지울 수 있습니다.
기타 Cloud Pub/Sub 문제
Cloud Pub/Sub 문서를 참조하세요.