Arduino에서 Wi-Fi 기반의 MQTT 사용하기

2016. 9. 5. 10:442018년 이전 관심사/Arduino

반응형

앞 포스팅에서 기술한 것과 같이, WizFi250 Arduino Library가 업데이트 되면서 기존에 ESP8266이나 Ethernet에서 사용하는 예제들을 별도의 수정 없이 그대로 사용 할 수 있게 되었다.

http://www.life4iot.com/2016/07/27/wizfi250-arduino-library/

본 포스팅에서는 업데이트 된 WizFi250 Arduino Library를 이용하여 Arduino에서 Wi-Fi를 사용하고 MQTT 연결 후 데이터를 Publish하고 Subscribe 하는 예제를 구현 하는 방법을 설명 한다.

MQTT란?

mqttorg

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

아래 문서를 참고 하면, MQTT에 대한 자세한 내용을 확인 할 수 있다.
MQTT 소개

WizFi250 Library 설치 및 PubSub Client Libary 설치

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

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

20160801_140536

20160801_140642

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 할 수 있다.

20160801_142526

// 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

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

20160801_144011

MQTT Publish Test

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

20160801_143851

MQTT Subscirbe Test

PC에 MQTT.fx 툴을 설치 한다. MQTT.fx Download

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

20160801_150203

20160801_150215

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

20160801_150232

20160801_145851

반응형