투케이2K

172. (Aws/Amazon) [Aws Iot Core] MQTT 세션 연결 및 해제 이벤트 감지 토픽 설명 - $aws/events/presence/connected 본문

Aws (Amazon)

172. (Aws/Amazon) [Aws Iot Core] MQTT 세션 연결 및 해제 이벤트 감지 토픽 설명 - $aws/events/presence/connected

투케이2K 2026. 1. 16. 19:58
728x90

[개발 환경 설정]

개발 환경 : Aws / Amazon Web Services

 

[설명 정리]

// --------------------------------------------------------------------------------------
[개발 및 환경]
// --------------------------------------------------------------------------------------

- 인프라 : Aws / Amazon Web Services


- 기술 구분 : Aws / Aws Iot Core / MQTT / Events / connected / disconnected


- 사전) Aws Iot Core 간단 설명 : 

  >> AWS IoT 는 IoT 디바이스를 다른 디바이스 및 AWS 클라우드 서비스에 연결하는 클라우드 서비스를 제공합니다.

  >> 디바이스가에 연결할 수 있는 경우 AWS IoT는 AWS 가 제공하는 클라우드 서비스에 디바이스를 AWS IoT 연결할 수 있습니다.

  >> AWS IoT Core 메시지 브로커는 MQTT 및 MQTT over WSS 프로토콜을 사용하여 메시지를 게시하고 구독하는 디바이스 및 클라이언트를 지원합니다. 
  
    - HTTPS 프로토콜을 사용하여 메시지를 게시하는 디바이스와 클라이언트도 지원합니다.


- 사전) MQTT (Message Queuing Telemetry Transport) 설명 : 

  >> MQTT 는 경량 메시지 프로토콜로, 주로 IoT(사물인터넷) 환경에서 사용됩니다

  >> MQTT 목적 : 제한된 네트워크 환경(저속, 불안정)에서 효율적으로 메시지를 주고받기 위해 설계

  >> MQTT 기반 : TCP/IP 위에서 동작

  >> MQTT 패턴 : Publish/Subscribe 모델을 사용

    - Publisher : 메시지를 발행하는 클라이언트

    - Subscriber : 특정 주제(topic)를 구독하는 클라이언트

    - Broker: 메시지를 중개하는 서버 (예: Mosquitto)

  >> MQTT 주요 특징 : 

    - 경량성 : 헤더가 매우 작음(2바이트부터 시작)

    - QoS (Quality of Service) : 
      $ QoS 0: 최대 한 번 전달(보장 없음)
      $ QoS 1: 최소 한 번 전달(중복 가능)
      $ QoS 2: 정확히 한 번 전달(가장 안전)

    - 지속 연결 : KeepAlive로 연결 상태 유지

    - Last Will and Testament (LWT) : 클라이언트 비정상 종료 시 브로커가 메시지 발행

    - 토픽 기반 라우팅 : 계층적 구조(/home/temperature 등)

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[설 명] 
// --------------------------------------------------------------------------------------

1. AWS IoT Core 에서는 Presence 이벤트를 사용해 MQTT 클라이언트의 연결 상태 변화를 자동으로 감지할 수 있습니다

  >> 연결 이벤트 : $aws/events/presence/connected/<clientId>

  >> 해제 이벤트 : $aws/events/presence/disconnected/<clientId>

  >> clientId 설명 참고사항 : <clientId> 는 Aws Iot Core 에 등록 된 Thing 사물이 아니라 MQTT 세션 연결에 사용 된 clientId 입니다

  >> ✅ 해당 이벤트 감지 설정을 위한 참고 사항 :

    - Presence 이벤트는 ClientId 기준 → ThingName과 동일하게 설정 권장

    - KeepAlive 를 너무 길게 설정하면 단선 감지 지연 → 권장값 : 30 ~ 60초 (클라이언트 쪽에서 ping 체크 KeepAlive 주기 설정 필요)

    - Presence 이벤트는 IoT Rule (룰엔진) 이벤트로 감지 가능하며, DynamoDB, SNS, Lambda 등과 연계 가능합니다


2. 연결 이벤트 감지 설명 : $aws/events/presence/connected

  >> 디바이스가 AWS IoT Core 브로커에 성공적으로 MQTT CONNECT 를 완료했을 때 이벤트가 트리거 됩니다

  >> 메시지 예시 : 
    
    {
      "clientId": "myDevice123",
      "timestamp": 1670000000000
    }

  >> 네트워크 상황 : 

    - 디바이스가 네트워크 연결 정상 → MQTT CONNECT 성공 → 이벤트 발행

    - 디바이스가 재연결 시마다 새 이벤트 발행 (이미 지속적으로 연결 되어 있는 상태인 경우는 새롭게 발행되지 않음)


3. 해제 이벤트 감지 설명 : $aws/events/presence/disconnected

  >> 디바이스의 MQTT 세션이 종료될 때 (정상 종료 또는 비정상 종료) 이벤트가 트리거 됩니다

  >> 메시지 예시 : 
    
    {
      "clientId": "myDevice123",
      "timestamp": 1670000000000,
      "disconnectReason": "NETWORK_ERROR" // 또는 CLIENT_DISCONNECT, KEEP_ALIVE_TIMEOUT
    }

    - ✅ disconnectReason 주요 에러 코드 정리 : CLIENT_INITIATED_DISCONNECT 외의 사유는 대부분 비정상 종료에 해당합니다.

      $ AUTH_ERROR : 인증 또는 권한 부여 실패
      $ CLIENT_INITIATED_DISCONNECT : 디바이스가 정상적으로 MQTT DISCONNECT를 보냄
      $ CLIENT_ERROR : 잘못된 MQTT 패킷(중복 CONNECT, 과도한 payload 등)
      $ CONNECTION_LOST : 네트워크 단절 또는 고지연으로 연결 상실
      $ DUPLICATE_CLIENTID : 동일 clientId로 신규 연결 시 기존 세션 종료
      $ FORBIDDEN_ACCESSIP : 차단 등으로 연결 자체가 거부됨
      $ MQTT_KEEP_ALIVE_TIMEOUT : 설정된 KeepAlive 시간 (1.5×) 내에 Ping 이 없어서 자동 종료
      $ SERVER_ERROR : 브로커 쪽 내부 오류로 인한 연결 종료
      $ SERVER_INITIATED_DISCONNECT : AWS IoT Core 가 유지보수 등 서버 측에서 연결 해제 요청
      $ API_INITIATED_DISCONNECT : AWS IoT DeleteConnection API 호출로 인한 종료
      $ THROTTLED : 연결/메시지 속도 등의 제한 위반으로 연결 종료
      $ WEBSOCKET_TTL_EXPIRATION : WebSocket 연결이 TTL(time-to-live)을 초과함
      $ CUSTOMAUTH_TTL_EXPIRATION : 사용자 정의 인증 TTL 초과

  >> 네트워크 상황 : 

    - 정상 종료 : 디바이스가 MQTT DISCONNECT → 즉시 이벤트 발행

    - 비정상 종료 :  

      $ 네트워크 단절, 전원 꺼짐 → 브로커는 TCP 소켓 에러 또는 KeepAlive 타임아웃으로 감지
      $ 감지 후 이벤트 발행 (지연 가능: 최대 1.5 × KeepAlive)

  >> ✅ 주요 핵심 : 디바이스가 보고 (코드 상에서 명시적 disconnect() 호출 종료) 하지 않아도 브로커가 자동으로 발행합니다.

    - MQTT 표준에서 KeepAlive 는 클라이언트 → 브로커 방향으로 호출 하며, 브로커는 클라이언트의 PINGREQ 를 기다리며, 미수신 시 세션 종료 수행

    - 즉, 디바이스가 주기적으로 Ping 을 보내야 하고, 브로커는 그 여부로 연결 상태를 판단합니다


4. ✅ 네트워크 단선 시 동작 상황 정리 : 

  >> MQTT는 TCP 기반 → 브로커는 연결 상태를 세션 레벨에서 추적

  >> 네트워크가 끊기면 :
  
    - TCP 소켓 에러 → 즉시 세션 종료

    - 또는 KeepAlive 타임아웃 → 세션 종료

  >> 세션 종료 시 AWS IoT Core가 Presence 이벤트 발행


5. presence 이벤트 감지 와일드 카드 구독 예시 : 

  >> $aws/events/presence/connected/#

  >> $aws/events/presence/disconnected/#

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[MQTT (Message Queueing Telemetry Transport) 통신 설명]

https://kkh0977.tistory.com/3631

https://blog.naver.com/kkh0977/222971771381?trackingCode=blog_bloghome_searchlist


[Aws Iot Core] Fleet provisioning 플릿 프로비저닝 수행 방법 정리 - 클레임 인증서 , 신뢰할 수 있는 사용자

https://blog.naver.com/kkh0977/223779257161?trackingCode=blog_bloghome_searchlist


[Aws Iot Core] Aws 프로비저닝 수행 및 섀도우 Shadow 토픽 Topic 구독 시 와일드 카드 (wild card) 설명 정리

https://blog.naver.com/kkh0977/223825295723?trackingCode=blog_bloghome_searchlist


[android] Aws Iot Core MQTT 연결 수행 후 Timer 타이머 사용해 주기적 connect 연결 상태 변경 및 해제 감지 로직

https://blog.naver.com/kkh0977/224043610334?trackingCode=blog_bloghome_searchlist

// --------------------------------------------------------------------------------------
 
728x90
반응형
Comments