15.2 aws & node red - sunbang123/Smart_device GitHub Wiki

์‹ค์Šต ๋ณด๊ณ ์„œ

node-red

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 ๋“ฑ๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ์ฒ˜๋ฆฌํ•˜๊ณ  ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Œ.

์‹ค์Šต 1 : aws & node-red

์‹ค์Šต ์ˆœ์„œ

aws

  1. ์‚ฌ๋ฌผ ์ •์ฑ…์„ ์ถ”๊ฐ€.

node-red

  1. Node-RED ์‹คํ–‰:
  • ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Node-RED๋ฅผ ์‹œ์ž‘.
$ node-red

"Started flows" ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋กœ์ปฌ์—์„œ ์‹คํ–‰ ์ค‘์ž„.

  1. Node-RED ์ ‘์†:
  1. ๋…ธ๋“œ ์ถ”๊ฐ€:

๋…ธ๋“œ ๊ตฌ์„ฑ

  1. Inject ๋…ธ๋“œ ์„ค์ •:
  1. MQTT Out ๋…ธ๋“œ ์„ค์ •:
  • MQTT Out ๋…ธ๋“œ
  • MQTT Out broker ๋…ธ๋“œ
  • MQTT Out tls-config ๋…ธ๋“œ
  1. MQTT In ๋…ธ๋“œ๋„ ์ด์™€ ๊ฐ™์ด ๋ฐฐ์น˜.

  2. AWS์—์„œ ์ฃผ์ œ ๊ตฌ๋…(Topic Subscribe)๋ฅผ ์„ ํƒํ•˜๊ณ  ํ•ด๋‹น ํ† ํ”ฝ์„ ๊ตฌ๋….

  1. Node-RED์—์„œ ๋ฐœํ–‰ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

์‹ค์Šต 2 : ์˜จ์Šต๋„๊ฐ’ AWS mqtt & Node-RED ์ถœ๋ ฅ

node-red

  1. Node-RED ์ ‘์†:

  2. ๋…ธ๋“œ ์ถ”๊ฐ€:

๋…ธ๋“œ ๊ตฌ์„ฑ

  1. MQTT Out ๋…ธ๋“œ ์„ค์ •:
  • topic์„ esp32/pub์œผ๋กœ ๋ฐ”๊ฟˆ.
  1. function ๋…ธ๋“œ ์„ค์ •:
  • humidity
msg.payload = msg.payload.humidity;
return msg;
  • temperature
msg.payload = msg.payload.temperature;
return msg;
  1. ๊ฒฐ๊ณผ ํ™•์ธ
  • 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๋ธŒ๋กœ์ปค์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ์Œ.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ