mqtt는 Message Queuing Telemtry Transport의 약자로 주로 IoT에서 주로 쓰이는 프로토콜의 하나이다.
mqtt에서는 클라이언트도 서버도 존재하지 않는다. 서버에 요청을 보내고, 보낸 요청에 대한 Response를 받는 http 통신과는 다르다.
대신 Message를 발행(Publish)하는 Publisher와, 관심있는 주제(topic)을 구독(Subscribe)하는 구독자가 있다. 또한 이러한 모든 메시지를 중계하는 Broker가 존재한다.
HTTP Restful API를 구현해 보았다면, URI에서의 슬래시("/")가 리소스를 구분하기 위한 용도로 사용된다는 것을 알 것이다.
MQTT에서 토픽의 구분도 슬래시를 통해서 할 수 있으며, 이를 통해 기기에 대한 정보들을 효율적으로 할 수 있다.
은행을 예시로 설명해보자
은행은 site1이고 은행 1번의 보안을 위해 설치된 카메라 및 센서들에 대한 정보들을 다음과같이 토픽으로 구분하여 관리할 수 있다.
모스키토는 앞서말한 MQTT 브로커중 한 종류이다. 실무에서는 코드를 통해 모스키토를 제어하겠으나, 모스키토를 컴퓨터에 설치해보는것 만으로도 Pub/Sub을 경험해 볼 수 있다
brew install mosquitto
명령어로 모스키토를 설치해준다
모스키토가 설치되었다면, brew services start mosquitto
명령어를 사용하여 모스키토를 실행시켜준다. 이미 실행 되고있다고 메시지가 나올 수도 있다.
미리 약속된 토픽을 정하자, 필자는 kevin이라고 하겠다.
우선 Subscriber를 실행시켜보자, mosquitto_sub -d -t kevin
명령어를 입력하면 다음과같이 Subscriber가 실행된다.
위와같이 mosquitto broker에 kevin토픽의 Subscriber로써 접속할 수 있고, 접속을 유지하기 위해 일정 기간에 걸쳐 한번씩 pingreq를 보내는 것을 볼 수 있다.
(아무런 설정을 하지않고 접속하면 로컬호스트를 목표주소로 하기때문에 이런것이 가능하다.)
터미널창을 한개 더 띄운 후 다음 명령어를 통해 메세지를 보내보자
mosquitto_pub -d -t kevin -m "hello this is kevin"
이후 해당 명령을 보낸 창에서는 다음과 같은 메시지가 출력된다.
-m 옵션으로 hello this is kevin 이라는 메세지를 채널에 보내도록 명령했고, mosquitto publisher가 해당 역할을 수행한 후 종료되었다.
그렇다면 Subscriber의 터미널 화면에서는 어떻게 출력되는지 보자
3번째줄에 퍼블리시 메세지를 받았다고 출력되고, 다음줄에 내용이 출력되었다.
이렇게 해서 Publish-Subscribe 방식의 MQTT 통신을 간략히 해볼 수 있다.
MQTT는 저전력, 낮은 대역폭, 즉 전기가 잘 안들어오거나, 인터넷 상황이 좋지 못하더라도 사용할 수 있게 설계되었다.
그렇기 때문에 MQTT는 고용량의 데이터들을 전송하기 위해서 사용하기 보다는, 저용량의 메시지를 보내는 것에 적합하다고 볼 수 있다.
HTTP는 Stateless하지만, MQTT는 Stateful하다.