week_8 (IP&DNS) - JINEEH/SmartDevice_JinHee GitHub Wiki

์ธํ„ฐ๋„ท๊ณผ ์ž๊ฐ€์„œ๋ฒ„

1. ํ•™์Šต ๋ชฉํ‘œ

1-1. ์›น์„œ๋ฒ„ ์ดํ•ด๋ฅผ ๋ชฉํ‘œ๋กœ ์ธํ„ฐ๋„ท๊ณผ ์ž๊ฐ€์„œ๋ฒ„์— ๊ด€๋ จ๋œ ํ•™์Šต ์ง„ํ–‰

2. ์ธํ„ฐ๋„ท๊ณผ IP์ฃผ์†Œ

2-1. ์ธํ„ฐ๋„ท: ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์ „์„ธ๊ณ„์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ ํ†ต์‹ 
2-2. IP์ฃผ์†Œ(Internet Protocol address): ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋œ ๊ธฐ๊ธฐ(์ปดํ“จํ„ฐ)๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ
2-3. IPv4: 32๋น„ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ์•ฝ 43์–ต๊ฐœ์˜ ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋‚˜ ์‹œ๋Œ€๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ๋ถ€์กฑํ•ด์ง
     - 0.0.0.0~255.255.255.255 ๋กœ ์ด๋ฃจ์–ด์ง

3. ๋„๋ฉ”์ธ์ฃผ์†Œ

3-1. ์˜๋ฏธ: ์ธํ„ฐ๋„ท์—์„œ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ์ด๋ฉฐ ์‚ฌ๋žŒ์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์›€์„ ์คŒ
3-2. ์‚ฌ๋žŒ์—๊ฒŒ ํŽธ๋ฆฌ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์ปดํ“จํ„ฐ๋Š” IP์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•จ
3-3. DNS(Domain Name System): ๋„คํŠธ์›Œํฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋„ค์ž„ ์„œ๋น„์Šค์˜ ๊ตฌ์กฐ๋กœ ๋„๋ฉ”์ธ์ฃผ์†Œ๋ฅผ IP์ฃผ์†Œ๋กœ ํ•ด์„ํ•˜์—ฌ ์ปดํ“จํ„ฐ๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์‹œ์Šคํ…œ

4. IPv6

4-1. 128๋น„ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ฌดํ•œ๋Œ€์— ๊ฐ€๊นŒ์šด IP์ฃผ์†Œ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜์—ฌ IPv4์˜ ์ฃผ์†Œ ๊ณ ๊ฐˆ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ์•ˆ
4-2. IP์ฃผ์†Œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ–ˆ๋˜ IPv4์™€ ๋‹ค๋ฅด๊ฒŒ ๋„คํŠธ์›Œํฌ์— ์ ‘์†ํ•˜๋Š” ๋™์‹œ์— ์ž๋™์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋ฅผ ํ• ๋‹น๋ฐ›์Œ
4-3. ๊ธฐ์กด 64KB์—์„œ ์ œํ•œ์—†์ด ํฐ ํฌ๊ธฐ์˜ ํŒจํ‚ท์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํŒจํ‚ท ํฌ๊ธฐ๊ฐ€ ํ™•์žฅ๋จ

5. ์‚ฌ์„ค IP์˜ ํ•œ๊ณ„

5-1. ์ž์‹ ์˜ IP์ฃผ์†Œ๋ฅผ ํ™•์ธํ•œ ํ›„ <IP์ฃผ์†Œ + /index.php>
5-2. ์‚ฌ์„คIP ์‚ฌ์šฉ์‹œ ์ •์ƒ์ ์ธ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ

6. ์œ ๋™IP

6-1. ์˜๋ฏธ: ๋™์  ํ˜ธ์ŠคํŠธ ์„ค์ • ํ†ต์‹  ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ IP์ฃผ์†Œ๊ฐ€ ์ ‘์†ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ฐ”๋€Œ๋Š” ๋ฐฉ์‹
6-2. ํšจ๊ณผ: IP์ฃผ์†Œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ IP ๊ณ ๊ฐˆ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ ์ค‘ ํ•˜๋‚˜์ž„
6-3. ํŠน์ • IP์ฃผ์†Œ๋ฅผ ๋…์ ํ•˜๋Š” ๊ณ ์ •IP์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…
6-4. ํ•œ๊ณ„์ : ๋Œ€๋ถ€๋ถ„ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์œ ๋™IP๋Š” ๊ณ„์† ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ž„์„œ๋ฒ„๋Š” ๋ณ€ํ•œ IP์ฃผ์†Œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ ์ ‘์† ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€

7. DDNS(Dynamic DNS)

7-1. ์˜๋ฏธ: ์‹ค์‹œ๊ฐ„์œผ๋กœ DNS๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉฐ ๋„๋ฉ”์ธ๊ณผ ํ˜ธ์ŠคํŠธ์˜ IP๋ฅผ ์ง€์†์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ
7-2. IP์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ DDNS๋กœ ์„ค์ •ํ•œ ๋„๋ฉ”์ธ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์•„ ์œ ๋™IP์˜ ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ์Œ

8. ์™ธ๋ถ€ ์ ‘์† ์›น ์„œ๋ฒ„ ์‹ค์Šต

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">&deg;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">&percnt;</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(){

}

10. ์ฐธ๊ณ  ์ž๋ฃŒ

8์ฃผ์ฐจ-์›น์„œ๋ฒ„6

  • <์œ ํ•ด ์‚ฌ์ดํŠธ ์ฐจ๋‹จ ํ•ด์ง€> ํ•˜๋ฉด ์ ‘์†์ด ๊ฐ€๋Šฅํ•ด์ง

8์ฃผ์ฐจ-์›น์„œ๋ฒ„7

โš ๏ธ **GitHub.com Fallback** โš ๏ธ