View a markdown version of this page

다이렉트 메시징 - AWS IoT Core

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

다이렉트 메시징

AWS IoT Core 는 이제 Direct Messaging을 지원합니다. 디바이스가 주제를 구독할 필요 없이 MQTT 클라이언트 ID로 연결된 단일 디바이스에 메시지를 보낼 수 있습니다.

이전에는 특정 디바이스에 메시지를 전송하려면 디바이스가 구독한 주제에 게시해야 했지만 전송을 확인하는 방법이 내장되어 있지 않았습니다. 발신자는 SendDirectMessage HTTP API를 호출하여 수신자의 클라이언트 ID와 대상 주제를 지정합니다. 인 경우 QoS 1confirmation=true AWS IoT Core 에서 전송하고 성공적인 응답을 반환하기 전에 수신기의 PUBACK을 기다립니다. 이렇게 하면 end-to-end 전송 승인을 받을 수 있습니다. API 응답 및 Amazon CloudWatch Logs는 전송 상태 및 실패 이유를 전체적으로 파악할 수 있습니다.

다이렉트 메시지는 AWS IoT 규칙 실행 규칙에 의해 처리되지 않고, 오프라인 디바이스에 대해 대기열에 추가되지 않으며, 보관된 메시지를 지원하지 않습니다.

사전 조건

발신자와 수신자 모두 다이렉트 메시징을 사용하려면 특정 정책 작업이 필요합니다. 발신자에게 iot:SendDirectMessage 권한이 있어야 합니다. 대상 클라이언트 ID는 리소스로 지정되며 iot:Topic 조건 키(선택 사항)는 발신자가 직접 메시지를 보낼 수 있는 주제를 제한합니다. 수신자는 대상 주제에 대한 iot:Receive 권한이 있어야 합니다. 수신자는 iot:Subscribe 권한이 필요하지 않습니다.는 주제 구독 없이 다이렉트 메시지를 AWS IoT Core 전송합니다. 자세한 내용과 정책 예제는 단원을 참조하십시오다이렉트 메시징 정책 예제.

HTTP 요청에 사용되는 인증 및 포트 매핑에 대해서는 프로토콜, 포트 매핑 및 인증 단원을 참조하세요.

SendDirectMessage API

발신자는 HTTP POST 요청을 클라이언트별 URL로 전송하여 다이렉트 메시지를 보낼 수 있습니다.

https://IoT_data_endpoint/connections/client_id/messages?topic=topic_name&confirmation=true&timeout=10
  • IoT_data_endpointAWS IoT 디바이스 데이터 엔드포인트입니다. 엔드포인트를 찾으AWS IoT 디바이스 데이터 및 서비스 엔드포인트려면 섹션을 참조하세요.

  • client_id는 메시지를 보낼 MQTT 클라이언트의 고유 식별자입니다. 클라이언트 IDs 128자를 초과할 수 없으며 달러 기호($)로 시작할 수 없습니다. MQTT 클라이언트 IDs 공백, 슬래시(/) 및 UTF-8 문자와 같이 HTTP 요청에 유효하지 않은 문자가 포함된 경우 URL 인코딩(백분율 인코딩)되어야 합니다. 자세한 내용은 AWS IoT Core 메시지 브로커, 프로토콜 제한 및 할당량을 참조하세요.

  • topic_name은 수신자가 URL로 인코딩된 메시지를 수신하는 주제입니다. $로 시작해서는 안 됩니다. AWS IoT Core 예약 주제가 아니어야 합니다. 주제 길이 및 깊이 제한은 AWS IoT Core 서비스 할당량 페이지를 참조하세요. 자세한 내용은 AWS IoT Core 메시지 브로커, 프로토콜 제한 및 할당량을 참조하세요.

  • 확인은 부울입니다. 로 설정하면 trueAPI는 QoS 1에서 메시지를 전송하고 성공적인 응답을 반환하기 전에 MQTT 클라이언트가 전송 확인(PUBACK)을 전송할 때까지 기다립니다. 지정된 제한 시간 내에 전송 확인을 받지 못하면 API는 HTTP 504를 반환합니다.

  • 제한 시간은 메시지가 전송된 후 수신 클라이언트의 전송 확인(PUBACK)을 기다리는 최대 시간을 초 단위로 나타내는 정수입니다. 이 파라미터는이 로 confirmation 설정된 경우에만 사용됩니다true. 이 confirmation이면 false이 파라미터는 무시됩니다. 내부 처리로 인해 총 API 응답 시간이이 값보다 클 수 있습니다. HTTP 클라이언트 제한 시간을이 파라미터보다 큰 값으로 설정합니다.

API 응답 상태 코드

다음 표에는 SendDirectMessage API에서 반환한 HTTP 상태 코드와 각각에 대한 권장 작업이 나열되어 있습니다. AWS IoT Core CloudWatch 로그를 활성화하여 프로그래밍 방식 오류 처리를 위한 이유 필드를 포함하여 자세한 SendDirectMessage 이벤트 로그를 확인합니다.

SendDirectMessage API 응답 상태 코드
HTTP 코드 권장 조치
200 OK 에서 전송 확인을 요청한 경우 confirmation=true이는 수신자가 메시지 수신을 확인했음을 나타냅니다. 그렇지 않으면 메시지가 성공적으로 디스패치되었음을 나타냅니다.
400 잘못된 요청 즉, 파라미터 중 하나가 유효하지 않습니다. HTTP 응답 메시지 또는 CloudWatch 로그를 검토하여 특정 장애를 식별하고 수정합니다. 주제 이름과 Client-id가 유효하고 URL이 올바르게 인코딩되었는지 확인합니다.
403 금지됨 즉, 발신자의 정책은 대상 클라이언트 및 주제에 iot:SendDirectMessage 대해를 부여하지 않거나 수신자의 정책은 주제에 iot:Receive 대해를 부여하지 않습니다. HTTP 응답 메시지 또는 CloudWatch 로그를 검토하여 특정 장애를 식별하고 해당 정책을 업데이트합니다. 다이렉트 메시징 정책 예제을(를) 참조하세요.
404 Not Found(404 찾을 수 없음) 즉, 대상 클라이언트 ID가 연결되어 있지 않습니다 AWS IoT Core. HTTP 응답 메시지 또는 CloudWatch 로그에서 특정 이유를 검토하고 수신기가 연결되어 있는지 확인한 다음 다시 시도하세요. 응답 메시지에 "대상 클라이언트 ID가 연결되지 않았지만 활성 영구 세션이 있음"이 표시되면 대상 클라이언트에 만료되지 않은 영구 세션이 있지만 현재 오프라인 상태입니다.
413 페이로드가 너무 큼 페이로드가 허용되는 최대 크기를 초과합니다. 페이로드 크기를 줄이고 다시 시도합니다. AWS IoT Core 서비스 할당량을 참조하세요.
429 요청이 너무 많음 즉, 계정이 SendDirectMessage requests-per-second 제한을 초과했거나 수신자 연결이 아웃바운드 게시 제한을 초과했습니다. HTTP 응답 메시지 또는 CloudWatch 로그에서 특정 이유를 검토하고 요청 속도를 줄이며 지수 백오프를 구현합니다. AWS IoT Core 서비스 할당량을 참조하세요.
500 Internal Server Error 이는 예기치 않은 서버 측 오류를 나타냅니다. 지수 백오프를 사용하여 요청을 재시도합니다. 문제가 지속되면 응답의 traceId를 사용하여 AWS Support에 문의하세요.
504 게이트웨이 제한 시간 즉, 수신기가 지정된 제한 시간 내에 PUBACK을 전송하지 않았습니다. 제한 시간 값을 늘리거나, 수신자의 MQTT 클라이언트가 QoS 1 메시지에 대해 PUBACK을 전송하는지 확인하거나, 수신자가 메시지를 느리게 처리하고 있는지 확인합니다.

예제

AWS CLI
aws iot-data send-direct-message \ --client-id myDevice \ --topic commands/reboot \ --confirmation \ --timeout 10 \ --payload '{"action": "reboot"}' \ --cli-binary-format raw-in-base64-out \ --region us-west-2 \ --endpoint-url https://IoT_data_endpoint

AWS Command Line Interface 버전 2를 사용하는 경우 --cli-binary-format 옵션이 필요합니다. 이 설정을 기본 설정으로 지정하려면 aws configure set cli-binary-format raw-in-base64-out을(를) 실행하세요. 자세한 내용은 AWS Command Line Interface 사용 설명서 버전 2에서 AWS CLI 지원 글로벌 명령줄 옵션을 참조하세요.

curl (X.509 client certificate, port 8443)
curl --tlsv1.2 \ --cacert Amazon-root-CA-1.pem \ --cert device.pem.crt \ --key private.pem.key \ --request POST \ --data '{"action": "reboot"}' \ "https://IoT_data_endpoint:8443/connections/myDevice/messages?topic=commands%2Freboot&confirmation=true&timeout=10"

수신기 클라이언트 동작

Direct Messaging은 주제 구독 없이 MQTT 클라이언트(수신자)에 메시지를 전송합니다. Direct Messaging의 이점을 최대한 활용하려면 수신자가 다음 동작을 지원해야 합니다.

  • 명시적으로 구독하지 않은 주제에 대한 메시지 수신 - 수신자의 다이렉트 메시징은 수신자가 명시적으로 구독하지 않은 주제에 메시지를 전송할 수 있습니다. 그러나 일부 MQTT 클라이언트 구현은 구독 취소된 주제에 대한 메시지를 필터링하거나 삭제합니다. 클라이언트가 이러한 메시지를 삭제하면 수신자도 구독한 주제에 대해서만 다이렉트 메시징이 작동합니다. 주제에 대한 직접 메시지를 수신하려면 클라이언트의 메시지 핸들러가 구독 상태에 관계없이 메시지를 처리하는지 확인합니다.

  • API에서 결정한 QoS 처리 - 전송된 메시지의 QoS 수준은 수신자의 구독이 아닌 발신자의 API 요청의 confirmation 파라미터에 의해 설정됩니다. 이면 confirmation=true메시지가 QoS 1에 도착하고 수신자의 클라이언트가 전송을 승인하기 위해 PUBACK을 전송해야 합니다. 이면 메시지가 확인 없이 QoS 0에 confirmation=false도착합니다. 클라이언트의 MQTT 구현이 QoS 0 및 QoS 1 수신 메시지를 모두 올바르게 처리하는지 확인합니다.