ESP32

ESP32: Publishing messages to MQTT topic

기하 2021. 8. 16. 03:30

이 게시물의 목적은 ESP32 및 Arduino IDE 라이브러리를 사용하여

MQTT 주제에 메시지를 게시하는 방법을 설명하는 것입니다.

소개

브로커가 MQTT에 대한 이전 자습서 에서 사용한 호스트인 CloudMQTT 에서 호스팅된다고 가정합니다 . CloudMQTT에는 무료 요금제가 있으므로 계정을 만들고 테스트하기만 하면 됩니다. 계정 설정은 정말 간단합니다. 수행 방법 및 브로커 인스턴스 생성 방법은 여기에서 확인할 수 있습니다 .

절차를 완료한 후 그림 1에 표시된 것과 유사한 인스턴스 정보 페이지를 확인합니다. ESP32 코드에서 사용할 중요한 자격 증명은 서버 , 사용자 , 암호  포트 입니다.

그림 1 – CloudMQTT 인스턴스 정보.

ESP32면, 우리는라는 MQTT 라이브러리 사용하려고 PubSubClient을 . 이것은 ESP8266을 MQTT 브로커에 연결하는 방법 에 대한 이전 자습서 에서 사용된 것과 동일한 라이브러리 입니다. 작성 당시에는 ESP32에 대한 지원이 언급되지 않았지만 여기에서 볼 수 있듯이 라이브러리는 잘 작동합니다.

평소와 같이 라이브러리를 설치하는 가장 쉬운 방법은 그림 2에서 볼 수 있듯이 Arduino IDE 라이브러리 관리자를 사용하는 것입니다.

그림 2 – Arduino IDE 라이브러리 관리자를 통한 PubSub 라이브러리 설치.


코드

MQTT 브로커에 연결하고 주제에 메시지를 게시하는 데 필요한 코드는 ESP8266 게시물에 사용된 것과 매우 유사합니다. ESP32에 코드를 재사용할 수 있어 애플리케이션을 더 쉽게 이식할 수 있기 때문에 이는 좋은 소식입니다.

평소와 같이 코드에 일부 라이브러리를 포함해야 합니다. ESP32를 WiFi 네트워크에 연결하려면 WiFi 라이브러리 가 필요하고 MQTT 브로커에 연결할 수 있는 PubSubClient 라이브러리가 필요합니다. ESP32를 WiFi 네트워크에 연결하는 방법에 대한 자세한 설명은 여기를 확인 하십시오 .

수정하고 읽기 쉬운 코드를 만들기 위해 전역 변수에 WiFi 네트워크와 MQTT 브로커 모두에 연결하는 데 필요한 자격 증명과 정보를 선언합니다. MQTT 브로커에 연결하려면 소개 섹션의 그림 1과 같이 인스턴스 정보 페이지에서 얻을 수 있는 서버 주소, 포트, 사용자 이름 및 비밀번호가 필요합니다.

1
2

4
5
6
7
8
9
#include <WiFi.h>
#include <PubSubClient.h>


const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
const char* mqttServer = "m11.cloudmqtt.com";
const int mqttPort = 12948;
const char* mqttUser = "yourMQTTuser";
const char* mqttPassword = "yourMQTTpassword";

그런 다음 정의된 IP 및 포트에 대한 연결을 설정할 수 있는 WiFiClient 클래스의 개체를 선언합니다 . 그럼에도 불구하고 이 객체는 내부의 MQTT 라이브러리에서 사용되기 때문에 명시적으로 사용하지 않습니다.

또한 PubSubClient 클래스의 개체를 선언  하고 이전에 정의된 WiFiClient 생성자의 입력으로 전달합니다.

1
2
WiFiClient espClient;
PubSubClient client(espClient);

평소와 같이 설정 기능에서 직렬 연결을 엽니다. 이것이 프로그램 결과를 출력하는 가장 쉬운 방법이기 때문입니다. 또한 WiFi 네트워크에 연결하여 MQTT 브로커에 도달하고 주제에 메시지를 게시할 수 있습니다.

1
2

4
5
6
7
8
9
Serial.begin(115200);
WiFi.begin(ssid, password);


while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
}


Serial.println("Connected to the WiFi network");

다음으로 이전에 전역 변수에 선언된 MQTT 서버의 주소와 포트를 지정해야 합니다. 이를 위해  주소와 포트를 매개변수로 수신하는 PubSubClient 개체 에서 setServer 메서드를 호출합니다 .

그런 다음 MQTT 서버에 연결합니다. 실제 연결을 수행하기 위해 클라이언트의 고유 식별자인 인증 사용자 이름 및 비밀번호를 입력 매개변수로 전달 하여 연결 메소드를 호출 합니다. 식별자 "ESP32Client"로 사용합니다.

이 메서드 호출은 연결이 성공하면 true를 반환하고 그렇지 않으면 false를 반환합니다.

1
2

4
5
6
7
8
9
10
11
12
13
14
15
16
17
client.setServer(mqttServer, mqttPort);


while (!client.connected()) {
    Serial.println("Connecting to MQTT...");


    if (client.connect("ESP32Client", mqttUser, mqttPassword )) {


      Serial.println("connected"); 


    } else {


      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);


    }
}

이전 코드에서는 두 가지 보조 방법을 사용했습니다. 연결된 연결이 달리 설정 또는 false 경우 메소드는 true를 돌려줍니다. 상태 방법은 연결이 실패한 이유에 대한 정보가있는 코드를 반환합니다. 가능한 반환 값을 여기 에서 확인 하십시오 .

마지막으로 주제에 대한 메시지를 게시합니다. 이를 위해 publish 메소드를 호출 하여 주제 이름과 게시할 메시지를 입력 매개변수로 전달합니다. "esp/test" 주제에 대해 "Hello from ESP32" 메시지를 게시할 것입니다.

1 client.publish("esp/test", "Hello from ESP32");

이미 메인 루프 기능이 포함된 전체 소스 코드를 아래에서 확인하십시오. 여기 에서 PubSubClient  루프 메서드를 호출합니다 . 이 메소드는 메시지 수신과 브로커와의 연결을 유지하기 위해 정기적으로 호출되어야 합니다. 당연히 우리의 경우 주제에 대한 메시지를 게시하기만 하고 더 이상 아무것도 하지 않을 것이므로 예제로 포함합니다.

1
2

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <WiFi.h>
#include <PubSubClient.h>


const char* ssid = "yourNetworkName";
const char* password =  "yourNetworkPassword";
const char* mqttServer = "m11.cloudmqtt.com";
const int mqttPort = 12948;
const char* mqttUser = "yourMQTTuser";
const char* mqttPassword = "yourMQTTpassword";


WiFiClient espClient;
PubSubClient client(espClient);


void setup() {


  Serial.begin(115200);
  WiFi.begin(ssid, password);


  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }


  Serial.println("Connected to the WiFi network");


  client.setServer(mqttServer, mqttPort);


  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");


    if (client.connect("ESP32Client", mqttUser, mqttPassword )) {


      Serial.println("connected");


    } else {


      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);


    }
  }


  client.publish("esp/test", "Hello from ESP32");


}


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


코드 테스트

코드를 테스트 하기 위해 MQTT 주제를 구독하고 게시된 메시지를 수신할 수 있는 MQTTLens 라는 애플리케이션을 사용할 것입니다. 따라서 애플리케이션을 열고 ESP32 코드에서 지정한 "esp/test" 주제를 구독합니다.

그런 다음 ESP32에서 코드를 업로드하고 실행하기만 하면 됩니다. Arduino IDE 직렬 모니터에서 그림 3과 유사한 결과를 얻을 수 있습니다.

그림 3 - ESP32의 MQTT 브로커에 대한 연결.

MQTTLens 측에서는 그림 4와 같이 주제에 게시된 메시지를 수신해야 합니다.

그림 4 - MQTTLens에서 메시지 수신.