week__10 (MQTT) - JINEEH/SmartDevice_JinHee GitHub Wiki
1-1. MQTT๋ฅผ ํ์ฉํ IoT ์๋น์ค ๊ตฌ์ฑ
2-1. ๋ฐ์ดํฐ ์์ฑ -> ๋คํธ์ํฌ ์ฐ๊ฒฐ -> ๋ฐ์ดํฐ ์ฒ๋ฆฌ -> ์๋น์ค ์ ๊ณต
- ๋ฐ์ดํฐ ์์ฑ: ์ผ์ฑ(์ผ์๋ฅผ ํตํด ๋ฐ์ดํฐ ์์ง) ๊ณผ์ ์ ํตํด ๋์งํธ ๋ฐ์ดํฐ๋ก ๋ณํ, ์ ๋ฌ+์ ์ด์ ๊ธฐ๋ฅ
- ๋คํธ์ํฌ ์ฐ๊ฒฐ: ์ผ์ฑ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ณํ๋ ๋ฐ์ดํฐ๋ค์ ํต์ ๊ธฐ์ ์ ํตํด ๋ค๋ฅธ ๋๋ฐ์ด์ค or ์๋ฒ๋ก ์ ์ก
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ์ ์ก๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ถ์, ์ ๋ณด ์ถ์ถ
- ์๋น์ค ์ ๊ณต: ์ถ์ถ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์ฌ๋์ด๋ ๋ค๋ฅธ ์ฌ๋ฌผ์ด ์ด์ฉํ ์ ์๋๋ก ์๋น์ค๋ฅผ ์ ๊ณต, ๋ชฉ์ ์ ๋ฐ๋ผ ์ ์ ํ ์๋น์ค๋ฅผ ์ ๊ณต
3-1. ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์กฐ์ ํ์ฌ ๋ผ์ฐํ
๋ฐ ์ค๊ณ ์ญํ
- ๋ฉ์์ง ์์ ๋ฐ ํํฐ๋ง, ๊ฐ ๋ฉ์์ง๋ฅผ ๊ตฌ๋
ํ๋ ํด๋ผ์ด์ธํธ ์๋ณ, ๋ฉ์์ง ์ ์ก, MQTT ํด๋ผ์ด์ธํธ ๊ถํ ๋ถ์ฌ ๋ฐ ์ธ์ฆ, ๋๋ฝ๋ ๋ฉ์์ง ๋ฐ ํด๋ผ์ด์ธํธ ์ธ์
์ฒ๋ฆฌ
4-1. TCP/IP ํ๋กํ ์ฝ ์์์ ๋์ํ๋ ๋ฐํ-๊ตฌ๋
๊ธฐ๋ฐ์ ๋ฉ์์ง ํ๋กํ ์ฝ
- IoT ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์กํ ๋ ์ฌ์ฉ
4-2. ์ฅ์
- ๊ฐ๋ณ๊ณ ์์ ์์ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์๋ ํจ์จ์ ์ธ ์ฌ์ฉ ๊ฐ๋ฅ
- ํ์ฅ์ฑ์ด ์ข์ ์ฌ๋ฌ ๋๋ฐ์ด์ค์ ์ฐ๊ฒฐ ๊ฐ๋ฅ
- ์ ๋ขฐ์ฑ ๋ณด์ฅ
- ์์ฌ์ด ์ํธํ๋ก ๋ณด์ ๊ฐํ
- ๊ด๋ฒ์ํ ์ง์
4-3. ์๋ ์์
- ํด๋ผ์ด์ธํธ๊ฐ ๋ธ๋ก์ปค์ ์ฐ๊ฒฐ ์ค์
- ๋ธ๋ก์ปค์ ์ฐ๊ฒฐํ ํ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ๊ตฌ๋
๊ฐ๋ฅ
- ๋ธ๋ก์ปค๋ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ๋ฉ์์ง์ ๊ด์ฌ์๋ ๊ตฌ๋
์์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌ
4-4. ํค์๋
- ์ฃผ์ : ๋ธ๋ก์ปค๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ๋ฉ์์ง๋ฅผ ํํฐ๋ง, ํ์ผ ๋๋ ํด๋ ๋๋ ํฐ๋ฆฌ์ ์ ์ฌํ ๊ณ์ธต๊ตฌ์กฐ๋ก ์ ๋ ฌ
- ๊ฒ์: ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ๊ณผ์ , ๋ฐ์ดํฐ ํ์ ๊ฒฐ์
- ๊ตฌ๋
: ํด๋ผ์ด์ธํธ๋ ๋ธ๋ก์ปค์๊ฒ ๊ตฌ๋
์์ฌ๋ฅผ ๋ณด๋ด ๊ด์ฌ์๋ ์ฃผ์ ์ ๋ํ ๋ฉ์์ง๋ฅผ ์์
5-1. ์ด์ํ ์ผ์ ๊ฑฐ๋ฆฌ ์ธก์
- ์ค๋น๋ฌผ: ESP32, ESP32 ํ์ฅ ์ค๋, ์ด์ํ ์ผ์, ์ ํผ์ผ์ด๋ธ 4๊ฐ
- ์คํ์ฝ๋(6-1)
const int trigPin = 12; // ์ด์ํ ์ผ์์ ํธ๋ฆฌ๊ฑฐ ํ
const int echoPin = 14; // ์ด์ํ ์ผ์์ ์์ฝ ํ
long duration; // ์ํ์ ์๋ณต ์๊ฐ(๋ง์ดํฌ๋ก์ด)
float distanceCm; // ๊ฑฐ๋ฆฌ(cm)
float distanceInch; // ๊ฑฐ๋ฆฌ(์ธ์น)
void setup() {
Serial.begin(115200); // ์๋ฆฌ์ผ ํต์ ์์ (ํต์ ์๋: 115200bps)
pinMode(trigPin, OUTPUT); // ํธ๋ฆฌ๊ฑฐ ํ์ ์ถ๋ ฅ์ผ๋ก ์ค์
pinMode(echoPin, INPUT); // ์์ฝ ํ์ ์
๋ ฅ์ผ๋ก ์ค์
}
void loop() {
digitalWrite(trigPin, LOW); // ํธ๋ฆฌ๊ฑฐ ํ LOW๋ก ์ด๊ธฐํ
delayMicroseconds(2); // 2 ๋ง์ดํฌ๋ก์ด ๋๊ธฐ
digitalWrite(trigPin, HIGH); // ํธ๋ฆฌ๊ฑฐ ํ HIGH๋ก ์ค์ ํ์ฌ ์ด์ํ ์ก์
delayMicroseconds(10); // 10 ๋ง์ดํฌ๋ก์ด ๋์
digitalWrite(trigPin, LOW); // ์ด์ํ ์ก์ ์ข
๋ฃ
duration = pulseIn(echoPin, HIGH); // ์์ฝ ํ์์ ์ด์ํ์ ์๋ณต ์๊ฐ ์ธก์
distanceCm = duration * 0.034/2; // ๊ฑฐ๋ฆฌ ๊ณ์ฐ
distanceInch = distanceCm * 0.393701; // ์ธ์น๋ก ๋ณํ
Serial.print("Distance: ");
Serial.print(distanceCm); // ๊ฑฐ๋ฆฌ (cm)
Serial.print("(cm) ");
Serial.print(distanceInch); // ๊ฑฐ๋ฆฌ (์ธ์น)
Serial.println("(inch)");
delay(1000); // 1์ด ๋๊ธฐ
}
- ์คํ๊ฒฐ๊ณผ
5-2. ์ด์ํ ์ผ์๊ฐ Publish
- "PubSubClient" ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- ์คํ์ฝ๋(6-2)
#include <WiFi.h> //Wi-Fi ์ฐ๊ฒฐ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
#include <PubSubClient.h> //MQTT ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
// ๋ค์ ๋ณ์๋ค์ ๋น์ ์ SSID์ ๋น๋ฐ๋ฒํธ๋ก ๋์ฒดํ์ธ์.
const char* ssid = "zineeh"; // ์ฌ์ฉํ๋ WiFi ๋คํธ์ํฌ ์ด๋ฆ (SSID)
const char* password = "SMARTDEVICE0514"; // ์ฌ์ฉํ๋ WiFi ๋คํธ์ํฌ ๋น๋ฐ๋ฒํธ
const int trigPin = 12; // ์ด์ํ ์ผ์์ ํธ๋ฆฌ๊ฑฐ ํ
const int echoPin = 14; // ์ด์ํ ์ผ์์ ์์ฝ ํ
// MQTT ๋ธ๋ก์ปค IP ์ฃผ์๋ฅผ ์ฌ๊ธฐ์ ์
๋ ฅํ์ธ์ (์: "192.168.1.144")
const char* mqtt_server = "test.mosquitto.org";
const int mqttPort = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsgTime = 0;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqttPort);
pinMode(echoPin, INPUT); // ์์ฝ ํ์ ์
๋ ฅ์ผ๋ก ์ค์
// ํธ๋ฆฌ๊ฑฐ ํ ์ด๊ธฐํ
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
}
void setup_wifi() {
delay(10);
// Wi-Fi ๋คํธ์ํฌ์ ์ฐ๊ฒฐ ์์
Serial.println();
Serial.print("์ฐ๊ฒฐ ์ค์ธ Wi-Fi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wi-Fi ์ฐ๊ฒฐ๋จ");
Serial.println("IP ์ฃผ์: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// ์ฐ๊ฒฐ์ด ๋ ๋๊น์ง ๋ฐ๋ณต
while (!client.connected()) {
Serial.print("MQTT ์ฐ๊ฒฐ ์๋ ์ค...");
// ๋๋ค ํด๋ผ์ด์ธํธ ID ์์ฑ
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
Serial.print("ํด๋ผ์ด์ธํธ ID: ");
Serial.println(clientId);
// ์ฐ๊ฒฐ ์๋
if (client.connect(clientId.c_str())) {
Serial.println("์ฐ๊ฒฐ๋จ");
} else {
Serial.print("์คํจ, rc=");
Serial.print(client.state());
Serial.println(" 5์ด ํ ๋ค์ ์๋");
// 5์ด ๋๊ธฐ ํ ๋ค์ ์๋
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
// ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๋ฒ์ ์ฐ๊ฒฐ ์ ์ง
client.loop();
long now = millis();
if (now - lastMsgTime > 1000) { //1์ด ๊ฐ๊ฒฉ
lastMsgTime = now;
// ์ด์ํ ์ผ์ ๊ฐ์ ์ฝ์ด์ต๋๋ค.
float sensorValue = readUltrasonicSensor();
char sensorString[8];
dtostrf(sensorValue, 1, 2, sensorString);
client.publish("MQTT_24", sensorString);
}
}
float readUltrasonicSensor() {
// ํธ๋ฆฌ๊ฑฐ ํ์ 10 ๋ง์ดํฌ๋ก์ด ๋์ HIGH๋ก ์ค์ ํ์ฌ ์ด์ํ๋ฅผ ๋ฐ์ฌํฉ๋๋ค.
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// ์์ฝ ํ์์ ํ์ค์ ์ง์ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
pinMode(echoPin, INPUT);
float duration = pulseIn(echoPin, HIGH);
// ์๋ฆฌ์ ์๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.(343m/s๋ก ๊ฐ์ )
float distance = duration * 0.0343 / 2.0;
return distance;
}
- "IoT MQTT Panel" ์ฑ ์ค์น
- Port์ Network protocol ์ค์

- "ADD PANEL" ์ ํ

- "Text Log" ์ถ๊ฐ

- Panel name, Topic ์ค์
- ์คํ์ฝ๋์ Topic๊ณผ ์ผ์น์ํค๊ธฐ

- Panel ํฌ๊ธฐ ์กฐ์

- ์คํ ๊ฒฐ๊ณผ
10.6-2-2.mp4
6-1. ๋ฅ๋ ๋ถ์ ์ ์ด(1)
- ์ค๋น๋ฌผ: ESP32, ESP32 ํ์ฅ ์ค๋, ๋ฅ๋๋ถ์ , ์ ํผ์ผ์ด๋ธ 3๊ฐ
- ์คํ์ฝ๋(6-3)
const int buzzerPin = 2; //led ํ ๋ฒํธ ์ค์
void setup (){
pinMode (buzzerPin,OUTPUT );//buzzerPin ์ ์ถ๋ ฅ์ผ๋ก ์ค์
}
void loop (){
digitalWrite (buzzerPin, HIGH ); //buzzerPin ์ HIGH ๊ฐ ์ฐ๊ธฐ
delay (500 ); // 0.5 ์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ
digitalWrite (buzzerPin, LOW ); //buzzerPin ์ LOW ๊ฐ ์ฐ๊ธฐ
delay (1000 ); // 1 ์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ
}
- ์คํ ๊ฒฐ๊ณผ
10.6-3-1.mp4
6-2. ๋ฅ๋ ๋ถ์ Subcriber
- ์คํ ์ฝ๋(6-4)
#include <WiFi.h>
#include <PubSubClient.h>
// ๋ค์ ๋ณ์๋ค์ ๋น์ ์ SSID์ ๋น๋ฐ๋ฒํธ๋ก ๋์ฒดํ์ธ์.
const char* ssid = "zineeh";
const char* password = "SMARTDEVICE0514";
// MQTT ๋ธ๋ก์ปค IP ์ฃผ์๋ฅผ ์ฌ๊ธฐ์ ์
๋ ฅํ์ธ์ (์: "192.168.1.144")
const char* mqtt_server = "test.mosquitto.org";
const int mqttPort = 1883 ;
const char * mqttTopic = "MQTT_buzzer"; // ์ฌ์ฉ์์ ๋ง๊ฒ ๋ณ๊ฒฝ
const int buzzerPin = 2 ; // ๋ถ์ ์ ์ฐ๊ฒฐ๋ GPIO ํ ๋ฒํธ
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
// Wi-Fi ๋คํธ์ํฌ์ ์ฐ๊ฒฐ ์์
Serial.println();
Serial.print("์ฐ๊ฒฐ ์ค์ธ Wi-Fi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wi-Fi ์ฐ๊ฒฐ๋จ");
Serial.println("IP ์ฃผ์: ");
Serial.println(WiFi.localIP());
}
void setup(){
// ์๋ฆฌ์ผ ํต์ ์ด๊ธฐํ
Serial.begin(115200);
// Wi-Fi ์ฐ๊ฒฐ ์ค์
setup_wifi();
client.setServer(mqtt_server, mqttPort);
client.setCallback(callback);
// ๋ถ์ ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์
pinMode(buzzerPin,OUTPUT);
}
void loop(){
if(!client.connected()){
reconnect();
}
client.loop();//MQTT ํด๋ผ์ด์ธํธ๋ฅผ ์ ์งํ๊ธฐ ์ํด ํธ์ถ
}
void callback(char*topic , byte *payload , unsigned int length){
Serial.print("Receivedmessage: ");
Serial.print(topic);
Serial.print(" ");
for(int i = 0 ; i <length;i++){
Serial.print((char)payload[i]);
}
Serial.println();
if(strcmp(topic, mqttTopic)== 0){
if(payload[0] == '1'){
// ๋ถ์ ๋ฅผ ์ผ๋ ์ฝ๋ ์์ฑ
digitalWrite(buzzerPin, HIGH);
}else if(payload[0] == '0'){
// ๋ถ์ ๋ฅผ ๋๋ ์ฝ๋ ์์ฑ
digitalWrite(buzzerPin, LOW);
}
}
}
void reconnect(){
while(!client.connected()){
Serial.print("Connectingto MQTT Broker...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if(client.connect(clientId.c_str())){
Serial.println("Connected to MQTT Broker");
client.subscribe(mqttTopic);
}else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println("Retrying in 5 seconds...");
delay(5000);
}
}
}
- "IoT MQTT Panel" ์ฑ์์ ๋์๋ณด๋ ์ถ๊ฐ

- Switch panel ์ถ๊ฐ

- ์คํ์ฝ๋์ Topic๊ณผ ์ผ์น์ํค๊ธฐ
- switch icon ์ค์

- ์คํ ๊ฒฐ๊ณผ
KakaoTalk_20240514_210624586.mp4


8-1. CoAP(Constrained Application Protocol): IoT๋ฅผ ์ํ IPv6 ์์ ์์ฉ ํ๋กํ ์ฝ
- ์ ์ฝ์ด ์๋ ์ฅ์น๋ค์ ์ํ ํน์ํ ์ ํ๋ฆฌ์ผ์ด์
ํ๋กํ ์ฝ
- ๋น์ทํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ๋ ๋์ ์ธํฐ๋ท๊ณผ ํต์ ๊ฐ๋ฅ
- ๋๋ฐ์ด์ค๋ค์ ํต์ ์ ์ํด IETF์ CoRE ์ํน๊ทธ๋ฃน์์ ํ์คํํ ํ๋กํ ์ฝ
- , UDP์ ๋จ์ ์ ๋ณด์ํ ํต์ ํ๋กํ ์ฝ
8-2. ์ง๊ทธ๋น(ZigBee): ์ ์, ์ ๋น์ฉ, ์ ์ ๋ ฅ์ ๋ฌด์ ๋ง์ ์ํ ๊ธฐ์ ๋ก ์๋ฐฉํฅ ๋ฌด์ ๊ฐ์ธ ์์ญ ํต์ ๋ง์ ์ญํ ์ ํจ
8-3. ๋ก๋ผ(LoRa): LPWA ๋คํธ์ํฌ ๊ธฐ์ ๋ฒ์ฃผ์ ์ํ๋ ๋ฌด์ LAN ๋คํธ์ํฌ์ฉ ๋ฌด์ ๋ณ์กฐ ๊ธฐ์
- ์ฌ๋ฌผ์ธํฐ๋ท ํต์ ์ ์ํด ๋ง๋ค์ด์ง ์ ์ ๋ ฅ ํต์ ๋ณ์กฐ ๊ธฐ์
8-4. IEEE(Institute of Electrical and Electronics Engineers): ์ ์๊ธฐ์ ๋ฐ ๊ณผํ์ ๊ฐ๋ฐ๊ณผ ํ์ฉ์ ์ด์งํ๋ ์ ๊ธฐ์ ์ํํ
- ChatGPT ์ฌ์ฉํ์ฌ IEEE์ ์ ๋ณด ํ์ธ