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 클라이언트 라이브러리의 의무임.
'네트워크 > MQTT' 카테고리의 다른 글
라즈베리 파이 OS 설치 (0) | 2023.11.28 |
---|---|
MQTT 개념 (1) (0) | 2023.11.21 |
[MQTT] socket.gaierror: [Errno 11001] getaddrinfo failed 오류 (0) | 2023.07.13 |
MQTT(1) - mqtt에 대해 & publisher와 subscriber간의 메세지 주고 받기 (0) | 2023.03.30 |