14.2 AWS - sunbang123/Smart_device GitHub Wiki
- AWS
- AWS๋?
- AWS์ MQTT ๋ธ๋ก์ปค
- ๊ฐ๋ ๋ฐ ๊ตฌ์ฑ๋
- ์ฌ์ฉ๋ ๊ฐ๋
- ์ค์ต ์์
- ๋๋์
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์ ํต์ .
- AWS ๊ณ์ ๋ฐ AWS IoT ์ค์ :
AWS ๊ณ์ ์ ๋ก๊ทธ์ธํ๊ณ AWS IoT ์ฝ์๋ก ์ด๋. "์ฌ๋ฌผ"์ ์ ํํ๊ณ "์ฌ๋ฌผ ๋ฑ๋ก"์ ํด๋ฆญํ์ฌ ์ ์ฌ๋ฌผ์ ๋ฑ๋ก. ์ฌ๋ฌผ ๋ฑ๋ก์ด ์๋ฃ๋๋ฉด "์ธ์ฆ์" ํญ์์ "์ธ์ฆ์ ์์ฑ"์ ํด๋ฆญํ์ฌ ์ฌ๋ฌผ ์ธ์ฆ์๋ฅผ ์์ฑ. ์ธ์ฆ์๋ฅผ ๋ค์ด๋ก๋ํ๊ณ , "์ฌ๋ฌผ ์ ์ฑ " ํญ์์ "์ฌ๋ฌผ ์ ์ฑ ์์ฑ"์ ํด๋ฆญํ์ฌ ์ฌ๋ฌผ ์ ์ฑ ์ ์์ฑ. ์ฌ๋ฌผ ์ ์ฑ ์๋ "๊ฒ์" ๋ฐ "๊ตฌ๋ " ๊ถํ์ด ํฌํจ. ์ฌ๋ฌผ ์ ์ฑ ์ ์ฌ๋ฌผ์ ์ฐ๊ฒฐ.
- Arduino IDE ์ค์ :
Arduino IDE๋ฅผ ์ด๊ณ "ํด" ๋ฉ๋ด์์ "๋ณด๋"๋ฅผ ์ ํํ๊ณ "ESP32 Dev Module"์ ์ ํ. "ํด" ๋ฉ๋ด์์ "์ค์ผ์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจํ๊ธฐ"๋ฅผ ์ ํํ๊ณ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฒ์ํ์ฌ ์ค์น. WiFiClientSecure, MQTTClient, ArduinoJson
- ์ฝ๋ ์์ :
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)์ ์์ .
- ESP32์ ์ ๋ก๋:
ESP32 ๋ณด๋์ ์ปดํจํฐ๋ฅผ ์ฐ๊ฒฐํ๊ณ , ๋ณด๋๋ฅผ ์ ํํ ํ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ESP32์ ์ ๋ก๋. ์๋ฆฌ์ผ ๋ชจ๋ํฐ๋ฅผ ์ด๊ณ ์ ์ก ์๋๋ฅผ 9600์ผ๋ก ์ค์ .
- ๊ฒฐ๊ณผ ํ์ธ:
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์ ๋ํ ๊ฐ๋ ์ ์ ๋ฆฝํ ์ ์์์.