MQTT 프로토콜을 사용하여 DPS와 통신

Azure IoT DPS(Device Provisioning Service)를 사용하면 디바이스가 다음을 사용하여 DPS 디바이스 엔드포인트와 통신할 수 있습니다.

DPS는 완전한 기능을 갖춘 MQTT broker가 아니며 MQTT v3.1.1 표준에 지정된 모든 동작을 지원하지는 않습니다. 이 문서에서는 디바이스가 지원되는 MQTT 동작을 사용하여 DPS와 통신하는 방법을 설명합니다.

DPS와 통신하는 모든 디바이스는 TLS/SSL을 사용하여 보호되어야 합니다. 따라서 DPS는 1883 포트를 통한 비보안 연결을 지원하지 않습니다.

참고 항목

DPS는 현재 MQTT 프로토콜을 통해 TPM 증명 메커니즘을 사용하는 디바이스를 지원하지 않습니다.

DPS에 연결

디바이스는 MQTT 프로토콜을 사용하여 다음 옵션 중 하나를 사용하여 DPS 인스턴스에 연결할 수 있습니다.

MQTT 프로토콜 직접 사용(디바이스로)

디바이스가 디바이스 SDK를 사용할 수 없는 경우라도 포트 8883에서 MQTT 프로토콜을 사용하는 공용 디바이스 엔드포인트에 연결할 수 있습니다. CONNECT 패킷에서 디바이스는 다음 값을 사용해야 합니다.

  • ClientId 필드에 registrationId를 사용합니다.

  • 사용자 이름 필드에 {idScope}/registrations/{registration_id}/api-version=2019-03-31을 사용합니다. 여기서 {idScope}는 DPS의 ID 범위이고 {registration_id}는 디바이스의 등록 ID입니다.

    참고 항목

    X.509 인증서 인증을 사용하는 경우 디바이스 리프(최종 엔터티) 인증서의 주체 CN(일반 이름)에서 등록 ID를 제공합니다. 사용자 이름 필드의 {registration_id}는 일반 이름과 일치해야 합니다.

  • 암호 필드에는 SAS 토큰을 사용합니다. SAS 토큰의 형식은 HTTPS 및 AMQP 프로토콜에 대해 동일합니다.

    SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration resourceURI는 {idScope}/registrations/{registration_id} 형식이어야 합니다. 정책 이름(skn)은 registration으로 설정되어야 합니다.

    참고 항목

    X.509 인증서 인증을 사용하는 경우 SAS 토큰 암호는 필요하지 않습니다.

    SAS 토큰을 생성하는 방법에 대한 자세한 내용은 DPS에 대한 액세스 제어의 보안 토큰 섹션을 참조하세요.

다음은 DPS 구현 관련 동작의 목록입니다.

  • DPS는 영구 세션을 지원하지 않습니다. CleanSession 플래그 값에 관계없이 모든 세션을 비영구적으로 처리합니다. CleanSession을 true로 설정하는 것이 좋습니다.

  • 디바이스 앱이 QoS 2의 토픽을 구독하는 경우, DPS는 SUBACK 패킷에서 최대 QoS level 1을 부여합니다. 그런 다음 DPS는 메시지를 QoS 1을 사용하는 디바이스에 전달합니다.

TLS/SSL 구성

MQTT 프로토콜을 직접 사용하려면 클라이언트가 반드시 TLS 1.2를 통해 연결되어야 합니다. 이 단계를 건너뛰려고 하면 연결 오류가 발생하여 실패합니다.

디바이스 등록

DPS를 통해 디바이스를 등록하려면 디바이스가 $dps/registrations/res/#토픽 필터로 사용하여 구독해야 합니다. 토픽 필터의 # 다단계 와일드카드는 디바이스가 토픽 이름에서 더 많은 속성을 받을 수 있도록 허용하는 데만 사용됩니다. DPS는 하위 토픽의 필터링을 위한 # 또는 ? 와일드카드의 사용을 허용하지 않습니다. DPS는 범용 발행-구독 메시징 broker가 아니므로 문서화된 토픽 이름 및 토픽 필터만 지원합니다.

디바이스는 $dps/registrations/PUT/iotdps-register/?$rid={request_id}토픽 이름으로 사용하여 DPS에 등록 메시지를 게시해야 합니다. 페이로드에는 JSON 형식의 디바이스 등록 개체가 포함되어야 합니다. 성공적인 시나리오라면 디바이스는 $dps/registrations/res/202/?$rid={request_id}&retry-after=x 토픽 이름에 대한 응답을 수신합니다. 여기서 x는 초 단위의 retry-after 값입니다.

등록 작업 상태 폴링

디바이스는 디바이스 등록 작업의 결과를 수신하기 위해 서비스를 주기적으로 폴링해야 합니다. 디바이스가 이미 $dps/registrations/res/# 토픽을 구독했다고 가정하면 $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId} 토픽 이름에 가져오기 작업 상태 메시지를 게시할 수 있습니다. 이 메시지의 작업 ID는 이전 단계의 RegistrationOperationStatus 응답 메시지에서 받은 값이어야 합니다. 성공한 경우 서비스가 $dps/registrations/res/200/?$rid={request_id} 토픽에 응답합니다. 응답의 페이로드에는 RegistrationOperationStatus 개체가 포함됩니다. 재시도 기간과 동일한 기간의 지연 후에 응답 코드가 202인 경우 디바이스는 서비스를 계속 폴링해야 합니다. 서비스가 200 상태 코드를 반환하면 디바이스 등록 작업이 성공한 것입니다.

Websocket을 통한 연결

Websocket을 통해 연결할 때 하위 프로토콜을 mqtt로 지정합니다. RFC 6455를 따릅니다.

다음 단계

MQTT 프로토콜에 관한 자세한 내용은 MQTT 설명서를 참조하세요.

샘플 MQTT 코드를 찾아보려면 MQTT 애플리케이션 샘플을 참조 하세요.

DPS의 기능을 추가로 탐색하려면 다음을 참조하세요.