이 게시물의 목적은 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에서 메시지 수신.
'ESP32' 카테고리의 다른 글
ESP32 MicroPython: Connecting to a WiFi Network (0) | 2021.08.16 |
---|---|
ESP8266: Connecting to MQTT broker (0) | 2021.08.16 |
ESP32: Connecting to a WiFi network (0) | 2021.08.16 |
ESP32 Arduino: 인터럽트로 DHT22 센서 측정 얻기 (0) | 2021.08.15 |
ESP32 아두이노: WebSerial (0) | 2021.08.14 |