본문 바로가기

ESP32

ESP32 MQTT: 초보자 가이드

반응형

 

 

ESP32의 MQTT: 초보자 가이드 

 

MQTT게시/구독 모델의 IoT용 경량 메시징 프로토콜로, 최소한의 코드와 대역폭 오버헤드로 안정적인 실시간 통신을 제공합니다. 특히 리소스가 제한적이고 대역폭이 낮은 네트워크가 있는 장치에 유용하여 IoT, 모바일 인터넷, IoV 및 전력 산업에서 널리 채택되고 있습니다.

 

 

 

본 튜토리얼의 원본 문서는 언제나 그렇듯이 이 링크를 따라가면 만날 수 있습니다.

 

ESP8266의 업그레이드 버전인 ESP32는 저비용, 저전력 시스템 온 칩 마이크로컨트롤러입니다. ESP32에는 Wi-Fi 모듈 외에도 Bluetooth 4.0 모듈이 포함되어 있습니다. 듀얼 코어 CPU는 80~240MHz의 주파수에서 작동합니다. 여기에는 두 개의 Wi-Fi 및 Bluetooth 모듈과 다양한 입력 및 출력 핀이 포함되어 있습니다. ESP32는 IoT 프로젝트에 이상적인 선택입니다.

 

ESP32에서 MQTT를 사용하면 여러 가지 이점이 있습니다.

 

첫째, MQTT는 ESP32 및 Wi-Fi와 같은 제약이 있는 장치와 네트워크에 최적화된 가벼운 메시징 프로토콜이므로 전력과 대역폭에 미치는 영향이 최소화됩니다.

 

둘째, MQTT는 ESP32의 성능에 맞게 다양한 수준의 안정성과 서비스 품질을 지원합니다. 이러한 유연성 덕분에 네트워크가 불안정한 경우에도 사용하기에 적합합니다.

 

셋째, ESP32와 MQTT는 IoT 애플리케이션에서 널리 사용되어 IoT 솔루션에 잘 통합될 수 있습니다. MQTT 프로토콜은 또한 클라우드 플랫폼과의 통합을 간소화하여 네트워크에서 장치 제어 및 데이터 모니터링을 가능하게 하도록 설계되었습니다.

 

전반적으로 ESP32와 MQTT의 조합은 여러 장치 간의 무선 연결과 효율적인 메시징이 필요한 IoT 애플리케이션에 이상적입니다. 이 블로그에서는 간단한 데모를 통해 Arduino IDE를 사용하여 ESP32에서 MQTT 메시지와 토픽 구독을 게시하는 프로세스를 보여줍니다.

 

MQTT 브로커 준비

 

진행하기 전에 통신하고 테스트할 MQTT 브로커가 있는지 확인하세요. EMQX Platform Serverless Plan을 사용하는 것이 좋습니다.

 

EMQX Platform은 인프라 유지 관리의 번거로움 없이 IoT 기기를 모든 클라우드에 원활하게 연결하는 포괄적이고 완벽하게 관리되는 MQTT 메시징 클라우드 서비스입니다. Serverless Plan은 안전하고 확장 가능한 클러스터에서 MQTT 서비스를 제공하며, 사용량에 따라 요금을 지불하는 방식으로 MQTT를 시작하기에 유연하고 비용 효율적인 솔루션입니다.

 

이 문서에서는 무료 공개 MQTT 브로커를 사용하여 프로세스를 간소화합니다.

 

  • 서버: broker.emqx.io
  • TCP 포트: 1883
  • WebSocket 포트: 8083
  • SSL/TLS 포트: 8883
  • 보안 WebSocket 포트: 8084

 

ESP32에서 MQTT 시작하기

 

Arduino 구성

 

Arduino는 사용하기 쉬운 하드웨어와 소프트웨어를 기반으로 하는 오픈 소스 전자 플랫폼입니다. 대화형 프로젝트를 만드는 모든 사람을 대상으로 합니다. Arduino 보드는 센서의 조명, 버튼의 손가락 또는 Twitter 메시지와 같은 입력을 읽고 모터를 활성화하거나 LED를 켜거나 온라인에 무언가를 게시하는 출력으로 전환할 수 있습니다.

 

이 프로젝트에서는 Arduino 보드를 사용하여 ESP32 모듈을 컴퓨터에 연결합니다. Arduino는 ESP32에 코드를 업로드하고 ESP32와 노트북 간에 직렬 연결을 제공합니다.

 

Arduino 설치에 대한 자세한 지침은 공식 Arduino 문서를 참조하세요.

 

ESP32 개발 보드 설치

 

ESP32 개발 보드는 ESP32 플랫폼에서 MQTT를 사용하는 데 필수적입니다. ESP32에서 MQTT 기반 프로젝트를 개발하고 배포하기 위한 하드웨어 및 소프트웨어 지원을 제공합니다. 통합 Wi-Fi 및 Bluetooth 기능, 외부 구성 요소와의 인터페이스를 위한 GPIO 핀, Arduino IDE와의 호환성을 갖춘 ESP32 개발 보드는 MQTT 기반 IoT 애플리케이션의 원활한 연결, 프로토타입 제작 및 테스트를 가능하게 합니다.

 

다음 단계는 Arduino IDE에 ESP32 개발 보드를 설치하는 과정을 안내합니다.

 

  1. Arduino IDE 메뉴에서 "도구"를 클릭합니다.
  2. "개발 보드"를 선택한 다음 "개발 보드 관리"를 선택합니다.
  3. 보드 관리자에서 "ESP32"를 검색합니다.
  4. 찾으면 클릭한 다음 "설치" 버튼을 클릭합니다.

 

ESP32 개발 보드 설치

 

PubSubClient 설치

 

다음으로 MQTT 클라이언트 라이브러리 PubSubClient를 설치합니다. Nick O'Leary가 개발한 PubSubClient는 Arduino 기반 프로젝트를 위해 설계된 가벼운 MQTT 클라이언트 라이브러리입니다. MQTT를 지원하는 서버와 함께 간단한 게시/구독 메시징을 위한 클라이언트를 제공합니다. 이 라이브러리는 MQTT 통신을 간소화하고 Arduino 기반 IoT 애플리케이션에서 효율적인 데이터 교환을 가능하게 합니다.

 

PubSubClient 라이브러리를 설치하려면 다음 단계를 따르세요.

 

  1. Arduino IDE를 열고 메뉴 막대에서 "프로젝트"로 이동합니다.
  2. "라이브러리 로드"를 선택한 다음 "라이브러리 관리자"를 선택합니다.
  3. 라이브러리 관리자에서 검색 막대에 "PubSubClient"를 입력합니다.
  4. Nick O'Leary의 "PubSubClient" 라이브러리를 찾아 "설치" 버튼을 클릭합니다.

 

PubSub 클라이언트 설치

 

다음 단계를 따르면 Arduino IDE에 PubSubClient 라이브러리가 성공적으로 설치됩니다.

 

MQTT 연결 만들기

 

TCP 연결

 

1. 먼저 WiFi 및 PubSubClient 라이브러리를 가져와야 합니다. WiFi 라이브러리는 ESP32가 Wi-Fi 네트워크와 연결을 설정할 수 있도록 하는 반면 PubSubClient 라이브러리는 ESP32가 MQTT 브로커에 연결하여 메시지를 게시하고 토픽을 구독할 수 있도록 합니다.

 

#include <WiFi.h>
#include <PubSubClient.h>

 

 

2. 다음 매개변수를 구성하세요: Wi-Fi 네트워크 이름 및 비밀번호, MQTT 브로커 주소 및 포트, emqx/esp32로 토픽을 설정합니다. 

 

// WiFi
const char *ssid = "xxxxx"; // Enter your WiFi name
const char *password = "xxxxx";  // Enter WiFi password

// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "emqx/esp32";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;

 

 

3. 직렬 연결을 열어 프로그램 결과를 표시하고 Wi-Fi 네트워크에 연결을 설정합니다. 

 

// Set software serial baud to 115200;
Serial.begin(115200);
// Connecting to a Wi-Fi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
}

 

 

4. PubSubClient를 활용하여 MQTT 브로커와 연결을 설정합니다. 

 

client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
    String client_id = "esp32-client-";
    client_id += String(WiFi.macAddress());
    Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
        Serial.println("Public EMQX MQTT broker connected");
    } else {
        Serial.print("failed with state ");
        Serial.print(client.state());
        delay(2000);
    }
}

 

 

TLS/SSL

 

MQTT에서 TLS를 사용하면 정보의 기밀성과 무결성을 보장하여 정보 유출 및 변조를 방지할 수 있습니다.

 

이 ESP32 코드는 서버 루트 CA 인증서를 사용하여 안전한 Wi-Fi 연결을 설정합니다. ca_cert 변수에는 PEM 형식의 루트 CA 인증서가 들어 있습니다. espClient 객체는 setCACert() 함수를 사용하여 서버 루트 CA 인증서로 구성됩니다. 이 설정을 통해 ESP32 클라이언트는 TLS 핸드셰이크 중에 서버의 ID를 확인하여 안전한 Wi-Fi 연결을 설정하고 전송된 데이터의 기밀성과 무결성을 보장할 수 있습니다.

 

#include <WiFiClientSecure.h>

const char* ca_cert= \
"-----BEGIN CERTIFICATE-----\n" \
"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n" \
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n" \
"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n" \
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" \
"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n" \
"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n" \
"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n" \
"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n" \
"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n" \
"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n" \
"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n" \
"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n" \
"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n" \
"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n" \
"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n" \
"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n" \
"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n" \
"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n" \
"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=" \
"-----END CERTIFICATE-----\n";

// init wifi secure client
WiFiClientSecure espClient;

espClient.setCACert(ca_cert);

 

전체 TLS 연결 코드는 GitHub에서 확인할 수 있습니다. 

 

메시지 게시 및 구독

 

MQTT 브로커에 대한 연결이 성공적으로 설정되면 ESP32는 emqx/esp32 토픽에 메시지를 게시한 다음 emqx/esp32 토픽을 구독합니다. 

 

// publish and subscribe
client.publish(topic, "Hi, I'm ESP32 ^^");
client.subscribe(topic);

 

 

MQTT 메시지 받기 직렬 포트에 토픽 이름을 인쇄하는 콜백 함수를 설정하고 emqx/esp32 토픽에서 받은 메시지를 인쇄합니다. 

 

void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    for (int i = 0; i < length; i++) {
        Serial.print((char) payload[i]);
    }
    Serial.println();
    Serial.println("-----------------------");
}

 

 

전체 코드

전체 코드는 다음과 같습니다.

 

 

#include <WiFi.h>
#include <PubSubClient.h>

// WiFi
const char *ssid = "xxxxx"; // Enter your Wi-Fi name
const char *password = "xxxxx";  // Enter Wi-Fi password

// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "emqx/esp32";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    // Set software serial baud to 115200;
    Serial.begin(115200);
    // Connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi..");
    }
    Serial.println("Connected to the Wi-Fi network");
    //connecting to a mqtt broker
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp32-client-";
        client_id += String(WiFi.macAddress());
        Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Public EMQX MQTT broker connected");
        } else {
            Serial.print("failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    // Publish and subscribe
    client.publish(topic, "Hi, I'm ESP32 ^^");
    client.subscribe(topic);
}

void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    for (int i = 0; i < length; i++) {
        Serial.print((char) payload[i]);
    }
    Serial.println();
    Serial.println("-----------------------");
}

void loop() {
    client.loop();
}

 

 

실행 및 테스트

 

1. Arduino를 사용하여 전체 코드를 업로드하고 ESP32의 전원을 켜려면 다음 단계를 따르세요.

 

  1. USB 케이블을 사용하여 ESP32를 컴퓨터에 연결합니다.
  2. Arduino IDE를 열고 "도구" 메뉴에서 적절한 보드와 포트를 선택합니다.
  3. 전체 코드를 복사하여 Arduino IDE에 붙여넣습니다.
  4. "업로드" 버튼을 클릭하거나 단축키 Ctrl+U를 사용하여 코드를 컴파일하고 ESP32에 업로드합니다.
  5. 업로드 프로세스가 완료될 때까지 기다려 오류가 없는지 확인합니다.
  6. 코드가 업로드되면 컴퓨터에서 ESP32를 분리합니다.
  7. 적절한 전원에 연결하여 ESP32의 전원을 켭니다.

 

2. 직렬 모니터를 열고 전송 속도를 115200으로 설정합니다. 그런 다음 직렬 모니터에서 출력을 모니터링하여 ESP32의 연결 상태를 확인합니다.

 

ESP32 직렬 모니터

 

 

3. MQTTX 클라이언트를 사용하여 MQTT 브로커와 연결을 설정하고 ESP32에 Hi, I'm MQTTX와 같은 메시지를 게시합니다.

 

MQTTX는 macOS, Linux 및 Windows에서 실행되는 우아한 크로스 플랫폼 MQTT 5.0 데스크톱 클라이언트입니다. 사용자 친화적인 채팅 스타일 인터페이스를 통해 사용자는 여러 MQTT/MQTTS 연결을 쉽게 만들고 MQTT 메시지를 구독/게시할 수 있습니다.

 

MQTTX 클라이언트

 

4. MQTTX에서 게시된 메시지가 표시됩니다.

 

MQTTX에서 게시된 메시지

 

 

요약

 

이 초보자 가이드에서는 ESP32에서 MQTT를 구현하는 기본 사항을 다루었습니다. ESP32 개발 보드와 PubSubClient 라이브러리를 포함하여 필요한 도구를 설치했습니다. 독자는 단계별 지침을 통해 안전한 Wi-Fi 연결을 설정하고, MQTT 브로커에 연결하고, 메시지를 게시하고, 토픽을 구독할 수 있습니다. ESP32에서 MQTT를 활용하면 사용자는 안정적이고 효율적인 IoT 애플리케이션을 만들 수 있습니다.

 

다음으로, EMQ에서 제공하는 MQTT 가이드: 초보자부터 고급자까지 시리즈를 확인하여 MQTT 프로토콜 기능에 대해 알아보고, MQTT의 고급 애플리케이션을 탐색하고, MQTT 애플리케이션 및 서비스 개발을 시작할 수 있습니다. 

 

Resources

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^