MQTT - AWS IoT 코어

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

MQTT

MQTT는 제약된 디바이스용으로 설계된 경량의 메시징 프로토콜로서 광범위하게 사용되고 있습니다. AWS IoT의 MQTT 지원은 MQTT v3.1.1 사양을 기반으로 하지만 몇 가지 차이점이 있습니다. 과 MQTT v3.1.1 사양의 차이점에 대한 자세한 내용은 AWS IoT 단원을 참조하십시오.AWS IoT MQTT 버전 3.1.1 사양과의 차이점

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

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

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

이 단원에는 AWS IoT 디바이스 SDKs 및 디바이스를 AWS IoT에 연결하는 방법을 보여주는 샘플 프로그램의 소스 코드에 대한 링크가 포함되어 있습니다. 여기에 연결된 샘플 앱은 MQTT 프로토콜 및 MQTT over WSS를 사용하여 AWS IoT에 연결하는 방법을 보여줍니다.

C++

C++ 디바이스 SDK를 사용하여 디바이스 연결AWS IoT

Python

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

JavaScript

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

Java

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

Embedded C

Embedded C용 AWS IoT 디바이스 SDK를 사용하여 디바이스 연결

중요

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

MQTT 서비스 품질(QoS) 옵션

AWS IoT 및 AWS IoT 디바이스 SDKs는 MQTT 서비스 품질(QoS) 수준 01를 지원합니다. MQTT 프로토콜은 세 번째 레벨 QoS, 레벨 2를 정의하지만 AWS IoT는 지원하지 않습니다. MQTT 프로토콜만 QoS 기능을 지원합니다. HTTPS는 QoS를 지원하지 않습니다.

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

의 QoS 레벨은 다음과 같습니다.

메시지

설명

QoS 수준 0

0번 이상 전송됨

이 수준은 안정적인 통신 링크를 통해 전송되거나 문제 없이 놓칠 수 있는 메시지에 사용해야 합니다.

QoS 레벨 1

한 번 이상 전송한 다음 PUBACK 응답이 수신될 때까지 반복

발신자가 전송 성공을 나타내는 PUBACK 응답을 수신할 때까지 메시지가 완료된 것으로 간주되지 않습니다.

MQTT 영구 세션 사용

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

영구 세션 생성

메시지를 보내고 CONNECT 플래그를 cleanSession로 설정하여 MQTT 지속적 세션을 생성합니다.0 메시지를 보내는 클라이언트의 세션이 없으면 새로운 지속적 세션이 생성됩니다.CONNECT 클라이언트에 대한 세션이 이미 있는 경우 클라이언트는 기존 세션을 다시 시작합니다.

영구 세션 중 작업

클라이언트는 연결 승인됨(sessionPresent) 메시지에서 CONNACK 속성을 사용하여 영구 세션이 있는지 확인합니다. 이 sessionPresent인 경우 영구 세션이 존재하고 클라이언트가 1를 수신한 직후 클라이언트에 대한 모든 저장된 메시지가 CONNACK영구 세션에 다시 연결한 후 메시지 트래픽에 설명된 대로 클라이언트에 전달됩니다.sessionPresent인 경우 클라이언트가 다시 구독할 필요가 없습니다.1 그러나 sessionPresent0인 경우 지속적 세션이 없으며 클라이언트는 주제 필터를 다시 구독해야 합니다.

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

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

지속적 세션은 클라이언트와 MQTT 메시지 브로커 간의 지속적인 연결을 나타냅니다. 클라이언트가 지속적 세션을 사용하여 메시지 브로커에 연결하면 메시지 브로커는 클라이언트가 연결 중에 수행하는 모든 구독을 저장합니다. 클라이언트의 연결이 해제되면 메시지 브로커는 승인되지 않은 QoS 1 메시지와 클라이언트가 구독하는 주제에 게시된 새 QoS 1 메시지를 저장합니다. 클라이언트가 영구 세션에 다시 연결하면 모든 구독이 복구되고 저장된 메시지는 모두 초당 최대 10개의 메시지 속도로 클라이언트에 전송됩니다.

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

영구 세션 종료

다음 조건은 지속적 세션이 종료되는 방법을 설명합니다.

  • 영구 세션 만료 시간이 경과할 때. 지속적 세션 만료 타이머는 클라이언트 연결 해제 또는 연결 시간 초과로 인해 클라이언트가 연결 해제되었음을 메시지 브로커가 감지하면 시작됩니다.

  • 클라이언트가 CONNECT 플래그를 cleanSession로 설정하는 1 메시지를 보내는 경우

참고

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

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

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

지속적 세션 메시지 요금

메시지 브로커가 클라이언트로부터 메시지를 수신하고 클라이언트에 메시지를 전송하면 AWS 계정에 메시지가 청구됩니다. 영구 세션이 있는 디바이스가 연결되어 있지 않으면 클라이언트가 다시 연결될 때 전송되도록 저장된 메시지도 계정에 요금이 부과됩니다. 영구 세션이 만료되면 이 세션에 대해 저장된 메시지가 폐기되지만 계정에 스토리지에 대한 요금이 청구됩니다. 메시지 요금에 대한 자세한 내용은 AWS IoT Core 요금 - 메시징을 참조하십시오.

표준 한도 증가 프로세스를 사용하여 1시간의 기본 지속적 세션 만료 시간을 늘릴 수 있습니다. 세션 만료 시간을 늘리면 메시지 요금이 증가할 수 있습니다. 연결이 해제된 디바이스에 대해 추가 메시지를 저장하도록 추가 시간을 허용할 수 있으며, 추가 메시지가 계정에 청구됩니다. 세션 만료 시간은 근사값이며 세션은 계정 제한보다 최대 30분 더 지속될 수 있지만 세션이 계정 제한보다 짧지 않습니다. 세션 제한에 대한 자세한 내용은 AWS 서비스 할당량을 참조하십시오.

사용connectAttributes

ConnectAttributes를 사용하면 PersistentConnectLastWill와 같은 IAM 정책의 연결 메시지에 사용할 속성을 지정할 수 있습니다. 를 사용하면 디바이스에 새 기능에 대한 액세스 권한을 기본적으로 부여하지 않는 정책을 빌드할 수 있습니다. 이러한 정책은 디바이스가 손상된 경우 유용할 수 있습니다.ConnectAttributes

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

PersistentConnect

기능을 사용하여 클라이언트와 브로커 간의 연결이 중단될 때 클라이언트가 연결 중에 수행하는 모든 구독을 저장합니다.PersistentConnect

LastWill

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

기본적으로 정책에는 비영구 연결이 있으며 이 연결에 대해 전달된 속성이 없습니다. IAM 정책을 만들려면 이러한 정책에 지속적인 연결을 지정해야 합니다.

예제는 ConnectAttributes연결 정책 예제를 참조하십시오.

AWS IoT MQTT 버전 3.1.1 사양과의 차이점

메시지 브로커 구현은 MQTT v3.1.1 사양을 기반으로 하지만 다음과 같은 방식으로 사양과 다릅니다.

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

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

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

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

  • MQTT 사양은 게시자에게 브로커가 주제로 전송된 마지막 메시지를 보관했다가 이후 모든 주제 구독자에게 전송하도록 요청하는 프로비저닝을 제공합니다. AWS IoT는 보존된 메시지를 지원하지 않습니다. 메시지 보관을 요청할 경우 연결이 해제됩니다.

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

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

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