14.2 AWS - sunbang123/Smart_device GitHub Wiki

๋ณด๊ณ ์„œ

๋ชฉ์ฐจ

  1. AWS
  • AWS๋ž€?
  • AWS์˜ MQTT ๋ธŒ๋กœ์ปค
  1. ๊ฐœ๋… ๋ฐ ๊ตฌ์„ฑ๋„
  • ์‚ฌ์šฉ๋œ ๊ฐœ๋…
  1. ์‹ค์Šต ์˜ˆ์‹œ
  2. ๋Š๋‚€์ 

AWS

AWS๋ž€?

  • AWS(Amazon Web Services)๋Š” ์•„๋งˆ์กด๋‹ท์ปด์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ํ”Œ๋žซํผ.
  • AWS๋Š” ๋‹ค์–‘ํ•œ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ด ์ค‘ ํ•˜๋‚˜์ธ AWS IoT๋Š” ์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท(IoT) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์™„์ „ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค์ž„.

AWS์˜ MQTT ๋ธŒ๋กœ์ปค

  • AWS์—์„œ ์ œ๊ณตํ•˜๋Š” MQTT ๋ธŒ๋กœ์ปค๋Š” AWS IoT Core๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ.
  • AWS IoT Core๋Š” MQTT๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜• MQTT ๋ธŒ๋กœ์ปค๋ฅผ ์ œ๊ณต.
  • AWS IoT Core MQTT ๋ธŒ๋กœ์ปค๋Š” ์ธ์ฆ๊ณผ ๋ณด์•ˆ์„ ์œ„ํ•ด X.509 ๋””์ง€ํ„ธ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•จ.
  • AWS IAM(Identity and Access Management)์„ ํ†ตํ•ด ๋””๋ฐ”์ด์Šค ๋ฐ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

๊ฐœ๋… ๋ฐ ๊ตฌ์„ฑ๋„

์‚ฌ์šฉ๋œ ๊ฐœ๋…

AWS IoT: AWS IoT๋Š” ์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท(IoT) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์™„์ „ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค. ์ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์น˜์™€์˜ ํ†ต์‹ , ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘, ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง, ์›๊ฒฉ ์ œ์–ด ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ.

AWS IoT Thing: AWS IoT Thing์€ AWS IoT์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์ƒ์˜ ์‚ฌ๋ฌผ ๋˜๋Š” ์žฅ์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ„. ์‚ฌ๋ฌผ์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ์†์„ฑ, ๋™์ž‘ ๋ฐ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๊ณ  AWS IoT์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

์ธ์ฆ์„œ: AWS IoT์— ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋””์ง€ํ„ธ ์ธ์ฆ์„œ. ์ธ์ฆ์„œ๋Š” ์žฅ์น˜๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ†ต์‹ ์„ ๋ณด์•ˆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ. ์ฝ”๋“œ์—์„œ๋Š” AWS IoT์— ์—ฐ๊ฒฐํ•  ๋•Œ ํ•„์š”ํ•œ ์ธ์ฆ์„œ์™€ ๊ฐœ์ธ ํ‚ค๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Œ.

ํ† ํ”ฝ(Topic): MQTT ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ AWS IoT์™€ ํ†ต์‹ ํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” ์ฃผ์ œ๋ฅผ ๋‚˜ํƒ€๋ƒ„. ์ฝ”๋“œ์—์„œ๋Š” AWS_IOT_PUBLISH_TOPIC๊ณผ AWS_IOT_SUBSCRIBE_TOPIC์œผ๋กœ ์ •์˜๋œ ํ† ํ”ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์ˆ˜์‹ .

MQTT(MQ Telemetry Transport): MQTT๋Š” ๊ฒฝ๋Ÿ‰ ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ๋กœ, ์ œํ•œ๋œ ๋Œ€์—ญํญ ๋˜๋Š” ๋ถˆ์•ˆ์ •ํ•œ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋„ ์‹ ๋ขฐ์„ฑ ์žˆ๊ณ  ํšจ์œจ์ ์ธ ํ†ต์‹ ์„ ์ œ๊ณต. ์ฝ”๋“œ์—์„œ๋Š” MQTTClient ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MQTT ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ AWS IoT์™€ ํ†ต์‹ .


์‹ค์Šต ์˜ˆ์‹œ

์ˆœ์„œ

  1. AWS ๊ณ„์ • ๋ฐ AWS IoT ์„ค์ •:

AWS ๊ณ„์ •์— ๋กœ๊ทธ์ธํ•˜๊ณ  AWS IoT ์ฝ˜์†”๋กœ ์ด๋™. "์‚ฌ๋ฌผ"์„ ์„ ํƒํ•˜๊ณ  "์‚ฌ๋ฌผ ๋“ฑ๋ก"์„ ํด๋ฆญํ•˜์—ฌ ์ƒˆ ์‚ฌ๋ฌผ์„ ๋“ฑ๋ก. ์‚ฌ๋ฌผ ๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜๋ฉด "์ธ์ฆ์„œ" ํƒญ์—์„œ "์ธ์ฆ์„œ ์ƒ์„ฑ"์„ ํด๋ฆญํ•˜์—ฌ ์‚ฌ๋ฌผ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑ. ์ธ์ฆ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , "์‚ฌ๋ฌผ ์ •์ฑ…" ํƒญ์—์„œ "์‚ฌ๋ฌผ ์ •์ฑ… ์ƒ์„ฑ"์„ ํด๋ฆญํ•˜์—ฌ ์‚ฌ๋ฌผ ์ •์ฑ…์„ ์ƒ์„ฑ. ์‚ฌ๋ฌผ ์ •์ฑ…์—๋Š” "๊ฒŒ์‹œ" ๋ฐ "๊ตฌ๋…" ๊ถŒํ•œ์ด ํฌํ•จ. ์‚ฌ๋ฌผ ์ •์ฑ…์„ ์‚ฌ๋ฌผ์— ์—ฐ๊ฒฐ.

  1. Arduino IDE ์„ค์ •:

Arduino IDE๋ฅผ ์—ด๊ณ  "ํˆด" ๋ฉ”๋‰ด์—์„œ "๋ณด๋“œ"๋ฅผ ์„ ํƒํ•˜๊ณ  "ESP32 Dev Module"์„ ์„ ํƒ. "ํˆด" ๋ฉ”๋‰ด์—์„œ "์Šค์ผ€์น˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํ•จํ•˜๊ธฐ"๋ฅผ ์„ ํƒํ•˜๊ณ  ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์น˜. WiFiClientSecure, MQTTClient, ArduinoJson

  1. ์ฝ”๋“œ ์ˆ˜์ •:

WIFI_SSID์™€ WIFI_PASSWORD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Wi-Fi ๋„คํŠธ์›Œํฌ์— ๋งž๊ฒŒ ์ˆ˜์ •. AWS_IOT_ENDPOINT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” AWS IoT ์—”๋“œํฌ์ธํŠธ๋กœ ์ˆ˜์ •. AWS ์ธ์ฆ์„œ ๋ฐ ๊ฐœ์ธ ํ‚ค๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— ์ €์žฅํ•˜๊ณ  net.setCACert(), net.setCertificate(), net.setPrivateKey()์— ๊ฒฝ๋กœ๋ฅผ ์„ค์ •. ํ•„์š”์— ๋”ฐ๋ผ ๊ฒŒ์‹œ ๋ฐ ๊ตฌ๋… ํ† ํ”ฝ(AWS_IOT_PUBLISH_TOPIC, AWS_IOT_SUBSCRIBE_TOPIC)์„ ์ˆ˜์ •.

  1. ESP32์— ์—…๋กœ๋“œ:

ESP32 ๋ณด๋“œ์™€ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ , ๋ณด๋“œ๋ฅผ ์„ ํƒํ•œ ํ›„ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ESP32์— ์—…๋กœ๋“œ. ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์—ด๊ณ  ์ „์†ก ์†๋„๋ฅผ 9600์œผ๋กœ ์„ค์ •.

  1. ๊ฒฐ๊ณผ ํ™•์ธ:

ESP32๊ฐ€ Wi-Fi์— ์—ฐ๊ฒฐ๋˜๋ฉด ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ์— "Connecting to Wi-Fi"์™€ "."์˜ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํ‘œ์‹œ. Wi-Fi ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•˜๋ฉด "Connecting to AWS IoT"๊ฐ€ ํ‘œ์‹œ. AWS IoT ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•˜๋ฉด "AWS IoT Connected!"๊ฐ€ ํ‘œ์‹œ. ์„ผ์„œ ๋ฐ์ดํ„ฐ๋Š” publishMessage() ํ•จ์ˆ˜์—์„œ JSON ํ˜•์‹์œผ๋กœ ์ƒ์„ฑ


์ฝ”๋“œ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

#include <pgmspace.h>
#include "secrets.h"
#include <WiFiClientSecure.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include "WiFi.h"

MQTT ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฒŒ์‹œ(publish) ๋ฐ ๊ตฌ๋…(subscribe)ํ•  MQTT ํ† ํ”ฝ์„ ์ •์˜

#define SECRET
#define THINGNAME "Mtest"
// The MQTT topics that this device should publish/subscribe
#define AWS_IOT_PUBLISH_TOPIC   "outTopic"
#define AWS_IOT_SUBSCRIBE_TOPIC "inTopic"

WiFiClientSecure ์ธ์Šคํ„ด์Šค net๊ณผ MQTTClient ์ธ์Šคํ„ด์Šค client๋ฅผ ์ƒ์„ฑ

WiFiClientSecure net = WiFiClientSecure();
MQTTClient client = MQTTClient(256);
const char WIFI_SSID[] = "i2r";
const char WIFI_PASSWORD[] = "00000000";
const char AWS_IOT_ENDPOINT[] = "*****************.iot.us-east-2.amazonaws.com";
void connectAWS()
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  
  // Wi-Fi ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  // Wi-Fi๊ฐ€ ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  // Configure WiFiClientSecure to use the AWS IoT device credentials
  net.setCACert(AWS_CERT_CA);
  net.setCertificate(AWS_CERT_CRT);
  net.setPrivateKey(AWS_CERT_PRIVATE);
  
  // AWS IoT์˜ ์žฅ์น˜ ์ธ์ฆ์„œ์™€ ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WiFiClientSecure๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  // MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  client.begin(AWS_IOT_ENDPOINT, 8883, net);

  // Create a message handler
  client.onMessage(messageHandler);
  
  // ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  // AWS IoT์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  while (!client.connect(THINGNAME)) {
    delay(100);
  }
  
  // AWS IoT์— ์—ฐ๊ฒฐ๋˜๋ฉด ๊ตฌ๋…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
}

void publishMessage()
{
  // ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  StaticJsonDocument<200> doc;
  doc["time"] = millis();
  doc["sensor_a0"] = analogRead(0);
  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer); // print to client

  client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}

void messageHandler(String &topic, String &payload) {
  Serial.println("incoming: " + topic + " - " + payload);

//  StaticJsonDocument<200> doc;
//  deserializeJson(doc, payload);
//  const char* message = doc["message"];
}

void setup() {
  Serial.begin(9600);
  connectAWS();
}

void loop() {
  publishMessage();
  client.loop();
  delay(1000);
}

์ฝ”๋“œ ์ถœ์ฒ˜: https://github.com/kdi6033/cloud/blob/master/6-2-0%20aws%20ESP32%20Mqtt/AWS_ESP32/AWS_ESP32.ino


๋Š๋‚€์ 

  • ๋””๋ฐ”์ด์Šค์—์„œ MQTT ํ†ต์‹  ๋ฐฉ๋ฒ•์œผ๋กœ ๋ธŒ๋กœ์ปค์—์„œ ์š”๊ตฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์— ๋งž์ถฐ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š”๋ฐ์— ํ•„์š”ํ•œ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋จ.
  • ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ „์ž์ƒ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์ธ ์•„๋งˆ์กด์ด ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ์›น ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋จ.
  • ์•„๋งˆ์กด์—์„œ ์‚ฌ์šฉํ•˜๋Š” MQTT ๋ธŒ๋กœ์ปค์ธ AWS IoT Core์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ ๋ฆฝํ•  ์ˆ˜ ์žˆ์—ˆ์Œ.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ