이 게시물의 목적은 ESP8266을
CloudMQTT에서 호스팅되는 MQTT 브로커에 연결하는 방법을 설명하는 것입니다.
소개
프로토콜에 익숙하지 않은 경우 여기에서 자세히 읽을 수 있습니다 .
이 예제는 다른 브로커와 잘 작동해야 하지만 브로커가 CloudMQTT에서 호스팅된다고 가정합니다.
CloudMQTT에는 무료 요금제가 있으므로 계정을 만들고 테스트하기만 하면 됩니다.
계정을 설정하는 것은 정말 간단하며 이 게시물의 범위를 벗어납니다.
수행 방법 및 브로커 인스턴스 생성 방법은 여기에서 확인할 수 있습니다 .
절차를 완료한 후 그림 1에 표시된 것과 유사한 인스턴스 정보 페이지를 확인합니다. ESP8266 코드에서 사용할 중요한 자격 증명은 서버 , 사용자 , 암호 및 포트 입니다.
그림 1 – CloudMQTT 인스턴스 정보.
ESP8266 측에서는 PubSubClient라고 하는 ESP8266을 지원하는 MQTT를 사용할 것 입니다. 라이브러리는 Arduino IDE 라이브러리 관리자를 통해 설치할 수 있습니다. 여기에 표시된 코딩은 라이브러리에 제공된 예제를 기반으로 하므로 시도해 보시기 바랍니다.
하드웨어와 관련하여 이 자습서에 표시된 테스트는 ESP8266 NodeMCU 보드를 사용하여 수행되었습니다 .
코드
먼저 모든 기능에 필요한 라이브러리를 포함하는 것으로 시작합니다. ESP8266을 WiFi 네트워크에 연결하려면 ESP8266WiFi 라이브러리 가 필요하고 , MQTT 브로커에 연결하고 주제의 메시지를 게시/구독할 수 있게 해주는 PubSubClient 라이브러리가 필요합니다.
1 2 |
#include <ESP8266WiFi.h> #include <PubSubClient.h> |
그런 다음 연결에 대한 일부 전역 변수를 선언합니다. 당연히 WiFi 네트워크에 연결하려면 WiFi 자격 증명이 필요합니다. ESP8266을 사용하여 WiFi 네트워크에 연결하는 방법을 자세히 설명하는 이전 게시물을 여기 에서 확인할 수 있습니다 .
1 2 |
const char* ssid = "YourNetworkName"; const char* password = "YourNetworkPassword"; |
MQTT 서버의 정보와 자격 증명도 필요합니다. 소개에서 설명한 대로 서버 주소, 포트, 사용자 이름 및 암호를 알아야 합니다. 아래 변수에 값을 사용하십시오.
1 2 삼 4 |
const char* mqttServer = "m11.cloudmqtt.com"; const int mqttPort = 12948; const char* mqttUser = "YourMqttUser"; const char* mqttPassword = "YourMqttUserPassword"; |
그런 다음 특정 IP 및 포트 [1]에 대한 연결을 설정할 수 있는 WiFiClient 클래스의 개체를 선언합니다 . 또한 이전에 정의한 WiFiClient 생성자의 입력으로 받는 PubSubClient 클래스의 개체를 선언합니다 .
이 클래스의 생성자는 API 문서 에서 볼 수 있듯이 다른 수의 인수를 받을 수 있습니다 .
1 2 |
WiFiClient espClient; PubSubClient client(espClient); |
이제 설정 기능으로 이동하여 직렬 연결을 열어 프로그램 결과를 출력할 수 있습니다. 우리는 또한 WiFi 네트워크에 연결합니다.
1 2 삼 4 5 6 7 8 9 |
Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); |
다음으로 MQTT 서버의 주소와 포트를 지정해야 합니다. 이를 위해 PubSubClient 개체 에서 setServer 메서드를 호출하여 첫 번째 인수로 주소를 전달하고 두 번째로 포트를 전달합니다. 이러한 변수는 이전에 상수 문자열에서 정의되었습니다.
1 | client.setServer(mqttServer, mqttPort); |
그런 다음 동일한 객체에 대한 setCallback 메소드를 사용하여 MQTT 메시지가 수신될 때 실행되는 처리 기능을 지정합니다. 우리는 이 함수에 대한 코드를 나중에 분석할 것입니다.
1 | client.setCallback(callback); |
이제 설정 기능에 있는 MQTT 서버에 연결합니다. WiFi 네트워크에 연결할 때와 마찬가지로 성공할 때까지 루프에서 서버에 연결합니다.
따라서 PubSubClient에서 호출된 연결된 메서드 의 출력을 기반으로 while 루프를 수행 합니다. 연결이 설정되면 true를 반환하고 그렇지 않으면 false를 반환합니다.
실제 연결을 수행하기 위해 "ESP8266Client"라고 부를 클라이언트의 고유 식별자를 입력으로 수신 하는 연결 메소드와 초기에 정의한 인증 사용자 이름 및 비밀번호를 호출합니다. 연결이 성공하면 true를 반환하고 그렇지 않으면 false를 반환합니다.
실패할 경우 PubSubClient 개체 에서 상태 메서드를 호출할 수 있습니다 . 그러면 연결이 실패한 이유에 대한 정보가 포함된 코드가 반환됩니다[2]. 가능한 반환 값을 여기 에서 확인 하십시오 .
전체 연결 루프 아래에서 확인하십시오.
1 2 삼 4 5 6 7 8 9 10 11 12 13 14 15 |
while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266Client", mqttUser, mqttPassword )) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } |
설정 기능을 완료하기 위해 주제에 대한 메시지를 게시합니다. 그렇게 하기 위해 입력 인수로 주제와 메시지를 수신 하는 publish 메소드를 호출합니다 . 이 경우 "esp/test" 주제에 "Hello from ESP8266" 메시지를 게시합니다.
1 | client.publish("esp/test", "Hello from ESP8266"); |
그런 다음 동일한 주제를 구독하여 다른 게시자로부터 메시지를 받을 수 있습니다. 그렇게 하기 위해 subscribe 메소드를 호출 하여 주제의 이름을 입력으로 전달합니다.
1 | client.subscribe("esp/test"); |
전체 설정 기능은 아래에서 확인하세요.
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 |
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); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266Client", mqttUser, mqttPassword )) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } client.publish("esp/test", "Hello from ESP8266"); client.subscribe("esp/test"); } |
콜백 함수
초기화 후에 구독된 주제에 대한 수신 메시지를 처리할 콜백 함수를 지정해야 합니다.
이 함수의 인수는 주제 이름, 페이로드(바이트) 및 메시지 길이입니다. void를 반환해야 합니다.
이 함수에서는 먼저 토픽 이름을 직렬 포트에 인쇄한 다음 수신된 메시지의 각 바이트를 인쇄합니다. 우리는 또한 함수의 인수로 메시지의 길이를 가지고 있기 때문에 이것은 루프에서 쉽게 수행될 수 있습니다.
전체 기능 코드를 아래에서 확인하십시오.
1 2 삼 4 5 6 7 8 9 10 11 12 13 14 |
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("-----------------------"); } |
메인 루프
메인 루프 함수에서 우리는 PubSubClient 의 루프 메소드를 호출할 것 입니다. 클라이언트가 들어오는 메시지를 처리하고 서버에 대한 연결을 유지할 수 있도록 이 함수를 정기적으로 호출해야 합니다[2].
1 2 삼 |
void loop() { client.loop(); } |
아래의 전체 코드를 확인하세요
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <ESP8266WiFi.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 = "YourMqttUserPassword"; 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); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266Client", mqttUser, mqttPassword )) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } client.publish("esp/test", "Hello from ESP8266"); client.subscribe("esp/test"); } 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(); } |
코드 테스트
먼저 MQTT 서버가 실행 중인지 확인하십시오. 그런 다음 코드를 테스트하려면 업로드하고 ESP8266에서 실행하면 됩니다. 출력이 인쇄되도록 Arduino IDE 직렬 콘솔을 엽니다.
실행 시 ESP8266은 직렬에 인쇄되지 않는 "Hello from ESP8266" 메시지를 보냅니다. 그 후 ESP8266은 Hello 메시지가 전송된 동일한 주제를 구독합니다.
다른 생산자가 "esp/test" 주제에 메시지를 보내면 그림 2와 같이 직렬 콘솔에 인쇄됩니다.
그림 2 - "esp/test" 주제로 전송된 메시지.
이 자습서에서는 MQTT 브로커에 연결하고 MQTT 주제를 구독하고 게시할 수 있는 Google Chrome 애플리케이션인 MQTTlens를 사용 했습니다 [3]. 이것은 이러한 유형의 테스트에 정말 추천하는 매우 유용한 응용 프로그램입니다.
테스트를 위해 MQTTlens는 ESP8266을 연결하기 전에 "esp/test" 주제를 구독하고 있었습니다. 그림 3과 같이 "Hello from ESP8266" 메시지가 출력되었습니다. 그 후 MQTTlens에서 두 개의 Hello 메시지를 보냈는데, 이는 같은 그림에서 볼 수 있습니다. 보낸 메시지는 예상대로 ESP8266에서 수신한 그림 2에 표시된 메시지입니다.
그림 3 - MQTTlens로 프로그램 테스트.
'ESP32' 카테고리의 다른 글
ESP32: MicroPython support (0) | 2021.08.16 |
---|---|
ESP32 MicroPython: Connecting to a WiFi Network (0) | 2021.08.16 |
ESP32: Publishing messages to MQTT topic (0) | 2021.08.16 |
ESP32: Connecting to a WiFi network (0) | 2021.08.16 |
ESP32 Arduino: 인터럽트로 DHT22 센서 측정 얻기 (0) | 2021.08.15 |