ESP32

MQTT on ESP32- Publish- Subscribe Beginners Guide

기하 2023. 12. 22. 13:17

https://www.electronicwings.com/esp32/esp32-mqtt-client

 

MQTT on ESP32- Publish- Subscribe Beginners Guide | ESP32

MQTT (Message Queue Telemetry Transport) is a lightweight messaging protocol that is built on TCP protocol. Using ESP32, we can implement MQTT server/client which is useful for IoT applications.

www.electronicwings.com

 

 

Description

MQTT는 경량 게시-구독 기반 메시징 프로토콜입니다. publish-subscribe-based messaging protocol

  • HTTP와 같은 다른 request-response 기반 API보다 더 빠릅니다.
  • TCP/IP 프로토콜을 기반으로 개발되었습니다.
  • 원격 위치 장치는 메시지 브로커의 도움을 받아
    서버의 특정 주제에 연결, 구독, 게시 connect, subscribe, publish 등을 할 수 있습니다.
  • MQTT Broker/Message broker 는 발신자와 수신자 사이에 있는 모듈입니다. 
    메시지 유효성 검사, 변환 및 라우팅을 위한 요소입니다.  message validation, transformation, and routing
  • Broker 는 관심 있는 주제에 관심 있는 클라이언트(구독 클라이언트)에게 메시지를 배포하는 역할을 담당합니다.

 

예를 들어,

온도 센서가 "온도" 주제에 대한 온도 데이터(메시지)를 게시하면

"온도" 주제를 구독한 관심 있는 클라이언트는

위 그림과 같이 게시된 온도 데이터를 얻습니다.

 

MQTT는

모든 센서가 서버에 연결되어 있고

인터넷을 통해 이를 제어할 수 있는 IoT(사물인터넷) 임베디드 애플리케이션에 널리 사용됩니다.

 

ESP32는 오픈소스 IoT 플랫폼입니다. 
Espressif Systems의 ESP32 SoC 시리즈에서 실행되는 펌웨어입니다. 

이 제품에는 IoT 애플리케이션을 쉽게 구축할 수 있는

온보드 2.4GHz Wi-Fi, Bluetooth 및 Bluetooth LE 모듈이 있습니다.

 

ESP32의 MQTT 클라이언트 모듈은

MQTT 프로토콜 버전 3.1.1을 따릅니다. 

브로커가 버전 3.1.1을 지원하고 올바르게 구성되어 있는지 확인하십시오.

 ESP32에서 MQTT에 사용되는 함수를 살펴보겠습니다.

 

MQTT Packet Formation

MQTT는

서버에 연결하고 서버의 주제를 구독하거나 게시하는 데 사
용되는 다양한 패킷 형식을 사용합니다.

 

MQTT OASIS 표준은 아래 링크를 참조하세요. 

MQTT 패킷 구성을 이해하는 데 도움이 됩니다.

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718027

Example

Adafruit 대시보드에서
DHT11
 센서  사용하여 원격 위치로 온도  습도를 전송하도록
ESP32를 MQTT 클라이언트로 구성하는 Arduino 프로그램을 작성해 보겠습니다 .

 

여기서는 GitHub의 Mark Ruys가 만든 DHT11 라이브러리를 사용하겠습니다.

Download this library from here.

 

여기서는 MQTT 클라이언트 데모 목적으로 Adafruit 서버를 사용하고 있습니다.

IOT 플랫폼에서 Adafruit IO 대시보드를 사용하면
인터넷에 연결된 장치를 시각화하고 제어할 수 있습니다. 

누구나 자신의 센서 장치에서 실시간 데이터를 시각화하고 분석할 수 있습니다.

 

 Adafruit IO 대시보드에 대해 자세히 알아보고 시작하려면  

https://learn.adafruit.com/adafruit-io-basics-dashboards/creating-a-dashboard

가입하고 대시보드를 만드세요. 

대시보드가 ​​성공적으로 생성되면 나중에 피드 데이터에 액세스하는 데 사용되는 AIO 키를 얻게 됩니다.

 

Adafruit에 대시보드를 생성하면

장치를 제어하고 장치 상태를 모니터링하는 데 사용할 수 있는 다양한 블록을 추가할 수 있습니다. 

블록에 대한 자세한 내용을 보려면

 https://learn.adafruit.com/adafruit-io-basics-dashboards/adding-blocks 링크를 참조하세요.

DHT11과 인터페이스되는 ESP32

 

필수 라이브러리 설치

 먼저 Arduino IDE에 ESP32 보드 패키지가 설치되어 있지 않은 경우 Arduino IDE를 사용하여 ESP32 시작하기를 참조하세요  .

여기서는 위의 예에서 Adafruit 라이브러리를 사용하고 있습니다.  Arduino 라이브러리 관리자를 사용하여 Adafruit IO  Adafruit MQTT 및  ArduinoHttpClient 라이브러리를 설치해야 합니다  .

Arduino IDE를 열고  스케치 -> 라이브러리 포함 -> 라이브러리 관리… 로 이동합니다.

 

라이브러리 관리자 창이 나타납니다. 이제   검색 상자에  Adafruit IO Arduino를 입력하고 Adafruit IO Arduino 라이브러리  옵션에서 설치를 클릭하여 버전 4.2.0 이상을 설치하세요.

이제   검색 상자에  Adafruit MQTT를 입력하고 Adafruit MQTT 라이브러리  옵션에서 설치를 클릭하여 버전 2.4.2 이상을 설치하세요.

이제 Adafruit mqtt io 대시보드의 예를 엽니다. 이를 열려면  파일 -> 예제 -> Adafruit MQTT 라이브러리 -> adafruitio_secure_esp32로 이동하세요.

이제 아래 이미지에 표시된 대로 예시의 올바른 정보로 Wi-Fi 및 Adafruit io 자격 증명을 편집하세요.

아래의 위 예에 따라 mqtt_esp32 예를 수정했습니다.

MQTT 클라이언트용 Arduino 스케치

/***********************************************************************
 Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example

 Use the latest version of the ESP32 Arduino Core:
   https://github.com/espressif/arduino-esp32

 Works great with Adafruit Huzzah32 Feather and Breakout Board:
   https://www.adafruit.com/product/3405
   https://www.adafruit.com/products/4172

 Adafruit invests time and resources providing this open source code,
 please support Adafruit and open-source hardware by purchasing
 products from Adafruit!

 Written by Tony DiCola for Adafruit Industries.
 Modified by Brent Rubell for Adafruit Industries
 MIT license, all text above must be included in any redistribution
 **********************************************************************/
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "DHT.h"
DHT dht;
/************************* WiFi Access Point *********************************/

#define WLAN_SSID "****ssid****"
#define WLAN_PASS "****pass****"

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  8883  // Using port 8883 for MQTTS
// Adafruit IO Account Configuration
// (to obtain these values, visit https://io.adafruit.com and click on Active Key)
#define AIO_USERNAME "aioname"
#define AIO_KEY      "724b81xxxxxxxxxxxxx61da2163bxxxx"

/************ Global State (you don't need to change this!) ******************/

WiFiClientSecure client;  // WiFiFlientSecure for SSL/TLS support

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

// io.adafruit.com root CA
const char* adafruitio_root_ca = \
   "-----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=\n" \
   "-----END CERTIFICATE-----\n";

/****************************** Feeds ***************************************/

// Setup a feed called 'test' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Publish humidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Humidity");
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Temperature");

/*************************** Sketch Code ************************************/
void setup() {
 Serial.begin(115200);
 delay(10);
 dht.setup(0); //Connect DHT11 Output to GPIO0 Pin of ESP32
 Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));

 // Connect to WiFi access point.
 Serial.println(); Serial.println();
 Serial.print("Connecting to ");
 Serial.println(WLAN_SSID);
 delay(1000);
 WiFi.begin(WLAN_SSID, WLAN_PASS);
 delay(2000);

 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }
 Serial.println();
 Serial.println("WiFi connected");
 Serial.println("IP address: "); Serial.println(WiFi.localIP());
 client.setCACert(adafruitio_root_ca);
}

void loop() {
 // Ensure the connection to the MQTT server is alive (this will make the first
 // connection and automatically reconnect when disconnected).  See the MQTT_connect
 // function definition further below.
 MQTT_connect();
 delay(dht.getMinimumSamplingPeriod()); /* Delay of amount equal to sampling period */
 float Humidity_Value = dht.getHumidity();/* Get humidity value */
 float Temperature_Value = dht.getTemperature();/* Get temperature value */

 if (! humidity.publish(Humidity_Value)) //Publish Humidity Reading!
 { 
   Serial.println(F("Failed"));
 } 
 else {
   Serial.print("Humidity Value = ");
   Serial.println(Humidity_Value);
 }
 
 if (! temperature.publish(Temperature_Value)) //Publish Temperature Reading!
 {
   Serial.println(F("Failed"));
 } 
 else {
   Serial.print("Temperature Value = ");
   Serial.println(Temperature_Value);
 }
 delay(2000);
}

// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
 int8_t ret;
 // Stop if already connected.
 if (mqtt.connected()) {
   return;
 }
 Serial.print("Connecting to MQTT... ");
 uint8_t retries = 3;
 while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
      Serial.println(mqtt.connectErrorString(ret));
      Serial.println("Retrying MQTT connection in 5 seconds...");
      mqtt.disconnect();
      delay(5000); // wait 5 seconds
      retries--;
      if (retries == 0) {
        while (1); // basically die and wait for WDT to reset me
      }
 }
 Serial.println("MQTT Connected!");
}

산출