본문 바로가기
IoT 디바이스 활용/MQTT

MQTT - Arduino

by cooluk 2020. 10. 16.

Arduino MQTT PubSubClient 라이브러리


Arduino MQTT

라이브러리 추가

주요 메서드

  • PubSubClient(Client)

    • 생성자
    • Client 객체를 매개변수로 지정
    WiFiEspClient espClient;
    PubSubClient client(espClient);

  • setServer(서버주소, 포트번호)

    • 서버 정보 설정
    client.setServer(MQTT_SERVER, 1883);

  • setCallback(callback)

    • 구독자인 경우 메시지 수신 처리 콜백 등록
    client.setCallback(callback);

주요 메서드

  • connect() / connect(ClientId)

    • MQTT 서버 연결
    client.connect("ESPClient");

  • publish(토픽, 메시지)

    • 토픽 발행
    client.publish("home/livingroom/led", message);

  • subscribe(토픽)

    • 구독자로 등록
    • 주로 접속 성공 후 등록
    client.subscribe("home/livingroom/led");

구독자 콜백 함수

  • void callback(char* topic, byte* payload, unsigned int length)

    • 토픽 메시지 수신 시 호출

    • topic : 수신된 토픽

    • payload : 메시지 byte 배열

    • length : 수신된 메시지 길이


    • 문자열 변환 처리

      char message[100];
      memcpy(message, payload, length); // 메모리 블록 복사(dest, src, length)
      message[length] = NULL;

예제

MQTT - 2초 간격으로 13번 LED 깜빡이기

#include <SoftwareSerial.h>
#include <WiFiEsp.h>
#include <PubSubClient.h>
#include <SimpleTimer.h>
#include <WifiUtil.h>

SoftwareSerial softSerial(2, 3);           // RX, TX

const char ssid[] = "cooluk";               // 네트워크 SSID
const char password[] = "xofla1106!";       // 비밀번호
const char mqtt_server[] = "192.168.0.6"; // 서버 주소

// MQTT용 WiFi 클라이언트 객체 초기화
WifiUtil wifi(2, 3);
WiFiEspClient espClient;
PubSubClient client(espClient);

void callback(char *topic, byte *payload, unsigned int length) {
    payload[length] = NULL;
    char *message = payload;

    if (strcmp("1", message) == 0) {
        digitalWrite(13, HIGH);
    } else {
        digitalWrite(13, LOW);
    }

    Serial.print(topic);
    Serial.print(" : ");
    Serial.println(message);
}

void mqtt_init() {
    client.setServer(mqtt_server, 1883);
    // subscriber인경우 메시지 수신시 호출할 콜백 함수 등록
    client.setCallback(callback);
}

// MQTT 서버에 접속될 때까지 재접속 시도
void reconnect() {

    while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");

        if (client.connect("ESP8266Client")) {
            Serial.println("connected");
            // subscriber로 등록
            client.subscribe("home/livingroom/led");  // 구독 신청
        } else {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
        }
    }
}

void publish() {
    int state = !digitalRead(13);
    char message[10];
    sprintf(message, "%d", state);

    // 토픽 발행
    client.publish("home/livingroom/led", message);
}

// 2초 간격으로 publish
SimpleTimer timer;

void setup() {
    Serial.begin(9600);
    wifi.init(ssid, password);
    mqtt_init();

    pinMode(13, OUTPUT);
    digitalWrite(13, LOW);
    timer.setInterval(2000, publish);
}

void loop() {
    if (!client.connected()) {  // MQTT가 연결 X
        reconnect();
    }

    client.loop();
    timer.run();
}

>>> mosquitto_sub -v -h localhost -t home/#



아두이노 프로 미니

image-20200918141853932

Port : FTDI

'IoT 디바이스 활용 > MQTT' 카테고리의 다른 글

MQTT - raspberry  (0) 2020.10.20
MQTT - Python Client - Paho  (0) 2020.10.19
MQTT - MQTT 소개, Mosquitto  (0) 2020.10.16

댓글