글 / MQTT 메시징

MQTT 토픽 이름과 와일드카드

토픽은 /로 단계를 구분하고, 구독할 때만 +와 #으로 여러 토픽을 한 번에 수신한다.

작성일 · 읽는 시간 2분 · MQTT 5.0 기준

토픽 이름

토픽 이름은 /로 단계를 분리한 문자열이며 대소문자를 구분한다. 구독할 때는 단계 단위로 일괄 수신하므로, 넓은 범위에서 좁은 범위 순서로 구성하면 이후 필요한 범위만 선택하여 수신할 수 있다.

text
plant/line1/robot3/temperature
plant/line1/robot3/status
plant/line2/conveyor1/status

plant에서 장비와 항목으로 좁혀 가는 토픽 단계 구조

와일드카드

와일드카드는 구독할 때 지정하는 토픽 필터에만 사용한다. 발행하는 토픽 이름에는 사용할 수 없다.

  • +: 한 단계와 일치한다. 어느 위치에나 둘 수 있다.
  • #: 해당 위치와 그 하위의 모든 단계와 일치한다. 필터의 맨 끝에만 둘 수 있다.
필터 일치하는 토픽 일치하지 않는 토픽
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#은 유효한 필터가 아니다.

bash
# -v를 주면 토픽 이름과 페이로드를 함께 찍는다
mosquitto_sub -v -t 'plant/line1/+/status'

선행 슬래시와 공백

표준은 앞뒤의 /와 공백을 금지하지 않는다. 다만 /plant는 plant와 다른 토픽이다. 맨 앞에 길이 0인 단계가 하나 추가되므로 /plant/line1은 +/+가 아니라 +/+/+와 일치한다.

/plant/line1의 길이 0인 단계와 +/+/+ 필터의 일치

공백이 포함된 토픽은 명령줄에서 따옴표로 감싸야 하며, Line 1과 Line1은 서로 다른 토픽이 된다. 선행 슬래시와 공백은 모두 사용하지 않는 편이 안전하다.

$로 시작하는 토픽

$로 시작하는 토픽은 브로커가 사용하도록 예약되어 있다. $SYS/는 브로커 상태 정보를 발행하는 토픽의 접두어로 널리 사용된다.

#이나 +로 시작하는 필터는 $로 시작하는 토픽과 일치하지 않는다. #을 구독해도 $SYS/ 하위의 메시지는 수신되지 않으므로 $SYS/#을 별도로 구독한다. 응용 프로그램의 토픽 이름은 $로 시작하지 않게 정한다.