위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

아두이노에서 Wi-Fi 기반 MQTT 사용하기

WIZnet Academy 2016.08.05 16:15 조회 수 : 31

이번 포스팅에서는 최신 버젼의 WizFi250 Arduino Library를 이용하여 아두이노에서 Wi-Fi를 사용하고,  MQTT 연결 후 데이터를 Publish하고 Subscribe 하는 예제를 구현 하는 방법에 대해서 설명하겠습니다.

WizFi250 Arduino 라이브러리 최신 버젼 다운로드

MQTT란?

mqtt

MQTT란 경량의 Publish/Subscribe 메시징 프로토콜입니다. IoT(Internet of things)나 M2M(machine-to-machine)에서 사용하기 위해 설계 되었으며, 이런 이유로 낮은 전력, 낮은 대역폭 환경에서 사용할 수 있습니다.

아래 링크에 접속하시면 , MQTT에 대한 자세한 내용을 확인 할 수 있습니다.

MQTT 소개

WizFi250 라이브러리 설치 및 PubSub Client Library 설치

아두이노 IDE에서는 라이브러리 매니저를 지원합니다. 라이브러리 매니저를 이용하면, Arduino에서 사용 할 Library를 편하게 검색하고 설치 할 수 있으며, WizFi250 Library 역시 라이브러리 매니저를 이용하여 설치 할 수 있습니다.

아두이노 IDE의 메뉴에서 [스케치]-[Include Library]-[Manage Libraries] 선택 후, Library Manager에서 WizFi250을 검색 후 설치 합니다.

arduino_library_mng

arduino_library_mng-2

 

Arduino에서 MQTT를 사용하기 위해서는 PubSubClient Library를 설치 해야 합니다. 설치 방법은 WizFi250 Library 설치와 동일하며 검색어만 pubsubclient로 바꿔서 사용하면 됩니다.

Arduino에서 Wi-Fi 연결 후 MQTT 사용하기

WizFi250 Library에는 MQTT를 사용하기 위한 기본적인 예제를 포함하고 있습니다. 아두이노 IDE에서 [파일]-[예제]-[WizFi250]-[mqtt_wizfi250]를 열고 Wi-Fi SSID와 Password를 공유기에 맞게 설정하면 그대로 사용 할 수 있으며, broker.mqtt-dashboard.com에 설치되어 있는 broker에 접속해서 데이터를 publish 하고 subscribe 할 수 있습니다.
// Update these with values suitable for your network.
const char* ssid = "DIR-815_Wiznet";
const char* password = "12345678";
const char* mqtt_server = "broker.mqtt-dashboard.com";

위 코드에서 mqtt_server 값을 변경하면, broker.mqtt-dashboard.com에 있는 broker 이외의 다른 broker를 이용 할 수 있습니다.

아래 코드는 WizFi250을 AP에 연결한 후, MQTT Broker에 접속하고, Callback 함수를 등록하도록 합니다. Callback 함수는 Arduino+WizFi250이 MQTT Broker로 부터 MQTT Message를 수신 하였을 때 처리 하기 위한 내용을 정의 합니다.
void setup() {
pinMode(9, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}

void setup_wifi() {

delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.init();
WiFi.begin((char*)ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

본 예제의 callback 함수는 Broker로 부터 Message를 수신하면 “Topic”을 출력하고 “Topic”에 대한 Payload 값을 출력 합니다. 그리고 모든 “Topic”에 대하여 Payload 값이 ‘1’이면 9번 핀에 연결되어 있는 LED를 ON하고 ‘0’이면 LED를 OFF 합니다.
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();

// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(9, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is acive low on the ESP-01)
} else {
digitalWrite(9, HIGH); // Turn the LED off by making the voltage HIGH
}

}

Main Loop에서는 MQTT Broker와 연결이 끊어 지면 다시 연결 하고, 2초에 한번씩 “outTopic”이라는 Topic으로 “WizFi250 hello world xxxx” 메시지를 보냅니다.
void loop() {

if (!client.connected()) {
reconnect();
}
client.loop();

long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 75, "WizFi250 hello world #%ld", value);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish("outTopic", msg);
}
}

MQTT Publish / Subscribe Test

위 예제를 컴파일 하고 아두이노에 업로드 한 후, 예제가 정상적으로 구동 한다면 아래와 같은 로그 메시지를 확인 할 수 있습니다.

log_message

MQTT Publish Test

PC의 웹브라우저를 이용하여 broker.mqtt-dashboard.com에 접속하면 아래와 같은 화면을 볼 수 있으며, 빨간 박스로 표시된 부분과 같이 “outTopic”에 “WizFi250Hello world #xxxx” 메시지가 출력되면 아두이노에서 메시지를 정상적으로 publish 한 것으로 판단 할 수 있습니다.

publish

MQTT Subscribe Test

PC에 MQTT.fx 툴을 설치 합니다.

MQTT.fx Download

MQTT.fx의 Connection Profile에 연결할 broker.mqtt-dashboard.com 정보를 입력한 후 Connect 버튼을 누르면 broker.mqtt.dashboard.com에 연결 할 수 있습니다.

subscribe_test_1

subscribe_test_2

아래 그림과 같이 첫번째 박스에 Topic, 두번째 박스에 Message를 입력한 후 Publish 버튼을 누르면, Arduino에서 해당 토픽에 대한 메시지를 로그 메시지로 출력합니다. 아래 그림과 같이 출력 되면, 정상적으로 Subscribe가 된다고 판단 할 수 있습니다.

subscribe_test_3

subscribe_test_4

 

출처 : Life4 IoT