2018년 11월 1일 목요일

ESP32에 static IP 사용하기 (Using static IP address on ESP32)

ESP32를 사용해 무선랜에 접속하는 경우 기본적으로 DHCP를 사용해 IP주소를 받아오게 된다.
하지만 ESP32가 서버로 동작하는 경우 IP주소를 고정시켜 놓아햐 할 필요가 있다. 또한 배터리로 동작시 deep sleep 모드를 활용하게 되는데 이때 deep sleep에서 깨어날 때 마다 공유기에 접속 후 DHCP로 IP를 받아오는 과정을 수행해야 하면 그에 따른 배터리 소모도 무시할 수 없다.

그래서 ESP32 무선랜이 DHCP를 사용하지 않고 수동으로 IP주소를 설정하는 방법을 설명하겠다.

DHCP를 사용하건 아니건 공유기에 접속을 해야만 하므로 접속할 공유기 정보(SSID, password) 는 필요하다.

const char * ssid = "REPLACE_YOUR_SSID";
const char * pwd = "REPLACE_YOUR_PASSWORD";

저기서 빨간색 부분을 자신에게 맞게 바꿔주면 된다. 만일 공유기 이름이 myhome 이고 공유기 암호가 hello12345 라고 한다면 다음과 같이 바뀌게 된다.

const char * ssid = "myhome";
const char * pwd = "hello12345";

다음은 static IP 를 지정해 준다.

IPAddress local_IP(192, 168, 1, 200); // ESP32가 사용할 IP address
IPAddress gateway(192, 168, 1, 1);    // Gateway IP address (공유기 IP주소)

IPAddress subnet(255, 255, 255, 0);   // subnet mask
IPAddress primaryDNS(8, 8, 8, 8);     // primary DNS server IP address
IPAddress secondaryDNS(8, 8, 4, 4);   // secondary DNS server IP address

여기서도 물론 빨간색 부분은 자신의 환경에 맞게 바꿔줘야 한다.

* 주소 사이에 '.'이 아니고 ','를 사용하고 있음을 주의할 것

이제 setup() 에서 WiFi.config() 메소드로 위의 설정값들을 ESP32에 할당해 준다.

if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
  Serial.println("STA failed to configure");
}

* 위에서 primaryDNS와 secondaryDNS 는 옵션이라 생략해도 된다.

지금까지 설명한 부분을 정리한 코드이다. 공유기 ssid는 "myhome", 공유기 password는"hello12345", ESP32 IP address는  192.168.1.200, gatewaIP(공유기IP)는192.168.1.1 인 경우의 코드이다. 

#include <WiFi.h>

const char * ssid = "myhome";
const char * pwd = "hello12345";

IPAddress local_IP(192, 168, 1, 200);          // ESP32가 사용할 IP address
IPAddress gateway(192, 168, 1, 1);              // Gateway IP address (공유기 IP주소)

IPAddress subnet(255, 255, 255, 0);          // subnet mask
IPAddress primaryDNS(8, 8, 8, 8);             // primary DNS server IP address
IPAddress secondaryDNS(8, 8, 4, 4);         // secondary DNS server IP address

...

void setup()
{
  Serial.begin(115200);

  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("STA failed to configure");
  }

  WiFi.begin(ssid, pwd);
  while (WiFi.status() != WL_CONNECTED) P
    delay(500);
    Serial.print(".");
  }
  
  ...
}

---

다른 방법으로는 ESP32의 코드는 따로 건드리지 않고 ESP32의 MAC address를 알아내 공유기의 DHCP가 고정된 IP를 할당하도록 해 주는 방법도 있다. 하지만 이 경우 IP는 일정하지만 DHCP가 매번 동작하기 때문에 deep sleep에서 깨어나는 경우 배터리 소모를 피할 수 없다.

댓글 없음:

댓글 쓰기