네트워크/MQTT

MQTT 개념 (2)

위시리 2023. 11. 21. 19:45

MQTT 서비스 품질

 

 

MQTT 패킷 구조

 

 

MQTT 통신 형식

MQTT를 활용한 통신 연결 : 클라이언트가 CONNECT 메세지를 중개자에게 보냄으로써 시작

클라이언트만이 세션 시작 가능

클라이언트와 다른 클라이언트는 직접적으로 통신 불가능

브로커는 CONNECT 메세지에 항상 CONNACK 회신과 상태 코드로 응답

연결이 이뤄지면 개방된 채로 유지 

 

MQTT 메세지 형식

  • CONNECT 형식 (클라이언트 - 서버) : 일반적인 CONNECT 메세지는 아래 내용이 포함됨
필드 요구 사항 설명
clientID 있음 클라이언트에 대한 서버 식별
클라이언트는 고유한 클라이언트 ID를 가짐
1~23 사이에서 UTF-8 byte 길이를 가짐
cleanSession 선택 사항 0 : 서버가 클라이언트를 통해 커뮤니케이션 재개
  클라이언트와 서버는 연결 해제 후 세션 상태를 저장해야함
1 : 클라이언트와 서버는 이전 세션을 버리고 새로운 세션을
  시작해야함
username 선택 사항 인증을 위해 서버에서 사용하는 이름
password 선택 사항 2byte 길이의 접두사가 붙은 0~65536 byte의 이진수 암호
lastWillTopic 선택 사항  
lastWillQoS 선택 사항  
lastWillMessage 선택 사항  
lastWillRetain 선택 사항  
keepAlive 선택 사항 초 단위 시간 간격에 해당
클라이언트는 keepAlive 타이머가 만료되기 전에 메세지 또는 PINGREQ 패킷을 전송해야 함
Keep Alive 기간의 1.5배가 지나면 서버와 네트워크의 연결이 해제됨
0 값은 keepAlive 매커니즘을 비활성화함

 

  • CONNECT 반환 코드 (서버 - 클라이언트) : 브로커는 반응 코드로 CONNECT 메세지에 대응한다. 설계자는 브로커가 모든 연결을 승인하지 않을 수 있다는 사실을 염두해야 한다.

반응코드

반환 코드 설명
0 연결 성공
1 연결 거부 - 받아들일 수 없는 MQTT 프로토콜 버전
2 연결 거부 - 식별된 클라이언트는 올바른 UTF-8이지만, 서버에서 허용되지 않음
3 연결 거부 - 서버를 사용할 수 없음
4 연결 거부 - 잘못된 사용자 이름 또는 암호
5 연결 거부 - 클라이언트의 연결이 승인되지 않음

 

  • PUBLISH 형식 (클라이언트 - 서버) : 클라이언트는 토픽 가지로 데이터를 발행할 수 있다. 각 메세지에는 하나의 토픽이 포함됨
필드 요구 사항 설명
packetID 있음 변수 헤더의 패킷을 고유하게 식별
클라이언트 라이브러리 담당
항상 QoS-0에 0으로 설정
topicName 있음 발행되는 토픽 가지 (/로 구분)
qos 있음 QoS 수준 : 0 / 1 / 2
retainFlag 있음 서버에서 인증에 사용되는 이름
payload 선택 사항 메세지 형식에 구애받지 않는 페이로드
dupFlag 있음 메세지가 중복되며 전송됨

 

  • SUBSCRIBE  형식 (클라이언트 - 서버) : 구독 패킷의 페이로드에는 최소 한 쌍의 UTF-8로 인코딩된 topicID와 QoS 수준이 포함된다. 여러 브로드캐스트를 위해 클라이언트를 확보할 목적으로 해당 페이로드를 구독하는 여러 개의 topicID가 존재할 수도 있다.
필드 요구 사항 설명
packetID 있음 변수 헤더의 패킷을 고유하게 식별
클라이언트 라이브러리 담당
topic_1 있음 구독된 토픽 가지
qos_1 있음 topic_1으로 발행된 QoS 메세지 수준
topic_1 선택 사항 서버에서 인증에 사용되는 이름
qos2 선택 사항 topic_2로 발행된 QoS 메세지 수준

 

하나의 메세지에서 여러 개의 토픽을 구독하는데 와일드 카드가 사용됨

ex. 토픽 전체 경로 : "{contry}/{state}/{cities}/{temperature, humidity}"와 같은 형식으로 표현 가능

  • + 단일 수준 와일드 카드 : 토픽 문자열 이름의 단일 수준 대표
  • * 다중 수준 와일드 카드 : 단일 수준이 아닌 다중 수준을 대체, 항상 토픽 이름의 마지막에 옴
  • $ 특수 토픽 : MQTT 브로커의 특수 통계 모드에 해당. 클라이언트는 $ 토픽을 발행할 수 없음. (책이 발간된 시점의) 현재로서는 사용과 관련된 공식적인 표준이 없는 상태

 ** MQTT 서버는 토픽 이름에 와일드카드를 지원해야 함 (단, 사양에서 명시적으로 요구하는 사항은 X). 와일드카드를 지원하지 않을 경우, 서버는 해당 토픽을 거절해야 함. packetID를 설정하는 것은 MQTT 클라이언트 라이브러리의 의무임.