2016년 2월 15일 월요일

MQTT subscribe - Wildcard

MQTT를 사용하다보면 여러개의 topic 을 동시에 가입해야할 경우가 있는데

가령 대화방의 경우 같은 방에 있는데 누가 메시지를 보냈는지 알아야하는데 subscribe한 top에 들어온 client ID 를 알 수는 없을 때 사용자 별로 각자 topic을 만들어 publish 하고 모든 사용자가 서로의 topic을 죄다 가입한 후 topic을 보면서 구분할 수 있는데 이 경우 subscribe하기가 매우 번거롭다.

Wildcard를 이용하여 이런 요구를 해결할 수 있다.

1. Single Level : +

해당 레벨에 한하여 topic을 확장한다.
chatroom/roomA/+/profile로 subscribe를 하면

아래와 같이 topic들이 있을 경우

chatroom/roomA/userA/message (X)
chatroom/roomA/userA/profile (O)
chatroom/roomA/userA/status (X)
chatroom/roomA/userB/message (X)
chatroom/roomA/userB/profile (O)
chatroom/roomA/userB/status (X)
chatroom/roomB/userC/message (X)
chatroom/roomB/userC/profile (X)
chatroom/roomB/userC/status (X) 
chatroom/roomB/userD/message (X)
chatroom/roomB/userD/profile (X)
chatroom/roomB/userD/status (X)

roomA와 profile이 있는 topic에 모두 subscribe 한다.

2. Multi Level : #

해당 레벨과 그 하위 topic 모두 subscribe 한다.
마찬가지로 chatroom/roomA/# 로 subscribe를 하면

chatroom/roomA/userA/message (O)
chatroom/roomA/userA/profile (O)
chatroom/roomA/userA/status (O)
chatroom/roomA/userB/message (O)
chatroom/roomA/userB/profile (O)
chatroom/roomA/userB/status (O)
chatroom/roomB/userC/message (X)
chatroom/roomB/userC/profile (X)
chatroom/roomB/userC/status (X) 
chatroom/roomB/userD/message (X)
chatroom/roomB/userD/profile (X)
chatroom/roomB/userD/status (X)

roomA 의 모든 topic을 subscribe 한다.

주의사항. 
1. topic을 만들때 /chatroom 과 같이 /로 먼저 시작하지 말것.
2. space를 사용하지 말것
3. ASCII만 사용할 것 ( CR/LF 등등 안보이는 문자를 제외)
4. $로 시작하는 https://github.com/mqtt/mqtt.github.io/wiki/SYS-Topics 과 충돌을 고려할 것