week_8 (IP&DNS) - JINEEH/SmartDevice_JinHee GitHub Wiki
1-1. ์น์๋ฒ ์ดํด๋ฅผ ๋ชฉํ๋ก ์ธํฐ๋ท๊ณผ ์๊ฐ์๋ฒ์ ๊ด๋ จ๋ ํ์ต ์งํ
2-1. ์ธํฐ๋ท: ์ธํฐ๋ท ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์ ์ธ๊ณ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์ปดํจํฐ ๋คํธ์ํฌ ํต์
2-2. IP์ฃผ์(Internet Protocol address): ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋ ๊ธฐ๊ธฐ(์ปดํจํฐ)๋ฅผ ์๋ณํ๋ ๊ณ ์ ๋ฒํธ
2-3. IPv4: 32๋นํธ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ฝ 43์ต๊ฐ์ ์ฃผ์๊ฐ ํ ๋น ๊ฐ๋ฅํ๋ ์๋๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ถ์กฑํด์ง
- 0.0.0.0~255.255.255.255 ๋ก ์ด๋ฃจ์ด์ง
3-1. ์๋ฏธ: ์ธํฐ๋ท์์ ์น์ฌ์ดํธ๋ฅผ ์ฐพ์ ์ ์๋ ์ฃผ์์ด๋ฉฐ ์ฌ๋์ด ํธ๋ฆฌํ๊ฒ ์ ์ํ ์ ์๋๋ก ๋์์ ์ค
3-2. ์ฌ๋์๊ฒ ํธ๋ฆฌ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ ์ค์ ์ปดํจํฐ๋ IP์ฃผ์๋ฅผ ํตํด ์ฐ๊ฒฐํจ
3-3. DNS(Domain Name System): ๋คํธ์ํฌ์์ ์ฌ์ฉ๋๋ ๋ค์ ์๋น์ค์ ๊ตฌ์กฐ๋ก ๋๋ฉ์ธ์ฃผ์๋ฅผ IP์ฃผ์๋ก ํด์ํ์ฌ ์ปดํจํฐ๊ฐ ์ธ์ํ ์ ์๋๋ก ํ๋ ์์คํ
4-1. 128๋นํธ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๋ฌดํ๋์ ๊ฐ๊น์ด IP์ฃผ์ ํ ๋น์ด ๊ฐ๋ฅํ์ฌ IPv4์ ์ฃผ์ ๊ณ ๊ฐ์ ํด๊ฒฐํ ์ ์๋ ์๋ก์ด ๋ฐฉ์
4-2. IP์ฃผ์๋ฅผ ์๋์ผ๋ก ์ค์ ํ๋ IPv4์ ๋ค๋ฅด๊ฒ ๋คํธ์ํฌ์ ์ ์ํ๋ ๋์์ ์๋์ ์ผ๋ก ๋คํธ์ํฌ ์ฃผ์๋ฅผ ํ ๋น๋ฐ์
4-3. ๊ธฐ์กด 64KB์์ ์ ํ์์ด ํฐ ํฌ๊ธฐ์ ํจํท์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ํจํท ํฌ๊ธฐ๊ฐ ํ์ฅ๋จ
5-1. ์์ ์ IP์ฃผ์๋ฅผ ํ์ธํ ํ <IP์ฃผ์ + /index.php>


5-2. ์ฌ์คIP ์ฌ์ฉ์ ์ ์์ ์ธ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํจ
6-1. ์๋ฏธ: ๋์ ํธ์คํธ ์ค์ ํต์ ๊ท์ฝ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ IP์ฃผ์๊ฐ ์ ์ํ ๋๋ง๋ค ์๋กญ๊ฒ ๋ฐ๋๋ ๋ฐฉ์
6-2. ํจ๊ณผ: IP์ฃผ์๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ IP ๊ณ ๊ฐ์ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ์ ์ค ํ๋์
6-3. ํน์ IP์ฃผ์๋ฅผ ๋
์ ํ๋ ๊ณ ์ IP์ ๋ฐ๋๋๋ ๊ฐ๋
6-4. ํ๊ณ์ : ๋๋ถ๋ถ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ ๋IP๋ ๊ณ์ ๋ณํ๊ธฐ ๋๋ฌธ์ ๋ค์์๋ฒ๋ ๋ณํ IP์ฃผ์๋ฅผ ํ์
ํ๊ธฐ ์ด๋ ค์ ์ ์ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์๊น
7-1. ์๋ฏธ: ์ค์๊ฐ์ผ๋ก DNS๋ฅผ ๊ฐฑ์ ํ๋ฉฐ ๋๋ฉ์ธ๊ณผ ํธ์คํธ์ IP๋ฅผ ์ง์์ ์ผ๋ก ๋๊ธฐํํ๋ ์์
์ ์ํํจ
7-2. IP์ฃผ์๊ฐ ๋ฐ๋์ด๋ DDNS๋ก ์ค์ ํ ๋๋ฉ์ธ๊ฐ์ ๋ณํ์ง ์์ ์ ๋IP์ ํ๊ณ์ ์ ๊ทน๋ณตํ ์ ์์
8-1. Ngrok ์ค์น -> Ngrok ์ธ์ฆํค ๋ฐ๊ธฐ

8-2. <ngrok config add-authtoken ์ธ์ฆํค๊ฐ> ๋ช
๋ น์ ํ๋กฌํํธ ์ฐฝ์์ ์คํํ์ฌ ์ธ์ฆํค๊ฐ ์ ์ฅ

8-4. <ngrok tcp ์๋ฒIP:์๋ฒํฌํธ> ๋ช
๋ น์ ํ๋กฌํํธ ์ฐฝ์์ ์คํํ์ฌ ์น์๋ฒ๋ฅผ ์ธ๋ถ๋ก ํธ์คํ
- 172.20.10.4:80 ์
๋ ฅ

8-5. url์ ์ธ๋ถ ๋คํธ์ํฌ์ ์๋ ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ์
๋ ฅํ์ฌ ๊ฒฐ๊ณผ ๋น๊ต
- ํฌํธํฌ์๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์น ๋ธ๋ผ์ฐ์ ์ ์ ๊ทผ

- ๊ธฐ์กด IP์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ ์น ๋ธ๋ผ์ฐ์ ์ ์ ๊ทผ

- ์ค์ต ์ฝ๋
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebSrv.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
// ์ค์ต ํ๊ฒฝ์ WIFI์์ด๋์ ๋น๋ฐ๋ฒํธ๋ก ์์ ํ์ธ์.
const char* ssid = "zineeh";
const char* password = "SMARTDEVICE0417";
#define DHTPIN 18 // DHT ์ผ์์ ์ฐ๊ฒฐ๋ ๋์งํธ ํ
// ์ฌ์ฉ ์ค์ธ ์ผ์ ์ ํ์ผ๋ก ๋ณ๊ฒฝํ์ธ์. DHT11, DHT22, DHT21
#define DHTTYPE DHT11 //
// ์จ์ต๋ ์ผ์ ๊ฐ์ฒด ์์ฑ
DHT dht(DHTPIN, DHTTYPE);
// 80๋ฒ ํฌํธ์์ AsyncWebServer ๊ฐ์ฒด ์์ฑ
AsyncWebServer server(80);
// DHT ์จ๋ ์ฝ๊ธฐ ํจ์
String readDHTTemperature() {
// ์ผ์ ์ฝ๊ธฐ๋ ์ต๋ 2์ด๊ฐ ์์๋ ์ ์์ต๋๋ค. (์ผ์๊ฐ ๋งค์ฐ ๋๋ฆฝ๋๋ค.)
// ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ญ์จ๋ก ์จ๋ ์ฝ๊ธฐ
float t = dht.readTemperature();
// ํ์จ๋ก ์จ๋ ์ฝ์ผ๋ ค๋ฉด ๋งค๊ฐ ๋ณ์๋ฅผ true๋ก ์ค์
//float t = dht.readTemperature(true);
// ์ฝ๊ธฐ ์คํจ ์ ์กฐ๊ธฐ์ ์ข
๋ฃํ๊ณ ๋ค์ ์๋ํฉ๋๋ค.
if (isnan(t)) {
Serial.println("DHT ์ผ์์์ ์ฝ๊ธฐ ์คํจ!");
return "--";
}
else {
Serial.println(t);
return String(t);
}
}
// DHT ์ต๋ ์ฝ๊ธฐ ํจ์
String readDHTHumidity() {
// ์ผ์ ์ฝ๊ธฐ๋ ์ต๋ 2์ด๊ฐ ์์๋ ์ ์์ต๋๋ค. (์ผ์๊ฐ ๋งค์ฐ ๋๋ฆฝ๋๋ค.)
float h = dht.readHumidity();
if (isnan(h)) {
Serial.println("DHT ์ผ์์์ ์ฝ๊ธฐ ์คํจ!");
return "--";
}
else {
Serial.println(h);
return String(h);
}
}
// ์ธ๋ฑ์ค HTML ํ์ด์ง
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"
integrity=
"sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous">
<style>
html {
font-family: Arial;
display: inline-block;
margin: 0px auto;
text-align: center;
}
h2 { font-size: 3.0rem; }
p { font-size: 3.0rem; }
.units { font-size: 1.2rem; }
.dht-labels {
font-size: 1.5rem;
vertical-align: middle;
padding-bottom: 15px;
}
</style>
</head>
<body>
<h2>ESP32 DHT Server</h2>
<p>
<i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="dht-labels">์จ๋</span>
<span id="temperature">%TEMPERATURE%</span>
<sup class="units">°C</sup>
</p>
<p>
<i class="fas fa-tint" style="color:#00add6;"></i>
<span class="dht-labels">์ต๋</span>
<span id="humidity">%HUMIDITY%</span>
<sup class="units">%</sup>
</p>
</body>
<script>
setInterval(function() {
// XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ "/temperature" ์๋ํฌ์ธํธ๋ก GET ์์ฒญ์ ์ ์ก
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// ์์ฒญ์ด ์๋ฃ๋๊ณ ์ฑ๊ณต์ ์ธ ์๋ต์ ๋ฐ์์ ๋, ์จ๋ ๊ฐ์ ์
๋ฐ์ดํธํฉ๋๋ค.
document.getElementById("temperature").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperature", true);
xhttp.send();
}, 2000); // 2์ด ๊ฐ๊ฒฉ์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
setInterval(function() {
// XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ "/humidity" ์๋ํฌ์ธํธ๋ก GET ์์ฒญ์ ์ ์ก
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// ์์ฒญ์ด ์๋ฃ๋๊ณ ์ฑ๊ณต์ ์ธ ์๋ต์ ๋ฐ์์ ๋, ์ต๋ ๊ฐ์ ์
๋ฐ์ดํธํฉ๋๋ค.
document.getElementById("humidity").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/humidity", true);
xhttp.send();
}, 2000); //2์ด ๊ฐ๊ฒฉ์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
</script>
</html>
)rawliteral";
// ํ๋ ์ด์คํ๋๋ฅผ DHT ๊ฐ์ผ๋ก ๋์ฒดํ๋ ํจ์
String processor(const String& var){
if(var == "TEMPERATURE"){
return readDHTTemperature();
}
else if(var == "HUMIDITY"){
return readDHTHumidity();
}
return String();
}
void setup(){
// ๋๋ฒ๊น
์ฉ ์๋ฆฌ์ผ ํฌํธ ์ค์
Serial.begin(115200);
dht.begin();
// Wi-Fi ์ฐ๊ฒฐ
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Wi-Fi์ ์ฐ๊ฒฐ ์ค...");
}
// ESP32 ๋ก์ปฌ IP ์ฃผ์ ์ถ๋ ฅ
Serial.println(WiFi.localIP());
// ๋ฃจํธ(/) ์น ํ์ด์ง ๋ผ์ฐํ
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
// "/temperature" ์๋ํฌ์ธํธ์ ๋ํ GET ์์ฒญ ์ฒ๋ฆฌ
server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", readDHTTemperature().c_str());
});
// "/humidity" ์๋ํฌ์ธํธ์ ๋ํ GET ์์ฒญ ์ฒ๋ฆฌ
server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", readDHTHumidity().c_str());
});
// ์๋ฒ ์์
server.begin();
}
void loop(){
}
-
์ ํด ์ฌ์ดํธ ์ฐจ๋จ์ผ๋ก ์ธํด ์น ์๋ฒ ์ธ๋ถ ์ ์์ด ์ด๋ ค์ธ ๋
-
๊ธฐ์กด ์ํ
- <์ ํด ์ฌ์ดํธ ์ฐจ๋จ ํด์ง> ํ๋ฉด ์ ์์ด ๊ฐ๋ฅํด์ง