15.2 aws & node red - sunbang123/Smart_device GitHub Wiki
Node-RED:
- ๋น์ฃผ์ผ ํ๋ก๊ทธ๋๋ฐ ํด๋ก์, IoT ํ๋ก์ ํธ ๋ฐ ์๋ํ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ์ฌ์ฉ๋จ.
- Node.js ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, ์ฌ์ฉ์๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํ๋ฆ(flow)์ ์์ฑํ๊ณ ์ ์ดํ ์ ์์.
- Node-RED๋ ๋ฏธ๋ฆฌ ์ ์๋ ๋ ธ๋(Node)๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค ๊ฐ์ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ตฌ์ถ
- ๋ฐ์ดํฐ๋ฅผ ๋ณํ, ์ฒ๋ฆฌ ๋ฐ ์ ์ฅํ ์ ์์.
- ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ , ์๋ฆผ์ ๋ณด๋ด๋ ๋ฑ์ ์์ ์ ์๋ํํ ์ ์์.
Node-RED์ AWS์ ์ฐ๊ด์ฑ:
- Node-RED๋ AWS์ IoT ์๋น์ค์ ์ฐ๋ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต.
- Node-RED๋ AWS IoT์ MQTT (Message Queuing Telemetry Transport) ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ IoT ์ฅ์น์ ํต์ ํจ.
- AWS์ ๋ค๋ฅธ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์.
- Node-RED๋ฅผ ์ฌ์ฉํ์ฌ ์ผ์์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , AWS IoT์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์์.
- AWS์ ๋ค๋ฅธ ์๋น์ค์ธ S3 (Simple Storage Service), DynamoDB, Lambda ๋ฑ๊ณผ ํตํฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์ฒ๋ฆฌํ๊ณ ์ํฌํ๋ก์ฐ๋ฅผ ์๋ํํ ์ ์์.
- ์ฌ๋ฌผ ์ ์ฑ ์ ์ถ๊ฐ.

- Node-RED ์คํ:
- ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ Node-RED๋ฅผ ์์.
$ node-red
"Started flows" ๋ฉ์์ง๊ฐ ํ์๋๋ฉด ๋ก์ปฌ์์ ์คํ ์ค์.
- Node-RED ์ ์:
- ๋ธ๋ผ์ฐ์ ์์ http://localhost:1880 ๋ก ์ ์.
- ๋ ธ๋ ์ถ๊ฐ:
๋ ธ๋ ๊ตฌ์ฑ

- Inject ๋ ธ๋ ์ค์ :

- MQTT Out ๋ ธ๋ ์ค์ :
- MQTT Out ๋ ธ๋

- MQTT Out broker ๋ ธ๋

- MQTT Out tls-config ๋ ธ๋

-
MQTT In ๋ ธ๋๋ ์ด์ ๊ฐ์ด ๋ฐฐ์น.
-
AWS์์ ์ฃผ์ ๊ตฌ๋ (Topic Subscribe)๋ฅผ ์ ํํ๊ณ ํด๋น ํ ํฝ์ ๊ตฌ๋ .

- Node-RED์์ ๋ฐํํ ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์์.

-
Node-RED ์ ์:
-
๋ ธ๋ ์ถ๊ฐ:
๋ ธ๋ ๊ตฌ์ฑ

- MQTT Out ๋ ธ๋ ์ค์ :
- topic์ esp32/pub์ผ๋ก ๋ฐ๊ฟ.
- function ๋ ธ๋ ์ค์ :
- humidity
msg.payload = msg.payload.humidity;
return msg;
- temperature
msg.payload = msg.payload.temperature;
return msg;
- ๊ฒฐ๊ณผ ํ์ธ
- Serial Monitor

- node-red debug

- node-red dashboard

#include "secrets.h"
#include <WiFiClientSecure.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <DHT.h>
#include <WiFi.h>
// AWS IoT ์ค์
#define AWS_IOT_PUBLISH_TOPIC "esp32/pub"
#define AWS_IOT_SUBSCRIBE_TOPIC "esp32/sub"
// DHT11 ์ผ์ ์ค์
#define DHT_PIN 13 // DHT11 ๋ฐ์ดํฐ ํ
#define DHT_TYPE DHT11 // DHT11 ์ผ์
WiFiClientSecure net;
MQTTClient client;
DHT dht(DHT_PIN, DHT_TYPE);
void connectAWS()
{
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
// Configure WiFiClientSecure to use the AWS IoT device credentials
net.setCACert(AWS_CERT_CA);
net.setCertificate(AWS_CERT_CRT);
net.setPrivateKey(AWS_CERT_PRIVATE);
// Connect to the MQTT broker on the AWS endpoint we defined earlier
client.begin(AWS_IOT_ENDPOINT, 8883, net);
// Create a message handler
client.onMessage(messageHandler);
Serial.print("Connecting to AWS IoT");
while (!client.connect(THINGNAME)) {
Serial.print(".");
delay(100);
}
if(!client.connected()){
Serial.println("AWS IoT Timeout!");
return;
}
// Subscribe to a topic
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
Serial.println("AWS IoT Connected!");
}
void publishMessage(float temperature, float humidity)
{
StaticJsonDocument<200> doc;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
char jsonBuffer[512];
serializeJson(doc, jsonBuffer);
client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}
void messageHandler(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
}
void setup() {
Serial.begin(9600);
connectAWS();
dht.begin();
}
void loop() {
// ์จ์ต๋ ๋ฐ์ดํฐ ์ฝ๊ธฐ
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
Serial.println(temperature);
Serial.println(humidity);
// ์จ์ต๋ ๋ฐ์ดํฐ๋ฅผ Node-RED๋ก ์ ์ก
// JSON ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ฌ MQTT ๋ฉ์์ง๋ก ์ ์ก
StaticJsonDocument<200> doc;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
char jsonBuffer[512];
serializeJson(doc, jsonBuffer);
client.publish("node-red/esp32-data", jsonBuffer); // Node-RED์์ subscribeํ ํ ํฝ์ "node-red/esp32-data"๋ก ์ง์
// AWS IoT์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ก
publishMessage(temperature, humidity);
// AWS IoT ํด๋ผ์ด์ธํธ ๋ฃจํ
client.loop();
delay(1000);
}
- ์ฑ๊ณต์ ์ผ๋ก ์ค์ต์ ๋๋ด๊ณ ์ง๋ ์๊ฐ์ ๋ฐฐ์ ๋ ๋ด์ฉ์ ์์ฉํด์ node-red ์ค์ต์ ํ ์ ์์ด์ ์ข์์.
- node-red์ ๊ฐ์ ์คํ์์ค ๋น์ฃผ์ผ ํ๋ก๊ทธ๋๋ฐ ํด ์ฌ์ฉ๋ฒ์ ์ตํ๊ณ mqtt์ mqtt๋ธ๋ก์ปค์ ๋ํด์ ๋ฐฐ์ธ ์ ์์์.