WIZFi & Arduino Mega 예제(MQTT 사용하기)

이번 예제에서는 WIZFi310과 Arduino Mega을 이용하여 MQTT를 사용하는 방법에 대해 알아보겠습니다.

MQTT 개요

MQTT(Message Queue Telemetry Transport)는 IBM이 주도하여 개발한 프로토콜로써 모바일 기기나 낮은 대역폭의 소형 디바이스들에 최적화된 메시징 프로토콜입니다. 느리고 품질이 낮은 네트워크에서도 메시지를 안정적으로 전송할 수 있도록 설계되었기 때문에 IoT(Internet of Things)나 M2M(Machine-to-Machine)에 최적화 되어있습니다. 아래 그림에서 볼 수 있듯이 MQTT는 Publisher 기기와 Subscriber 기기 그리고 그 둘을 이어주는 Broker로 이루어져 있습니다.

MQTT_Summary

MQTT의 자세한 내용에 대하여 살펴보시려는 분은 아래 링크를 참조하시기 바랍니다.
https://www.joinc.co.kr/w/man/12/MQTT/Tutorial

MQTT 사용방법

Library 설치

WIZFi 310 Library

WIZfi310 Library를 추가 설치합니다.

PubSub Client Library

PubSub Client Library를 추가 설치합니다.
아래 그림과 같이 PubSub Client Library를 추가 설치합니다.

PubSub_Client_Library_Setting_0
PubSub_Client_Library_Setting_1

WIZFi, Arduino Mega & MQTT

1. 아래 그림과 같이 아두이노를 세팅합니다. 여기서 주의할 점은 무선 네트워크를 사용할 수 있어야 한다는 점입니다.

Arduino_Setting_Picture

2. 아두이노 홈페이지에서 아두이노 IDE를 다운로드 후 설치합니다.
https://www.arduino.cc/en/Main/Software
3. 아래 그림과 같이 아두이노 포트와 보드를 세팅합니다.

Arduino_Setting_PORT

Arduino_Setting_BOARD

4. 아래 그림과 같이 코드를 올린 뒤 아두이노에 올립니다. (코드는 글 하단에 자세히 적혀 있습니다.)

Code_

5. 아두이노 IDE 오른쪽 상단의 시리얼 모니터를 클릭합니다.

Serial_Mon

6. 다음과 같은 메시지가 뜨면 MQTT 사용 성공입니다.

Serial_window_t

MQTT Publish Test

1. PC의 웹브라우저를 이용하여 HIVEMQ(mqtt web broker)에 접속합니다.
http://www.mqtt-dashboard.com/

HIVEMQ_

2. 하단의 Last message를 살펴보면서 “outTopic”이 출판(전송)되는지 확인합니다.(여러 사람이 이용하는 시간에는 실시간으로 빠르게 Publish 됨을 유의)

HIVEMQ_conf_

MQTT Subscribe Test

1. 아래 주소로 접속하여 MQTT.fx 툴을 설치합니다. (운영체제에 맞는 MQTT.fx 툴을 다운로드하여 설치)
http://www.mqttfx.org/
2. MQTT.fx의 Connection Profile에 연결할 broker.mqtt-dashboard.com 정보를 입력합니다.

MQTT_fx_

3. 아래 그림과 같이 첫번째 박스에 inTopic, 두번째 박스에 Message를 입력한 후 Publish 버튼을 누릅니다.

MQTT_fx_

4. Arduino에서 해당 토픽에 대한 메시지를 출력합니다.

MQTT_Serial_

code


#include "Arduino.h"
#include "WizFi310.h"
#include "PubSubClient.h"

char ssid[] = "Matthew"; //your network SSID
char pass[] = "00000000"; //your network password
int status = WL_IDLE_STATUS; //the WiFi radio's status

//Connect server
char server[] = "broker.mqtt-dashboard.com";

WiFiClient WizFiClient;
PubSubClient client(WizFiClient);

long lastMSG = 0;
char msg[50];
int value = 0;

void setup_WiFi();
void callback(char* topic, byte* payload, unsigned int length);
void reconnect();

void setup() {
Serial.begin(9600);
Serial3.begin(115200);
delay(6000);
Serial.print("Starting...");
Serial.println("WiFi initiallize");
WiFi.init(&Serial3);

if(WiFi.status() == 0)
{
Serial.println("Failed to configure WiFi");
while(true)
;
}

while(status !=WL_CONNECTED)
{
Serial.print("[WiFi] Attempting to connect to WPA SSID: ");
Serial.println(ssid);
//Connect to WPA/WPA2 network
status = WiFi.begin(ssid, pass);
}
Serial.println("moyo");
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
delay(1000);

client.setServer(server, 1883);
client.setCallback(callback);
}

void loop() {

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

long now = millis();
if(now - lastMSG > 2000)
{
lastMSG = now;
++value;
snprintf(msg, 75, "Start WIZFI310 Hello world #%ld", value);
Serial.print("Publish MeSsaGe: ");
Serial.println(msg);
client.publish("outTopic", msg);
}
}

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();

if((char)payload[0] == '1')
{
digitalWrite(9, LOW);
}
else
{
digitalWrite(9, HIGH);
}
}

void reconnect()
{
while(!client.connected())
{
Serial.print("Attempting MQTT connection.....");
//Attempt to connect
if(client.connect("WizFiClient")){
Serial.println("connected");

//Publish and subscribe
client.publish("outTopic", "Start WIZFI310 Hello world");
client.subscribe("inTopic");
}
else
{
Serial.println(client.connected());
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}