MQTT - AWS IoT Core

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

MQTT

MQTT(Message Queuing Telemetry Transport)는 제약된 디바이스용으로 설계된 경량의 메시징 프로토콜로서 널리 사용되고 있습니다. MQTT에 대한 AWS IoT Core 지원은 MQTT v3.1.1 사양MQTT v5.0 사양을 기반으로 하며, AWS IoT MQTT 사양과의 차이점에 설명된 대로 몇 가지 차이가 있습니다. 최신 버전의 표준 MQTT 5에는 새로운 확장성 개선 기능, 사유 코드 응답을 통한 향상된 오류 보고, 메시지 및 세션 만료 타이머, 사용자 지정 사용자 메시지 헤더를 비롯하여 MQTT 기반 시스템을 더욱 강력하게 만드는 몇 가지 주요 기능이 도입되었습니다. AWS IoT Core 지원하는 MQTT 5 기능에 대한 자세한 내용은 MQTT 5 지원 기능을 참조하십시오. AWS IoT Core 또한 MQTT 버전 (MQTT 3 및 MQTT 5) 간 통신도 지원합니다. MQTT 3 게시자는 MQTT 5 게시 메시지를 수신할 MQTT 5 구독자에게 MQTT 3 메시지를 보낼 수 있으며, 그 반대의 경우도 마찬가지입니다.

AWS IoT Core WSS 프로토콜을 통한 MQTT 프로토콜 및 MQTT를 사용하고 클라이언트 ID로 식별되는 장치 연결을 지원합니다. AWS IoT 디바이스 SDK는 두 프로토콜을 모두 지원하며 디바이스를 AWS IoT Core에 연결할 때 권장되는 방법입니다. AWS IoT 장치 SDK는 장치 및 클라이언트가 서비스에 연결하고 액세스하는 데 필요한 기능을 지원합니다. AWS IoT 장치 SDK는 AWS IoT 서비스에 필요한 인증 프로토콜과 MQTT 프로토콜 및 WSS 기반 MQTT 프로토콜에 필요한 연결 ID 요구 사항을 지원합니다. AWS 장치 SDK를 AWS IoT 사용하여 연결하는 방법에 대한 자세한 내용과 지원되는 언어의 AWS IoT 예제에 대한 링크는 를 참조하십시오. 디바이스 SDK를 사용하여 MQTT에 연결 AWS IoT MQTT 메시지의 인증 방법과 포트 매핑에 대한 자세한 내용은 프로토콜, 포트 매핑 및 인증 단원을 참조하세요.

연결할 때는 AWS IoT 디바이스 SDK를 사용하는 것이 좋지만 AWS IoT필수는 아닙니다. 하지만 AWS IoT 디바이스 SDK를 사용하지 않는 경우 필요한 연결 및 통신 보안을 제공해야 합니다. 연결 요청 시 클라이언트는 SNI(서버 이름 표시) TLS 확장을 전송해야 합니다. SNI를 포함하지 않는 연결 시도는 거부됩니다. 자세한 내용은 의 AWS IoT전송 보안을 참조하십시오. IAM 사용자 및 AWS 자격 증명을 사용하여 클라이언트를 인증하는 클라이언트는 올바른 서명 버전 4 인증을 제공해야 합니다.

디바이스 SDK를 사용하여 MQTT에 연결 AWS IoT

이 섹션에는 AWS IoT 장치 SDK 및 장치 연결 방법을 설명하는 샘플 프로그램의 소스 코드에 대한 링크가 포함되어 있습니다. AWS IoT여기에 링크된 샘플 앱은 MQTT 프로토콜 및 WSS를 통한 AWS IoT MQTT를 사용하여 연결하는 방법을 보여줍니다.

참고

AWS IoT 디바이스 SDK는 MQTT 5 클라이언트를 출시했습니다.

C++

AWS IoT C++ 기기 SDK를 사용하여 기기 연결

Python

Python용 AWS IoT 기기 SDK를 사용하여 기기 연결하기

JavaScript

용 AWS IoT 디바이스 SDK를 사용하여 디바이스를 연결하는 JavaScript 방법

Java

Java용 AWS IoT 장치 SDK를 사용하여 장치를 연결하기

참고

Java v2용 AWS IoT 디바이스 SDK는 이제 안드로이드 개발을 지원합니다. 자세한 내용은 Android용 AWS IoT 디바이스 SDK를 참조하십시오.

Embedded C

임베디드 C용 AWS IoT 디바이스 SDK를 사용하여 디바이스 연결

중요

이 SDK는 숙련된 임베디드 소프트웨어 개발자가 사용하기 위한 것입니다.

MQTT 서비스 품질(QoS) 옵션

AWS IoT AWS IoT 디바이스 SDK는 MQTT QoS (서비스 품질) 레벨을 지원하며 0 1 MQTT 프로토콜은 세 번째 수준의 QoS인 2 레벨을 AWS IoT 정의하지만 지원하지는 않습니다. MQTT 프로토콜만 QoS 기능을 지원합니다. HTTPS는 값이 0 또는 1일 수 있는 쿼리 문자열 파라미터 ?qos=qos를 전달하여 QoS를 지원합니다.

이 표에서는 각 QoS 수준이 메시지 브로커에 게시된 메시지에 미치는 영향을 설명합니다.

QoS 수준

메시지

설명

QoS 수준 0

0회 이상 전송됨

이 수준은 신뢰할 수 있는 통신 링크를 통해 전송되거나 누락되어도 문제 없는 메시지에 사용해야 합니다.

QoS 수준 1

한 번 이상 전송한 다음 PUBACK 응답이 수신될 때까지 반복적으로 전송합니다.

전송한 사람이 PUBACK 응답을 수신하여 성공적인 전달을 나타낼 때까지 메시지는 완료되지 않은 것으로 간주됩니다.

MQTT 지속적 세션

영구 세션에는 클라이언트가 승인하지 않은 서비스 품질(QoS)이 1인 클라이언트의 구독 및 메시지가 저장됩니다. 디바이스가 영구 세션에 다시 연결하면 세션이 재개되고 구독이 복원되며 재연결 전에 수신되어 확인되지 않은 구독된 메시지가 클라이언트로 전송됩니다.

저장된 메시지의 처리는 및 로그에 기록됩니다. CloudWatch CloudWatch 기록된 항목 CloudWatch 및 CloudWatch 로그에 대한 자세한 내용은 및 을 참조하십시오 메시지 브로커 지표대기 중 로그 항목.

영구 세션 생성

MQTT 3에서 CONNECT 메시지를 전송하고 cleanSession 플래그를 0으로 설정하여 MQTT 영구 세션을 생성할 수 있습니다. CONNECT 메시지를 전송하는 클라이언트의 세션이 없으면 영구 세션을 새로 만듭니다. 클라이언트에 대한 세션이 이미 있으면 클라이언트는 기존 세션을 재개합니다. 클린 세션을 생성하려면 CONNECT 메시지를 전송하고 cleanSession 플래그를 1로 설정합니다. 이렇게 하면 클라이언트의 연결이 끊어질 때 브로커가 세션 상태를 저장하지 않습니다.

MQTT 5에서는 Clean Start 플래그와 Session Expiry Interval을 설정하여 영구 세션을 처리합니다. 클린 스타트는 연결 세션의 시작과 이전 세션의 종료를 제어합니다. Clean Start = 1로 설정하면 새 세션이 생성되고 이전 세션(있는 경우)이 종료됩니다. Clean Start = 0으로 설정하면 연결 세션이 이전 세션(있는 경우)을 재개합니다. 세션 만료 간격은 연결 세션의 종료를 제어합니다. 세션 만료 간격은 연결이 끊어진 후에도 세션이 지속되는 시간을 초 단위(4바이트 정수)로 지정합니다. Session Expiry interval = 0으로 설정하면 연결이 끊어지는 즉시 세션이 종료됩니다. CONNECT 메시지에 세션 만료 간격이 지정되지 않은 경우 기본값은 0입니다.

MQTT 5 클린 스타트 및 세션 만료
속성 값 설명
Clean Start= 1 새 세션을 생성하고 이전 세션(있는 경우)을 종료합니다.
Clean Start= 0 이전 세션이 있는 경우 세션을 재개합니다.
Session Expiry Interval> 0 세션을 지속합니다.
Session Expiry interval= 0 세션을 지속하지 않습니다.

MQTT 5에서 Clean Start = 1Session Expiry Interval = 0으로 설정하면 이는 MQTT 3 클린 세션과 동일합니다. Clean Start = 0Session Expiry Interval > 0으로 설정하면 이는 MQTT 3 영구 세션과 동일합니다.

참고

교차 MQTT 버전(MQTT 3 및 MQTT 5) 영구 세션은 지원되지 않습니다. MQTT 3 영구 세션은 MQTT 5 세션으로 재개될 수 없으며, 그 반대의 경우도 마찬가지입니다.

영구 세션 중 작업

클라이언트는 연결 확인됨(CONNACK) 메시지의 sessionPresent 속성을 사용해 영구 세션의 존재 여부를 판별해야 합니다. sessionPresent1인 경우 영구 세션이 존재하며 클라이언트에 대해 저장된 메시지는 영구 세션에 다시 연결한 후 메시지 트래픽에 설명된 대로 해당 클라이언트가 CONNACK을 수신한 후에 클라이언트에 전달됩니다. sessionPresent1인 경우, 클라이언트가 다시 구독할 필요가 없습니다. sessionPresent0인 경우 영구 세션이 없으며 클라이언트는 주제 필터를 다시 구독해야 합니다.

클라이언트가 영구 세션에 참가한 후에는 각 작업에 대한 추가 플래그 없이 메시지를 게시하고 주제 필터를 구독할 수 있습니다.

영구 세션에 다시 연결한 후 메시지 트래픽

영구 세션이란 클라이언트와 MQTT 메시지 브로커 간의 지속적 연결을 나타냅니다. 클라이언트가 영구 세션을 사용하여 메시지 브로커에 연결하면 메시지 브로커는 해당 클라이언트가 연결 중 설정한 구독을 모두 저장합니다. 클라이언트의 연결이 해제되면 메시지 브로커는 클라이언트가 구독 중인 주제에 대해 게시된 미확인 QoS 1 메시지와 새로운 QoS 1 메시지를 저장합니다. 메시지는 계정 한도에 따라 저장됩니다. 한도를 초과하는 메시지는 삭제됩니다. 영구 메시지 제한에 대한 자세한 내용은 AWS IoT Core 엔드포인트 및 할당량 섹션을 참조하세요. 클라이언트가 영구 세션에 다시 연결하면 모든 구독이 복구되며 저장된 메시지는 모두 1초당 최대 메시지 10개의 속도로 클라이언트에 전송됩니다. MQTT 5에서 클라이언트가 오프라인일 때 메시지 만료 간격이 있는 아웃바운드 QoS1이 만료되면 연결이 재개된 후 클라이언트가 만료된 메시지를 받지 못합니다.

다시 연결한 후 저장된 메시지는 초당 저장 메시지 10개로 제한된 속도로 Publish requests per second per connection 제한에 도달할 때까지 현재 메시지 트래픽과 함께 클라이언트에 전송됩니다. 저장된 메시지의 전달 속도가 제한되기 때문에 세션에 다시 연결 후 전달할 저장된 메시지가 10개 이상 있는 경우 저장된 모든 메시지를 전달하는 데 몇 초가 걸립니다.

영구 세션 종료

영구 세션은 다음과 같은 방식으로 종료될 수 있습니다.

  • 영구 세션 만료 시간이 경과합니다. 클라이언트 연결 해제를 통해 또는 연결 시간 초과로 인해 메시지 브로커가 클라이언트 연결 해제를 감지하면 영구 세션 만료 타이머가 시작됩니다.

  • 클라이언트가 cleanSession 플래그를 1로 설정한 CONNECT 메시지를 전송합니다.

MQTT 3에서 영구 세션 만료 시간의 기본값은 1시간이며, 이는 계정의 모든 세션에 적용됩니다.

MQTT 5에서는 CONNECT 및 DISCONNECT 패킷의 각 세션에 대해 세션 만료 간격을 설정할 수 있습니다.

DISCONNECT 패킷의 세션 만료 간격의 경우:

  • 현재 세션의 세션 만료 간격이 0이면 DISCONNECT 패킷에서 세션 만료 간격을 0보다 크게 설정할 수 없습니다.

  • 현재 세션의 세션 만료 간격이 0보다 크고 DISCONNECT 패킷에서 세션 만료 간격을 0으로 설정한 경우 세션이 DISCONNECT 시 종료됩니다.

  • 그렇지 않으면 DISCONNECT 패킷의 세션 만료 간격이 현재 세션의 세션 만료 간격을 업데이트합니다.

참고

세션이 끝날 때 클라이언트로 전송되기를 기다리는 저장된 메시지는 삭제되지만 전송할 수 없더라도 표준 메시징 요금으로 요금이 청구됩니다. 메시지 요금에 대한 자세한 내용은 AWS IoT Core 요금을 참조하세요. 만료 시간 간격을 구성할 수 있습니다.

영구 세션이 만료된 후 다시 연결

클라이언트가 만료되기 전에 영구 세션에 다시 연결하지 않으면 세션이 종료되고 저장된 메시지가 삭제됩니다. cleanSession 플래그를 0(으)로 설정한 세션이 만료된 후 클라이언트가 다시 연결하면 서비스가 새 영구 세션을 생성합니다. 이전 세션의 구독이나 메시지는 이전 세션이 만료되었을 때 삭제되었기 때문에 이 세션에서 사용할 수 없습니다.

영구 세션 메시지 요금

메시지 브로커가 클라이언트나 오프라인 영구 세션에 메시지를 보내면 메시지 요금이 청구됩니다. AWS 계정 영구 세션이 있는 오프라인 디바이스가 다시 연결되고 세션을 재개하면 저장된 메시지가 디바이스로 전송되고 계정에 다시 요금이 청구됩니다. 메시지 요금에 대한 자세한 내용은 AWS IoT Core 요금 - 메시징을 참조하세요.

표준 한도 증가 프로세스를 사용하여 기본 영구 세션 만료 시간을 1시간으로 늘릴 수 있습니다. 세션 만료 시간을 늘리면 오프라인 디바이스에 더 많은 메시지를 저장할 수 있고 이러한 추가 메시지는 표준 메시징 요금으로 계정에 청구되기 때문에 메시지 요금이 증가할 수 있습니다. 세션 만료 시간은 대략적인 것이며 세션은 계정 제한보다 최대 30분 더 오래 지속될 수 있습니다. 그러나 세션은 계정 제한보다 짧지 않습니다. 세션 제한에 대한 자세한 내용은 AWS Service Quotas를 참조하세요.

MQTT 보존 메시지

AWS IoT Core MQTT 프로토콜에 설명된 RETAIN 플래그를 지원합니다. 클라이언트가 게시하는 MQTT 메시지에 RETAIN 플래그를 설정하면 메시지가 AWS IoT Core 저장됩니다. 그런 다음 새 구독자에게 전송하고 GetRetainedMessage 작업을 호출하여 검색한 다음 AWS IoT 콘솔에서 볼 수 있습니다.

MQTT 보존 메시지 사용 예
  • 초기 구성 메시지로

    MQTT 보관된 메시지는 클라이언트가 주제를 구독한 후 클라이언트로 전송됩니다. 주제를 구독하는 모든 클라이언트가 구독 직후 MQTT 보존 메시지를 수신하도록 하려면 RETAIN 플래그가 설정된 구성 메시지를 게시할 수 있습니다. 구독 클라이언트는 새 구성 메시지가 게시될 때마다 해당 구성에 대한 업데이트도 받습니다.

  • 마지막으로 알려진 상태 메시지로

    디바이스는 현재 상태 메시지에 RETAIN 플래그를 설정하여 AWS IoT Core 가 메시지를 저장할 수 있도록 할 수 있습니다. 응용 프로그램이 연결되거나 다시 연결되면 해당 응용 프로그램은 이 주제를 구독하여 보존된 메시지 주제를 구독한 직후에 마지막으로 보고된 상태를 확인할 수 있습니다. 이렇게 하면 디바이스에서 다음 메시지가 표시될 때까지 기다리지 않아도 현재 상태를 확인할 수 있습니다.

AWS IoT Core에서 MQTT 보관된 메시지가 있는 일반 태스크

AWS IoT Core RETAIN 플래그가 설정된 MQTT 메시지를 저장합니다. 이렇게 보관된 메시지는 해당 주제를 구독한 모든 클라이언트에게 일반 MQTT 메시지로 전송되며, 해당 주제의 신규 구독자에게도 전송되도록 저장됩니다.

MQTT 보관된 메시지에는 클라이언트가 액세스할 수 있도록 권한을 부여하기 위한 특정 정책 작업이 필요합니다. 보관된 메시지 정책 사용의 예는 보관된 메시지 정책 예 섹션을 참조하세요.

이 섹션에서는 보관된 메시지와 관련된 일반적인 작업에 대해 설명합니다.

  • 보관된 메시지 생성

    클라이언트는 MQTT 메시지를 게시할 때 메시지가 보관되는지 여부를 결정합니다. 클라이언트는 디바이스 SDK를 사용하여 메시지를 게시할 때 RETAIN 플래그를 설정할 수 있습니다. 애플리케이션 및 서비스는 Publish 작업을 사용하여 MQTT 메시지를 게시할 때 RETAIN 플래그를 설정할 수 있습니다.

    주제 이름당 하나의 메시지만 보관됩니다. 주제에 게시된 RETAIN 플래그가 설정된 새 메시지는 이전에 주제로 전송된 기존 보관된 메시지를 대체합니다.

    참고: RETAIN 플래그가 설정된 예약된 주제에 게시할 수 없습니다.

  • 보관된 메시지 주제 구독

    클라이언트는 다른 MQTT 메시지 주제와 마찬가지로 보관된 메시지 주제를 구독합니다. 보관된 메시지 주제를 구독하여 수신한 보관된 메시지에는 RETAIN 플래그가 설정되어 있습니다.

    보존된 메시지는 클라이언트가 0바이트 메시지 페이로드와 함께 보관된 메시지를 보관된 메시지 주제에 게시할 AWS IoT Core 때 삭제됩니다. 보관된 메시지 주제를 구독한 클라이언트도 0바이트 메시지를 수신합니다.

    보관된 메시지 주제를 포함하는 와일드카드 주제 필터를 구독하면 클라이언트가 보관된 메시지의 주제에 게시된 후속 메시지를 수신할 수 있지만 구독 시 보관된 메시지는 전송하지 않습니다.

    참고: 구독 시 보관된 메시지를 수신하려면 구독 요청의 주제 필터가 보관된 메시지 주제와 정확히 일치해야 합니다.

    보관된 메시지 주제를 구독하여 수신한 보관된 메시지에는 RETAIN 플래그가 설정되어 있습니다. 구독 후 구독 클라이언트가 수신한 보관된 메시지는 그렇지 않습니다.

  • 보관된 메시지 검색

    보관된 메시지는 보관된 메시지와 함께 주제를 구독하면 클라이언트에 자동으로 전송됩니다. 클라이언트가 구독 시 보관된 메시지를 수신하려면 보관된 메시지의 정확한 주제 이름을 구독해야 합니다. 보관된 메시지 주제를 포함하는 와일드카드 주제 필터를 구독하면 클라이언트가 보관된 메시지의 주제에 게시된 후속 메시지를 수신할 수 있지만 구독 시 보관된 메시지는 배달하지 않습니다.

    서비스와 앱은 ListRetainedMessagesGetRetainedMessage를 호출하여 보관된 메시지를 나열하고 검색할 수 있습니다.

    클라이언트가 RETAIN 플래그를 설정하지 않고 보관된 메시지 주제에 메시지를 게시하는 것은 금지되지 않습니다. 이로 인해 보관된 메시지가 주제를 구독하여 받은 메시지와 일치하지 않는 등 예기치 않은 결과가 발생할 수 있습니다.

    MQTT 5에서는 보관된 메시지에 메시지 만료 간격이 설정되어 있고 보관된 메시지가 만료되는 경우 해당 주제를 구독하는 새 구독자는 구독에 성공해도 보관된 메시지를 받지 못합니다.

  • 보관된 메시지 주제 나열

    ListRetainedMessages를 호출하여 보관된 메시지를 나열할 수 있으며 AWS IoT 콘솔에서 보관된 메시지를 볼 수 있습니다.

  • 보관된 메시지 세부 정보 가져오기

    GetRetainedMessage를 호출하여 보관된 메시지 세부 정보를 가져오고 AWS IoT 콘솔에서 보관된 메시지를 볼 수 있습니다.

  • Will 메시지 보관

    디바이스 연결 시 생성되는 MQTT Will 메시지Will Retain 필드에 Connect Flag bits 플래그를 설정하여 보관할 수 있습니다.

  • 보관된 메시지 삭제

    디바이스, 애플리케이션 및 서비스는 RETAIN 플래그가 설정된 메시지를 게시하고 삭제할 보관된 메시지의 주제 이름에 빈(0바이트) 메시지 페이로드를 게시하여 보관된 메시지를 삭제할 수 있습니다. 이러한 메시지는 보존된 메시지를 삭제하고 주제를 구독한 클라이언트에게 전송되지만 AWS IoT Core, 에서 보관하지는 않습니다. AWS IoT Core

    보관된 메시지는 AWS IoT 콘솔에서 보관된 메시지에 액세스하여 대화식으로 삭제할 수도 있습니다. AWS IoT 콘솔을 사용하여 삭제된 보관된 메시지는 또한 보관된 메시지의 주제를 구독한 클라이언트에 0바이트 메시지를 전송합니다.

    보관된 메시지는 삭제된 후에는 복원할 수 없습니다. 클라이언트는 삭제된 메시지를 대신하기 위해 보존된 새 메시지를 게시해야 합니다.

  • 보관된 메시지 디버깅 및 문제 해결

    AWS IoT 콘솔은 보관된 메시지 문제를 해결하는 데 도움이 되는 여러 도구를 제공합니다.

    • 보관된 메시지(Retained messages) 페이지

      AWS IoT 콘솔의 보관된 메시지(Retained messages) 페이지는 현재 리전의 계정에서 저장한 보관된 메시지의 목록(페이지가 매겨짐)을 제공합니다. 이 페이지에서 다음을 수행할 수 있습니다.

      • 메시지 페이로드, QoS, 수신 시간 등 보관된 각 메시지의 세부 정보를 봅니다.

      • 보관된 메시지의 내용을 업데이트합니다.

      • 보관된 메시지를 삭제합니다.

    • MQTT 테스트 클라이언트(MQTT test client)

      AWS IoT 콘솔의 MQTT 테스트 클라이언트(MQTT test client) 페이지는 MQTT 주제를 구독하고 게시할 수 있습니다. 게시 옵션을 사용하면 게시하는 메시지에 RETAIN 플래그를 설정하여 디바이스의 작동 방식을 시뮬레이션할 수 있습니다.

    보존 메시지가 구현되는 방식의 이러한 측면에서 인해 예상치 못한 결과가 발생할 수 있습니다. AWS IoT Core

    • 보관된 메시지 제한

      계정이 보관된 메시지를 최대한 많이 저장한 경우 일부 보존된 메시지가 삭제되고 보존된 메시지 수가 한도 아래로 떨어질 때까지 RETAIN이 설정된 상태로 게시된 메시지와 0바이트보다 큰 페이로드에 대해 병목 현상이 발생한 응답을 AWS IoT Core 반환합니다.

    • 보관된 메시지 전송 순서

      보관된 메시지와 구독된 메시지의 전송 순서는 보장되지 않습니다.

청구 및 보관된 메시지

클라이언트에서 RETAIN 플래그가 설정된 메시지를 AWS IoT 콘솔을 사용하거나 Publish를 호출하여 게시하면 AWS IoT Core 요금 - 메시징에 설명된 추가 메시징 요금이 발생합니다.

클라이언트나 AWS IoT 콘솔을 사용하거나 호출을 통해 보존된 메시지를 검색하면 일반 API 사용 요금 외에 메시징 GetRetainedMessage요금이 부과됩니다. 추가 요금은 AWS IoT Core 요금 - 메시징에 설명되어 있습니다.

디바이스가 예기치 않게 연결 해제될 때 게시되는 MQTT Will 메시지에는 AWS IoT Core 요금 - 메시징에 설명된 메시징 요금이 발생합니다.

메시징 비용에 대한 자세한 내용은 AWS IoT Core 요금 - 메시징을 참조하세요.

MQTT 보관된 메시지와 MQTT 영구 세션 비교

보관된 메시지 및 영구 세션은 디바이스가 오프라인 상태일 때 게시된 메시지를 수신할 수 있도록 해주는 MQTT의 표준 기능입니다. 보관된 메시지는 영구 세션에서 게시할 수 있습니다. 이 섹션에서는 이러한 기능의 주요 측면과 이들이 함께 작동하는 방법을 설명합니다.

보관된 메시지

영구 세션

주요 기능

보관된 메시지는 연결 후 대규모 디바이스 그룹을 구성하거나 알리는 데 사용할 수 있습니다.

보관된 메시지는 디바이스가 재연결 후 주제에 게시된 마지막 메시지만 수신하도록 하려는 경우에도 사용할 수 있습니다.

영구 세션은 연결이 간헐적이며 몇 가지 중요한 메시지를 놓칠 수 있는 디바이스에 유용합니다.

디바이스는 오프라인 상태에서 전송된 메시지를 수신하기 위해 영구 세션에 연결할 수 있습니다.

예제

보관된 메시지는 디바이스가 온라인 상태가 될 때 환경에 대한 구성 정보를 제공할 수 있습니다. 초기 구성에는 구독해야 하는 다른 메시지 주제 목록이나 현지 시간대를 구성하는 방법에 대한 정보가 포함될 수 있습니다.

간헐적 연결로 셀룰러 네트워크를 통해 연결하는 디바이스는 디바이스가 네트워크 범위를 벗어났거나 셀룰러 라디오를 꺼야 하는 동안 전송된 중요한 메시지를 놓치는 것을 방지하기 위해 영구 세션을 사용할 수 있습니다.

주제에 대한 초기 구독 시 수신된 메시지

보관된 메시지가 있는 주제를 구독하면 가장 최근에 보관된 메시지가 수신됩니다.

보관된 메시지가 없는 주제를 구독하면 주제에 게시될 때까지 메시지가 수신되지 않습니다.

재연결 후 구독된 주제

영구 세션이 없으면 클라이언트는 재연결한 후 주제를 구독해야 합니다.

구독한 주제는 재연결 후 복원됩니다.

재연결 후 수신된 메시지

보관된 메시지가 있는 주제를 구독하면 가장 최근에 보관된 메시지가 수신됩니다.

디바이스가 연결 해제된 동안 QOS = 1로 게시되고 QOS = 1로 구독된 모든 메시지는 디바이스가 다시 연결된 후에 전송됩니다.

데이터/세션 만료

MQTT 3에서는 보관된 메시지가 만료되지 않습니다. 대체 또는 삭제될 때까지 저장됩니다. MQTT 5에서는 보관된 메시지가 설정한 메시지 만료 간격이 지나면 만료됩니다. 자세한 내용은 메시지 만료를 참조하세요.

클라이언트가 시간 제한 기간 내에 다시 연결하지 않으면 영구 세션이 만료됩니다. 영구 세션이 만료된 후 디바이스가 연결 해제된 동안 QOS = 1로 게시되고 QOS = 1로 구독된 클라이언트의 구독 및 저장된 메시지가 삭제됩니다. 만료된 메시지는 전송되지 않습니다. 영구 세션을 사용한 세션 만료에 대한 자세한 내용은 MQTT 지속적 세션 섹션을 참조하세요.

영구 세션에 대한 자세한 내용은 MQTT 지속적 세션 섹션을 참조하세요.

보관된 메시지의 경우 게시 클라이언트는 이전 세션이 있었는지 여부에 관계없이 메시지가 연결된 후 디바이스에 보관되고 전달되어야 하는지 여부를 결정합니다. 메시지 저장 선택은 게시자가 하며 저장된 메시지는 QoS 0 또는 QoS 1 구독으로 구독하는 현재 및 미래의 모든 클라이언트에게 전송됩니다. 보관된 메시지는 지정된 주제에 대해 한 번에 하나의 메시지만 보관합니다.

계정에 보관된 메시지의 최대 수를 저장한 경우 AWS IoT Core 는 일부 보관된 메시지가 삭제되고 보관된 메시지 수가 제한 아래로 떨어질 때까지 RETAIN이 설정되고 페이로드가 0바이트보다 큰 게시된 메시지에 대해 조절된 응답을 반환합니다.

MQTT는 메시지를 보관하고 디바이스 섀도우를 보관했습니다. AWS IoT

보관된 메시지와 디바이스 섀도우는 모두 디바이스의 데이터를 유지하지만 다르게 작동하고 다른 용도로 사용됩니다. 이 섹션에서는 이들의 유사점과 차이점을 설명합니다.

보관된 메시지

디바이스 섀도우

메시지 페이로드에는 미리 정의된 구조 또는 스키마가 있음

구현에 의해 정의된 대로 MQTT는 해당 메시지 페이로드에 대한 구조 또는 스키마를 지정하지 않습니다.

AWS IoT 특정 데이터 구조를 지원합니다.

메시지 페이로드를 업데이트하면 이벤트 메시지가 생성됨

보관된 메시지를 게시하면 구독된 클라이언트에 메시지가 전송되지만 추가 업데이트 메시지는 생성되지 않습니다.

디바이스 섀도우를 업데이트하면 변경 사항을 설명하는 업데이트 메시지가 생성됩니다.

메시지 업데이트에 번호가 매겨짐

보관된 메시지는 자동으로 번호가 매겨지지 않습니다. 디바이스 섀도우 문서에는 자동 버전 번호와 타임스탬프가 있습니다.

메시지 페이로드가 사물 리소스에 연결됨

보관된 메시지는 사물 리소스에 연결되지 않습니다.

디바이스 섀도우는 사물 리소스에 연결됩니다.

메시지 페이로드의 개별 요소 업데이트

전체 메시지 페이로드를 업데이트하지 않으면 메시지의 개별 요소를 변경할 수 없습니다.

디바이스 섀도우 문서의 개별 요소는 전체 디바이스 섀도우 섀도 문서를 업데이트할 필요 없이 업데이트할 수 있습니다.

구독 시 클라이언트가 메시지 데이터 수신

클라이언트는 보관된 메시지가 있는 주제를 구독한 후 자동으로 보관된 메시지를 받습니다.

클라이언트는 디바이스 섀도우 업데이트를 구독할 수 있지만 현재 상태를 의도적으로 요청해야 합니다.

인덱싱 및 검색 가능성

보관된 메시지는 검색을 위해 인덱싱되지 않습니다.

플릿 인덱싱은 검색 및 집계를 위해 디바이스 섀도우 데이터를 인덱싱합니다.

MQTT 마지막 유언 및 증거(LWT) 메시지

마지막 유언 및 증거(LWT)는 MQTT의 기능입니다. LWT를 사용하면 클라이언트가 메시지를 지정하여 브로커가 클라이언트가 정의한 주제에 메시지를 게시하고 시작되지 않은 연결 해제가 발생할 경우 해당 주제를 구독한 모든 클라이언트에게 메시지를 보냅니다. 클라이언트가 지정하는 메시지를 LWT 메시지 또는 유언 메시지라고 하며, 클라이언트가 정의하는 주제를 유언 주제라고 합니다. 디바이스가 브로커에 연결할 때 LWT 메시지를 지정할 수 있습니다. 연결 중에 Connect Flag bits 필드에 Will Retain 플래그를 설정하여 이러한 메시지를 보존할 수 있습니다. 예를 들어 Will Retain 플래그가 1로 설정되면 브로커의 관련 유언 주제에 유언 메시지가 저장됩니다. 자세한 내용은 유언 메시지를 참조하세요.

브로커는 시작되지 않은 연결 해제가 발생할 때까지 유언 메시지를 저장합니다. 이 경우 브로커는 유언 주제를 구독한 모든 클라이언트에게 메시지를 게시하여 연결 해제를 알립니다. 클라이언트가 MQTT DISCONNECT 메시지를 사용하여 클라이언트가 시작한 연결 해제로 브로커와의 연결을 끊으면 브로커는 저장된 LWT 메시지를 게시하지 않습니다. 다른 모든 경우에는 LWT 메시지가 발송됩니다. 브로커가 LWT 메시지를 전송하는 연결 해제 시나리오의 전체 목록은 연결/연결 해제 이벤트를 참조하세요.

connectAttributes 사용

ConnectAttributes을(를) 사용하면 IAM 정책의 연결 메시지에 사용할 속성(예: PersistentConnect 또는 LastWill)을 지정할 수 있습니다. ConnectAttributes를 사용하면 디바이스에 기본적으로 새 기능에 대한 액세스 권한을 부여하지 않는 정책을 만들 수 있습니다. 이 정책은 디바이스가 손상된 경우 도움이 될 수 있습니다.

connectAttributes는 다음 기능을 지원합니다.

PersistentConnect

클라이언트와 브로커 간의 연결이 중단될 때 PersistentConnect 기능을 사용하여 클라이언트가 연결 중 설정한 구독을 모두 저장할 수 있습니다.

LastWill

클라이언트가 예기치 않게 연결을 끊을 때 LastWill 기능을 사용하여 LastWillTopic에 메시지를 게시할 수 있습니다.

기본적인 정책은 비영구적 연결이며, 이 연결에 대해 전달된 속성이 없습니다. IAM 정책에 영구 연결을 하기 원하면 영구 연결을 지정해야 합니다.

ConnectAttributes 예제는 연결 정책 예제를 참조하세요.

MQTT 5에 지원되는 기능

AWS IoT Core MQTT 5에 대한 지원은 MQTT v5.0 사양을 기반으로 하며, 에 설명된 바와 같이 몇 가지 차이점이 있습니다. AWS IoT MQTT 사양과의 차이점

공유 구독

AWS IoT Core MQTT 3과 MQTT 5 모두에 대한 공유 구독을 지원합니다. 공유 구독을 사용하면 여러 클라이언트가 한 주제에 대한 구독을 공유할 수 있으며 무작위 배포를 통해 해당 주제에 게시된 메시지를 한 클라이언트만 수신할 수 있습니다. 공유 구독은 여러 구독자 간에 MQTT 메시지를 효과적으로 로드 밸런싱할 수 있습니다. 예를 들어 동일한 주제에 대해 게시하는 디바이스가 1,000개이고 이러한 메시지를 처리하는 백엔드 애플리케이션이 10개라고 가정해 보겠습니다. 이 경우 백엔드 애플리케이션은 동일한 주제를 구독할 수 있으며 각각은 디바이스에서 공유 주제에 게시한 메시지를 무작위로 수신하게 됩니다. 이렇게 하면 해당 메시지의 로드를 효과적으로 '공유'할 수 있습니다. 또한 공유 구독을 사용하면 복원력이 향상됩니다. 백엔드 애플리케이션의 연결이 끊어지면 브로커가 그룹 내 나머지 구독자에게 로드를 분산합니다.

공유 구독을 사용하려면 클라이언트가 공유 구독의 주제 필터를 다음과 같이 구독합니다.

$share/{ShareName}/{TopicFilter}
  • $share는 공유 구독의 주제 필터를 나타내는 리터럴 문자열이며, $share로 시작해야 합니다.

  • {ShareName}은 구독자 그룹이 사용하는 공유 이름을 지정하는 문자열입니다. 공유 구독의 주제 필터는 ShareName을 포함하고 그 뒤에 / 문자가 와야 합니다. {ShareName}/, +, # 문자를 포함할 수 없습니다. {ShareName}의 최대 크기는 128바이트입니다.

  • {TopicFilter}는 비공유 구독과 동일한 주제 필터 구문을 따릅니다. {TopicFilter}의 최대 크기는 256바이트입니다.

  • $share/{ShareName}/{TopicFilter}에 대한 두 개의 필수 슬래시(/)는 주제 및 주제 필터의 최대 슬래시 수 제한에 포함되지 않습니다.

{ShareName}/{TopicFilter}가 동일한 구독은 동일한 공유 구독 그룹에 속합니다. 공유 구독 그룹을 여러 개 만들 수 있으며 그룹당 공유 구독 제한을 초과하지 않아야 합니다. 자세한 내용은 AWS 일반 참조AWS IoT Core 엔드포인트 및 할당량을 참조하세요.

다음 테이블은 비공유 구독과 공유 구독을 비교한 것입니다.

구독 설명 주제 필터 예시
비공유 구독 각 클라이언트는 게시된 메시지를 수신하기 위해 별도의 구독을 생성합니다. 메시지가 주제에 게시되면 해당 주제의 모든 구독자는 메시지 사본을 받게 됩니다.
sports/tennis sports/#
공유 구독 여러 클라이언트가 한 주제에 대한 구독을 공유할 수 있으며 무작위 배포를 통해 해당 주제에 게시된 메시지를 한 클라이언트만 수신합니다.
$share/consumer/sports/tennis $share/consumer/sports/#
비공유 구독 흐름 공유 구독 흐름
MQTT 3인치 및 MQTT 5인치 모두에 대한 정기 구독 AWS IoT Core
MQTT 3인치 및 MQTT 5인치 모두에 대한 공유 서브스크립션 AWS IoT Core

공유 구독 사용에 대한 중요 참고 사항

  • QoS0 구독자에 대한 게시 시도가 실패하면 재시도가 이루어지지 않고 메시지가 삭제됩니다.

  • 클린 세션이 있는 QoS1 구독자에 대한 게시 시도가 실패하면 여러 번 재시도를 통해 그룹 내 다른 구독자에게 메시지가 전송됩니다. 모든 재시도 후에도 전달되지 못한 메시지는 삭제됩니다.

  • 구독자가 오프라인 상태여서 영구 세션이 있는 QoS1 구독자에 대한 게시 시도가 실패하면 메시지는 대기열에 추가되지 않고 그룹 내 다른 구독자에게 전달되도록 시도됩니다. 모든 재시도 후에도 전달되지 못한 메시지는 삭제됩니다.

  • 공유 구독은 보존된 메시지를 수신하지 않습니다.

  • 공유 구독에 와일드카드 문자(# 또는 +)가 포함된 경우 주제와 매칭되는 공유 구독이 여러 개 있을 수 있습니다. 이 경우 메시지 브로커는 게시 메시지를 복사하여 매칭되는 각 공유 구독의 클라이언트에 무작위로 전송합니다. 공유 구독의 와일드카드 동작은 다음 다이어그램에 설명되어 있습니다.

    와일드카드 문자가 포함된 공유 구독 AWS IoT Core

    이 예시에는 게시 MQTT 주제 sports/tennis와 매칭되는 공유 구독이 세 개 있습니다. 메시지 브로커는 게시된 메시지를 복사하여 매칭되는 각 그룹의 클라이언트에 메시지를 무작위로 보냅니다.

    클라이언트 1과 클라이언트 2는 $share/consumer1/sports/tennis 구독을 공유합니다.

    클라이언트 3과 클라이언트 4는 $share/consumer1/sports/# 구독을 공유합니다.

    클라이언트 5와 클라이언트 6은 $share/consumer2/sports/tennis 구독을 공유합니다.

공유 구독 제한에 대한 자세한 내용은 AWS 일반 참조의 AWS IoT Core 엔드포인트 및 할당량을 참조하세요. 콘솔에서 AWS IoT MQTT 클라이언트를 사용하여 공유 구독을 테스트하려면 을 참조하십시오.AWS IoT MQTT 클라이언트에서 공유 구독 테스트 공유 구독에 대한 자세한 내용은 MQTTV5.0 사양의 공유 구독을 참조하세요.

클린 스타트 및 세션 만료

클린 스타트 및 세션 만료를 사용하여 영구 세션을 보다 유연하게 처리할 수 있습니다. Clean Start 플래그는 기존 세션을 사용하지 않고 세션을 시작해야 하는지 여부를 나타냅니다. 세션 만료 간격은 연결이 끊어지는 후 세션을 유지하는 기간을 나타냅니다. 연결 해제 시 세션 만료 간격을 수정할 수 있습니다. 자세한 정보는 MQTT 지속적 세션을 참조하세요.

모든 ACK의 사유 코드

사유 코드를 사용하여 오류 메시지를 더 쉽게 디버깅하거나 처리할 수 있습니다. 사유 코드는 브로커와의 상호 작용 유형(구독, 게시, 확인)에 따라 메시지 브로커에 의해 반환됩니다. 자세한 내용은 MQTT 사유 코드를 참조하세요. MQTT 사유 코드의 전체 목록은 MQTT v5 사양을 참조하세요.

주제 별칭

주제 이름을 2바이트 정수인 주제 별칭으로 대체할 수 있습니다. 주제 별칭을 사용하면 주제 이름 전송을 최적화하여 측정된 데이터 서비스의 데이터 비용을 잠재적으로 줄일 수 있습니다. AWS IoT Core 주제 별칭의 기본 제한은 8개입니다. 자세한 내용은 AWS 일반 참조AWS IoT Core 엔드포인트 및 할당량을 참조하세요.

메시지 만료

게시된 메시지에 메시지 만료 값을 추가할 수 있습니다. 이 값은 메시지 만료 간격을 초 단위로 나타냅니다. 메시지가 해당 간격 내에 구독자에게 전송되지 않은 경우 메시지가 만료되고 제거됩니다. 메시지 만료 값을 설정하지 않으면 메시지가 만료되지 않습니다.

아웃바운드에서 구독자는 만료 간격에 시간이 남아 있는 메시지를 받게 됩니다. 예를 들어, 인바운드 게시 메시지의 메시지 만료 시간이 30초이고 20초 후에 해당 메시지가 구독자에게 라우팅되는 경우 메시지 만료 필드는 10으로 업데이트됩니다. 구독자가 수신한 메시지의 업데이트된 MEI는 0이 될 수 있습니다. 남은 시간이 999ms 이하가 되면 바로 0으로 업데이트되기 때문입니다.

에서 AWS IoT Core최소 메시지 만료 간격은 1입니다. 클라이언트 측에서 간격을 0으로 설정하면 1로 조정됩니다. 최대 메시지 만료 간격은 604,800(7일)입니다. 이보다 높은 값은 최대값으로 조정됩니다.

버전 간 통신에서 메시지 만료 동작은 인바운드 게시 메시지의 MQTT 버전에 따라 결정됩니다. 예를 들어, MQTT5를 통해 연결된 세션에서 전송된 메시지 만료가 있는 메시지는 MQTT3 세션을 구독한 디바이스의 경우 만료될 수 있습니다. 아래 표에는 메시지 만료 시 다음과 같은 유형의 게시 메시지가 어떻게 지원되는지 나와 있습니다.

게시 메시지 유형 메시지 만료 간격
정기 게시 서버가 지정된 시간 내에 메시지를 전송하지 못하면 만료된 메시지가 제거되고 구독자는 메시지를 받지 못합니다. 여기에는 디바이스가 QoS 1 메시지를 게시하지 않는 경우와 같은 상황이 포함됩니다.
보관 보관된 메시지가 만료되고 새 클라이언트가 주제를 구독하는 경우 해당 클라이언트는 구독 시 메시지를 받지 못합니다.
유언 유언 메시지 간격은 클라이언트 연결이 끊어지고 서버가 유언 메시지를 구독자에게 전달하려고 시도한 후에 시작됩니다.
대기열 메시지 클라이언트가 오프라인일 때 메시지 만료 간격이 있는 아웃바운드 QoS1이 만료되면 영구 세션이 재개된 후 클라이언트가 만료된 메시지를 받지 못합니다.

기타 MQTT 5 기능

서버 연결 해제

연결이 끊어지면 서버는 사전에 클라이언트에 DISCONNECT를 전송하여 연결 해제 사유 코드와 함께 연결 종료를 알릴 수 있습니다.

요청 및 응답

게시자는 수신 시 게시자가 지정한 주제로 수신자가 응답을 보내도록 요청할 수 있습니다.

최대 패킷 크기

클라이언트와 서버는 지원하는 최대 패킷 크기를 독립적으로 지정할 수 있습니다.

페이로드 형식 및 콘텐츠 유형

메시지를 게시할 때 페이로드 형식(이진, 텍스트)과 콘텐츠 유형을 지정할 수 있습니다. 이러한 정보는 메시지 수신자에게 전달됩니다.

MQTT 5 속성

MQTT 5 속성은 세션 만료 및 요청 및 응답 패턴과 같은 새로운 MQTT 5 기능을 지원하기 위해 MQTT 표준에 추가된 중요한 사항입니다. 에서 AWS IoT Core아웃바운드 메시지의 속성을 전달할 수 있는 규칙을 만들거나 HTTP Publish를 사용하여 일부 새 속성과 함께 MQTT 메시지를 게시할 수 있습니다.

다음 표에는 지원하는 모든 MQTT 5 속성이 나열되어 있습니다. AWS IoT Core

속성 설명 입력 유형 패킷
Payload Format Indicator 페이로드가 UTF-8 형식으로 지정되었는지 여부를 나타내는 부울 값입니다. 바이트 PUBLISH, CONNECT
콘텐츠 유형 페이로드의 내용을 설명하는 UTF-8 문자열입니다. UTF-8 문자열 PUBLISH, CONNECT
Response Topic 수신자가 요청-응답 흐름의 일부로 게시해야 하는 주제를 설명하는 UTF-8 문자열입니다. 주제에는 와일드카드 문자가 포함되어서는 안 됩니다. UTF-8 문자열 PUBLISH, CONNECT
Correlation Data 어떤 요청에 대한 응답 메시지인지 식별하기 위해 요청 메시지의 발신자가 사용하는 이진 데이터입니다. 바이너리 PUBLISH, CONNECT
User Property UTF-8 문자열 페어입니다. 이 속성은 한 패킷에 여러 번 나타날 수 있습니다. 수신자는 전송된 순서대로 키-값 페어를 수신합니다. UTF-8 문자열 페어 CONNECT, PUBLISH, Will Properties, SUBSCRIBE, DISCONNECT, UNSUBSCRIBE
Message Expiry Interval 메시지 만료 간격을 초 단위로 나타내는 4바이트 정수입니다. 이 값을 설정하지 않으면 메시지가 만료되지 않습니다. 4바이트 정수 PUBLISH, CONNECT
Session Expiry Interval

세션 만료 간격을 초 단위로 나타내는 4바이트 정수입니다. AWS IoT Core 최대 7일, 기본 최대 1시간을 지원합니다. 설정한 금액이 계정 최대값을 초과하는 경우 CONNACK에 조정된 값이 AWS IoT Core 반환됩니다.

4바이트 정수 CONNECT, CONNACK, DISCONNECT
Assigned Client Identifier 기기에서 클라이언트 ID를 지정하지 않을 AWS IoT Core 때 생성되는 임의의 클라이언트 ID입니다. 이 임의 클라이언트 ID는 현재 브로커가 관리하는 다른 세션에서 사용하지 않는 새 클라이언트 식별자여야 합니다. UTF-8 문자열 CONNACK
Server Keep Alive 서버에서 지정한 연결 유지 시간을 나타내는 2바이트 정수입니다. 클라이언트가 연결 유지 시간 이상 비활성 상태일 경우 서버는 클라이언트의 연결을 끊습니다. 2바이트 정수 CONNACK
Request Problem Information 실패 시 사유 문자열을 보낼지 아니면 사용자 속성을 보낼지를 나타내는 부울 값입니다. 바이트 CONNECT
Receive Maximum PUBACK을 수신하지 않고 전송할 수 있는 PUBLISH QOS > 0 패킷의 최대 수를 나타내는 2바이트 정수입니다. 2바이트 정수 CONNECT, CONNACK
Topic Alias Maximum 이 값은 주제 별칭으로 허용되는 가장 높은 값을 나타냅니다. 기본값은 0. 2바이트 정수 CONNECT, CONNACK
Maximum QoS 지원하는 AWS IoT Core QoS의 최대값입니다. 기본값은 1입니다. AWS IoT Core 에서는 QoS2를 지원하지 않습니다. 바이트 CONNACK
Retain Available

AWS IoT Core 메시지 브로커가 보존된 메시지를 지원하는지 여부를 나타내는 부울 값입니다. 기본 값은 1입니다.

바이트 CONNACK
Maximum Packet Size 수신 및 전송하는 최대 패킷 크기. AWS IoT Core 128KB를 초과할 수 없습니다. 4바이트 정수 CONNECT, CONNACK
Wildcard Subscription Available

AWS IoT Core 메시지 브로커가 와일드카드 구독 사용 가능 여부를 지원하는지 여부를 나타내는 부울 값입니다. 기본 값은 1입니다.

바이트 CONNACK
Subscription Identifier Available

AWS IoT Core 메시지 브로커가 사용 가능한 구독 식별자를 지원하는지 여부를 나타내는 부울 값입니다. 기본값은 0입니다.

바이트 CONNACK

MQTT 사유 코드

MQTT 5에는 원인 코드 응답이 포함된 향상된 오류 보고 기능이 도입되었습니다. AWS IoT Core 패킷별로 그룹화된 다음을 포함하되 이에 국한되지 않는 원인 코드를 반환할 수 있습니다. MQTT 5에 지원되는 사유 코드의 전체 목록은 MQTT 5 사양을 참조하세요.

CONNACK 사유 코드
16진수 사유 코드 이름 설명
0 0x00 Success 연결이 수락되었습니다.
128 0x80 Unspecified error 서버에서 실패의 사유를 밝히려 하지 않거나 다른 사유 코드가 적용되지 않습니다.
133 0x85 Client Identifier not valid 클라이언트 식별자가 유효한 문자열이지만 서버에서 허용되지 않습니다.
134 0x86 Bad User Name or Password 서버가 클라이언트에서 지정한 사용자 이름 또는 암호를 수락하지 않습니다.
135 0x87 Not authorized 클라이언트에 연결할 수 있는 권한이 없습니다.
144 0x90 Topic Name invalid Will Topic Name이 올바른 형식이지만 서버에서 허용되지 않습니다.
151 0x97 할당량 초과 구현 또는 관리상 부과된 한도를 초과했습니다.
155 0x9B QoS not supported 서버가 Will QoS에 설정된 QoS를 지원하지 않습니다.
PUBACK 사유 코드
16진수 사유 코드 이름 설명
0 0x00 Success 메시지가 수락되었습니다. QoS 1 메시지의 게시가 진행됩니다.
128 0x80 Unspecified error 수신자가 게시를 승인하지 않지만 사유를 밝히려고 하지 않거나 사유가 다른 값 중 하나와 일치하지 않습니다.
135 0x87 Not authorized PUBLISH 권한이 없습니다.
144 0x90 Topic Name invalid 주제 이름이 올바른 형식이지만 클라이언트 또는 서버에서 허용되지 않습니다.
145 0x91 Packet identifier in use 패킷 식별자가 이미 사용 중입니다. 이는 클라이언트와 서버 간에 세션 상태가 일치하지 않음을 나타낼 수 있습니다.
151 0x97 할당량 초과 구현 또는 관리상 부과된 한도를 초과했습니다.
DISCONNECT 사유 코드
16진수 사유 코드 이름 설명
129 0x81 Malformed Packet 수신된 패킷이 이 사양을 준수하지 않습니다.
130 0x82 Protocol Error 예기치 않은 패킷이나 순서가 잘못된 패킷이 수신되었습니다.
135 0x87 Not authorized 요청이 승인되지 않았습니다.
139 0x8B Server shutting down 서버가 종료되고 있습니다.
141 0x8D Keep Alive timeout 연결 유지 시간의 1.5배 시간 동안 패킷이 수신되지 않아 연결이 종료되었습니다.
142 0x8E Session taken over 동일한 ClientID를 사용하는 다른 연결이 연결되어 이 연결이 종료되었습니다.
143 0x8F Topic Filter invalid 주제 필터가 올바른 형식이지만 서버에서 허용되지 않습니다.
144 0x90 Topic Name invalid 주제 이름이 올바른 형식이지만 이 클라이언트 또는 서버에서 허용되지 않습니다.
147 0x93 Receive Maximum exceeded 클라이언트 또는 서버가 PUBACK 또는 PUBCOMP를 전송하지 않고 수신할 수 있는 최대 수의 게시 항목보다 많은 항목을 수신했습니다.
148 0x94 Topic Alias invalid 클라이언트 또는 서버가 CONNECT 또는 CONNACK 패킷에서 보낸 최대 주제 별칭보다 큰 주제 별칭이 포함된 PUBLISH 패킷을 받았습니다.
151 0x97 할당량 초과 구현 또는 관리상 부과된 한도를 초과했습니다.
152 0x98 Administrative action 관리 조치로 인해 연결이 종료되었습니다.
155 0x9B QoS not supported 클라이언트가 CONNACK의 최대 QoS에 지정된 QoS보다 큰 QoS를 지정했습니다.
161 0xA1 Subscription Identifiers not supported 서버가 구독 식별자를 지원하지 않으므로 구독이 수락되지 않았습니다.
SUBACK 사유 코드
16진수 사유 코드 이름 설명
0 0x00 Granted QoS 0 구독이 수락되었으며 전송되는 최대 QoS는 QoS 0입니다. 요청한 것보다 QoS가 낮을 수 있습니다.
1 0x01 Granted QoS 1 구독이 수락되었으며 전송되는 최대 QoS는 QoS 1입니다. 요청한 것보다 QoS가 낮을 수 있습니다.
128 0x80 Unspecified error 구독이 수락되지 않았으며, 서버에서 사유를 밝히려고 하지 않거나 다른 사유 코드가 적용되지 않습니다.
135 0x87 Not authorized 클라이언트는 이 구독을 할 수 있는 권한이 없습니다.
143 0x8F Topic Filter invalid 주제 필터가 올바른 형식이지만 이 클라이언트에서 허용되지 않습니다.
145 0x91 Packet Identifier in use 지정된 패킷 식별자가 이미 사용 중입니다.
151 0x97 할당량 초과 구현 또는 관리상 부과된 한도를 초과했습니다.
UNSUBACK 사유 코드
16진수 사유 코드 이름 설명
0 0x00 Success 구독이 삭제됩니다.
128 0x80 Unspecified error 구독 취소를 완료할 수 없으며, 서버에서 사유를 밝히려고 하지 않거나 다른 사유 코드가 적용되지 않습니다.
143 0x8F Topic Filter invalid 주제 필터가 올바른 형식이지만 이 클라이언트에서 허용되지 않습니다.
145 0x91 Packet Identifier in use 지정된 패킷 식별자가 이미 사용 중입니다.

AWS IoT MQTT 사양과의 차이점

메시지 브로커 구현은 MQTT v3.1.1 사양MQTT v5.0 사양을 기반으로 하지만 다음과 같은 점에서 이러한 사양과 차이가 있습니다.

  • AWS IoT 는 MQTT 3용 패킷 (PUBREC, PUBREL, PUBCOMP) 을 지원하지 않습니다.

  • AWS IoT MQTT 5용 패킷 (PUBREC, PUBREL, PUBCOMP 및 AUTH) 은 지원하지 않습니다.

  • AWS IoT MQTT 5 서버 리디렉션을 지원하지 않습니다.

  • AWS IoT MQTT 서비스 품질 (QoS) 레벨 0과 1만 지원합니다. AWS IoT QoS 수준 2를 사용한 게시 또는 구독은 지원하지 않습니다. 메시지 브로커는 QoS 수준 2가 요청될 경우 PUBACK 또는 SUBACK을 전송하지 않습니다.

  • 에서 AWS IoT QoS 수준이 0인 주제를 구독하면 메시지가 0회 이상 전달됩니다. 메시지가 두 번 이상 전달될 수 있습니다. 여러 번 전달되는 메시지는 다른 패킷 ID를 사용하여 전송될 수 있습니다. 이러한 경우 DUP 플래그가 설정되지 않습니다.

  • 연결 요청에 응답할 때 메시지 브로커는 CONNACK 메시지를 전송합니다. 이 메시지에는 연결이 이전 세션을 재개하는 것인지 여부를 나타내는 플래그가 포함됩니다.

  • 추가 제어 패킷 또는 연결 끊기 요청을 전송하기 전에 클라이언트는 CONNACK 메시지가 AWS IoT 메시지 브로커로부터 디바이스에 수신될 때까지 기다려야 합니다.

  • 클라이언트가 주제를 구독할 때 메시지 브로커가 SUBACK을 전송하는 시간과 클라이언트가 일치하는 새 메시지를 수신하기 시작하는 시간 사이에 지연이 있을 수 있습니다.

  • 클라이언트가 주제 필터에서 와일드카드 문자 #을 사용하여 주제를 구독하면 주제 계층 구조에서 해당 수준 이하의 모든 문자열이 일치됩니다. 그러나 상위 주제는 일치하지 않습니다. 예를 들어 주제 sensor/#을 구독할 경우 주제 sensor/, sensor/temperature, sensor/temperature/room1에 게시된 메시지가 수신되지만 sensor에 게시된 메시지는 수신되지 않습니다. 와일드카드에 대한 자세한 내용은 주제 필터 섹션을 참조하세요.

  • 메시지 브로커는 클라이언트 ID를 사용하여 각 클라이언트를 식별합니다. 클라이언트 ID는 MQTT 페이로드의 일부로 클라이언트가 메시지 브로커로 전달합니다. 클라이언트 ID가 동일한 2개의 클라이언트를 동시에 메시지 브로커에 연결할 수 없습니다. 한 클라이언트가 다른 클라이언트에서 사용 중인 클라이언트 ID를 사용하여 메시지 브로커에 연결할 경우 새 클라이언트 연결이 수락되고 이전에 연결된 클라이언트가 연결 해제됩니다.

  • 드물지만 메시지 브로커가 다른 패킷 ID로 동일한 논리적 PUBLISH 메시지를 재전송할 수 있습니다.

  • 와일드카드 문자가 포함된 주제 필터를 구독하면 보관된 메시지를 수신할 수 없습니다. 보관된 메시지를 수신하려면 구독 요청에 보관된 메시지 주제와 정확히 일치하는 주제 필터가 포함되어야 합니다.

  • 메시지 브로커는 메시지 및 ACK가 수신되는 순서를 보장하지 않습니다.

  • AWS IoT 제한이 사양과 다를 수 있습니다. 자세한 내용은 AWS IoT 참조 가이드AWS IoT Core 메시지 브로커 및 프로토콜 제한 및 할당량을 참조하세요.

  • MQTT DUP 플래그는 지원되지 않습니다.