MQTT 토픽 이름과 와일드카드
토픽은 /로 단계를 구분하고, 구독할 때만 +와 #으로 여러 토픽을 한 번에 수신한다.
토픽 이름
토픽 이름은 /로 단계를 분리한 문자열이며 대소문자를 구분한다. 구독할 때는 단계 단위로 일괄 수신하므로, 넓은 범위에서 좁은 범위 순서로 구성하면 이후 필요한 범위만 선택하여 수신할 수 있다.
plant/line1/robot3/temperature
plant/line1/robot3/status
plant/line2/conveyor1/status
와일드카드
와일드카드는 구독할 때 지정하는 토픽 필터에만 사용한다. 발행하는 토픽 이름에는 사용할 수 없다.
+: 한 단계와 일치한다. 어느 위치에나 둘 수 있다.#: 해당 위치와 그 하위의 모든 단계와 일치한다. 필터의 맨 끝에만 둘 수 있다.
| 필터 | 일치하는 토픽 | 일치하지 않는 토픽 |
|---|---|---|
plant/+/robot3/status |
plant/line1/robot3/status |
plant/line1/robot3/arm/status |
plant/line1/# |
plant/line1, plant/line1/robot3/status |
plant/line2/conveyor1/status |
+와 #은 한 단계 전체를 차지해야 한다. robot+나 line1#은 유효한 필터가 아니다.
# -v를 주면 토픽 이름과 페이로드를 함께 찍는다
mosquitto_sub -v -t 'plant/line1/+/status'
선행 슬래시와 공백
표준은 앞뒤의 /와 공백을 금지하지 않는다. 다만 /plant는 plant와 다른 토픽이다. 맨 앞에 길이 0인 단계가 하나 추가되므로 /plant/line1은 +/+가 아니라 +/+/+와 일치한다.
공백이 포함된 토픽은 명령줄에서 따옴표로 감싸야 하며, Line 1과 Line1은 서로 다른 토픽이 된다. 선행 슬래시와 공백은 모두 사용하지 않는 편이 안전하다.
$로 시작하는 토픽
$로 시작하는 토픽은 브로커가 사용하도록 예약되어 있다. $SYS/는 브로커 상태 정보를 발행하는 토픽의 접두어로 널리 사용된다.
#이나 +로 시작하는 필터는 $로 시작하는 토픽과 일치하지 않는다. #을 구독해도 $SYS/ 하위의 메시지는 수신되지 않으므로 $SYS/#을 별도로 구독한다. 응용 프로그램의 토픽 이름은 $로 시작하지 않게 정한다.