SUBSCRIBE 메시지를 사용하여 클라이언트는 원하는 하나 이상의 토픽 이름을 브로커에 등록할 수 있습니다. 이러한 토픽에 publish된 메시지는 브로커에서 클라이언트로 PUBLISH 메시지로서 전달됩니다. SUBSCRIBE 메시지는 subscriber가 publish된 메시지를 수신할 QoS 레벨을 지정하기도 합니다.
다음 표에서는 고정된 헤더 형식을 보여줍니다.
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
바이트 1 | 메시지 유형 (8) | DUP 플래그 | QoS 레벨 | RETAIN | ||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | |
바이트 2 | 나머지 길이 |
SUBSCRIBE 메시지에 QoS 레벨 1이 있으므로 가변 헤더에는 메시지 ID가 들어 있습니다.
일반적으로 프로토콜 라이브러리가 메시지 ID를 생성하여 하나의 리턴 핸들로서 이 ID를 publish 응용프로그램에 다시 전달합니다. 이는 단일 클라이언트에서 실행 중인 여러 응용프로그램 또는 여러 publish하는 스레드가 중복된 메시지 ID를 생성하지 못하게 합니다.
메시지 ID 0 (0x0000)은 올바르지 않은 메시지 ID로 예약되어 있으므로 사용해서는 안됩니다. 메시지 ID는 16비트의 사인이 없는 정수로서, 일반적으로는 하나의 메시지에서 그 다음 메시지로 정확히 1씩 증가하지만, 반드시 그렇게 할 필요는 없습니다. 2바이트의 메시지 ID 순서는 먼저 MSB가 오고 그 다음에 LSB(Big Endian)가 옵니다.
다음 표에서는 메시지 ID가 10인 가변 헤더의 형식 예를 보여줍니다.
설명 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
메시지 ID | |||||||||
바이트 1 | 메시지 ID MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
바이트 2 | 메시지 ID LSB (10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
SUBSCRIBE 메시지의 페이로드(payload)에는 클라이언트가 subscribe할 토픽 이름의 목록과 클라이언트가 메시지를 수신할 QoS 레벨이 포함되어 있습니다. 문자열은 UTF 인코딩되어 있으며 QoS 레벨은 1바이트의 2비트를 차지합니다. 이러한 토픽/QoS 쌍은 다음 표에 있는 페이로드(payload) 예에 표시된 대로 연속적으로 채워집니다.
토픽 이름 | "a/b" |
요청된 QoS | 1 |
토픽 이름 | "c/d" |
요청된 QoS | 2 |
SUBSCRIBE 메시지의 토픽 이름은 압축되어 있지 않습니다.
페이로드(payload) 예의 형식은 다음 표에 표시되어 있습니다.
설명 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
토픽 이름 | |||||||||
바이트 1 | 길이 MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
바이트 2 | 길이 LSB (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
바이트 3 | 'a' (0x61) | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
바이트 4 | '/' (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
바이트 5 | 'b' (0x62) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
요청된 QoS | |||||||||
바이트 6 | 요청된 QoS (1) | x | x | x | x | x | x | 0 | 1 |
토픽 이름 | |||||||||
바이트 7 | 길이 MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
바이트 8 | 길이 LSB (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
바이트 9 | 'c' (0x63) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
바이트 10 | '/' (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
바이트 11 | 'd' (0x64) | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
요청된 QoS | |||||||||
바이트 12 | 요청된 QoS (2) | x | x | x | x | x | x | 1 | 0 |
요청된 QoS 레벨이 부여된다고 가정할 때, 클라이언트는 publisher로부터 전송된 원래 메시지의 QoS 레벨에 따라 이 레벨 이하의 레벨에서 PUBLISH 메시지를 수신합니다. 예를 들면, 클라이언트에 특정 토픽으로의 QoS 레벨 1 subscription이 있으면, 해당 토픽에 대한 QoS 레벨 0 PUBLISH 메시지가 QoS 레벨 0의 클라이언트로 전달됩니다. 동일한 토픽에 대한 QoS 레벨 2 PUBLISH 메시지는 클라이언트로 전달하기 위해 QoS 레벨 1로 다운그레이드됩니다.
결과적으로 QoS 레벨이 2인 토픽을 subscribe하는 것은 publish된 QoS에서 이 토픽에 대한 메시지를 수신하는 것과 동일합니다.
요청된 QoS 필드는 다음 표에 표시된 대로 각 UTF 인코딩 토픽 이름을 따라 바이트로 인코딩됩니다.
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
예약됨 | 예약됨 | 예약됨 | 예약됨 | 예약됨 | 예약됨 | QoS 레벨 | ||
x | x | x | x | x | x |
이 바이트의 상위 6비트는 현재 프로토콜 버전에서 사용되지 않습니다. 나중에 사용하기 위해 예약되어 있습니다.