[Arduino] WiDo에서 MQTT 메세지 Publish하기.
IoT에서 센싱을 담당하는 기기들은 주로 사양이 낮다.
그래서 메세지를 주고 받는 통신에서도 HTTP와 같은 프로토콜이 버거울 수 있다고 한다.
그래서 IoT 기기들을 위한 메세지 프로토콜로 CoAP과 MQTT가 발전하고 있다.
이번 포스팅에서는 WiDo(Arduino Leonardo + WiFi)를 이용한 MQTT 메세지를 보내는 방법을 설명해본다. (사실 혼자 정리해보는 것에 가깝다.)
(WiDo 사이트: http://www.dfrobot.com/index.php?route=product/product&product_id=1159#.VvnI3OKLSUk)
MQTT를 실습하기 전에 이론을 조금 아는 것이 좋다.
우선, MQTT메세지는 Topic과 Data로 이루어진다.
노드들은 Data를 Topic으로 식별한다.
아래 그림에서 예를 들면, temperature가 Topic이 되고 온도값이 Data가 된다.
MQTT의 통신 구성은 노드와 브로커(서버)로 이루어진다.
노드들은 메세지를 보내거나 받는다. 보내는 것을 Publish라고 하고, 받는 것을 Subscribe라고 한다. 여기서 노드들이 보내고 받을 때는 노드들 간에 1대1 연결이 아니다. 노드들의 메세지는 무조건 브로커(서버)를 통한다.
노드가 Publish를 하는 것도 브로커로 하는 것이고, 노드가 Subscribe를 하는 것도 브로커로 부터 받아 오는 것이다.
Publish와 Subscribe의 과정은 아래와 같다.
(1) 수신노드에서 Subscribe하기 위한 연결을 만들어 놓는다. 이것의 의미는 특정 브로커(서버)에게 "내가 원하는 Topic을 가진 Data가 들어오면 나한테 보내줘~"라는 것이다.
(2) 송신노드는 Data를 전송할 필요가 있을 때마다 Topic을 지정해서 브로커에게 Publish한다.
(3) 브로커는 새로 받은 Data의 Topic을 확인하고 이를 Subscribe하는 모든 노드에게 보내준다.
이제 실습을 정리해본다.
1. 실습 과정
(1) MQTT 서버 준비
나는 오픈소스인 Mosquitto를 이용했다.
(다운로드 : http://mosquitto.org/download/)
링크에서 'Binary Installation'에 있는 설치파일을 다운 받는다.
설치의 전반적인 과정은 아래 링크를 참고하면 좋다. 아래는 주의 사항만 적어본다.
(
http://midnightcow.tistory.com/category/MQTT)
나는 윈도우7이어서 'mosquitto-1.4.8-install-win32.exe'를 다운 받았다.
설치할 때 주의 사항이 2가지 있다.
첫 번째는 아래 그림처럼 나오는 화면에서 지시사항을 따라줘야 한다는 것이다.
OpenSSL에 대한 링크는 다운받아서 설치하면 되고, 두번째 링크는 바로 dll파일을 받기만 하면 된다.
단, OpenSSL 설치 시에도 아래 그림처럼 dll 복사 위치를 bin 폴더에 하는 것이 좋다.
왜냐하면 OpenSSL을 설치하면서 생기는 dll파일을 Mosquitto 폴더에 옮겨줘야 하기 때문에 dll파일이 뭐가 어디에 있는지 알아야하기 때문이다.
(2) Publish 할 노드 준비
서버를 준비했으니, Publish할 노드와 Subscribe할 노드를 만들어야 하는데 여기서는 Subscribe는 mosquitto에서 제공하는 프로그램을 이용하고, 나는 WiDo를 이용해서 Publish하는 노드를 만들어 본다.
WiDo는 Adafruit WiFi 모듈을 이용한다. 그래서 대중적인 MQTT for Arduino 모듈인
knolleary의 MQTT Client 모듈을 사용하기 힘들다.
다행히
Adafruit를 위한 MQTT 모듈이 있다. Github에서 zip으로 다운받아서 'cc3000_PubSubClient' 폴더를 Arduino설치 폴더의 libraries 폴더에 복사한다.
예제 소스는 아래 링크에서 확인할 수 있다.
(https://github.com/ChanMinPark/makeup/blob/master/002_NFC_Door/MQTT_example_for_Arduino/MQTTpcm.ino)
wifi ssid와 password를 설정하고 브로커의 ip주소를 설정해주고 setup()과 loop()부분을 자신에게 필요한 기능으로 구현하면 된다.