como-configurar-una-ip-estatica-en-el-esp8266

Cómo configurar una IP estática en el ESP8266 o ESP32

Continuamos con las entradas dedicadas al ESP8266 y el ESP32. En esta ocasión veremos cómo configurar una IP estática en nuestra conexión.

Haremos referencia al ESP8266, pero el mismo código es compatible para el ESP32, ajustando el nombre de las librerías. Al final tenéis el código tanto para el ESP8266 como para el ESP32.

En las dos entradas anteriores hemos visto cómo conectarnos con una red WiFI existente en modo STA y cómo generar nuestra propia red WiFi con modo AP.

Ahora que tenemos nuestro ESP8266 conectado a la red WiFi, la siguiente necesidad va a ser conectarnos a nuestro dispositivo, para lo cuál vamos a tener que poder encontrarlo en dentro de la red. O, dicho de otra forma, necesitamos saber su dirección IP local.

Hasta ahora, habíamos mostrado por puerto serie la dirección IP nada más conectar. Pero no resulta muy práctico tener que tener un ordenador o una pantalla al dispositivo para ver que IP nos ha asignado el DHCP del router ¿verdad?.

Tenemos varias opciones disponibles para encontrar nuestro dispositivo. Una es usar un escáner de dispositivos, otra es usar el mDNS pero, la más segura y robusta es configurar una IP estática en el ESP8266.

Afortunadamente, es muy sencillo configurar una IP estática en el ESP2866 con la función ‘config’ de ESP8266WiFi.

bool config(IPAddress local_ip, 
      IPAddress gateway, 
      IPAddress subnet, 
      IPAddress dns1 = (uint32_t)0x00000000, 
      IPAddress dns2 = (uint32_t)0x00000000);

Remarcar que el orden de los parámetros es diferente a la librería WiFi de Arduino (las librerías ESP8266WiFi y Arduino WiFI son parecidas, pero no idénticas). Tenedlo en cuenta si buscáis tutoriales en Internet, porque a veces las lían.

Esta función debe ser llamada inmediatamente después de WiFi.begin(), que inicia la conexión con el DHCP activado. Con WiFi.config() podemos configurar la IP, gateway, subnet y, opcionalmente las dns.

En el caso del ESP32 la librería se llama simplemente ‘WiFi’.

Ejemplo en modo STA

Vamos a ver un ejemplo de cómo configurar una IP estática en modo STA, es decir, conectándonos a una WiFi existente. El siguiente ejemplo se conectaría a la red, y fijaría la IP a 192.168.1.200.

// Conectar
#include <ESP8266WiFi.h>

// Configurar WiFi generada
const char *ssid = "SSID";
const char *password = "PASSWORD";

IPAddress ip(192,168,1,200);     
IPAddress gateway(192,168,1,1);   
IPAddress subnet(255,255,255,0);   

void setup() 
{
  Serial.begin(115200);
  delay(10);
  Serial.println();
 
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  Serial.print("Conectando a:\t");
  Serial.println(ssid); 

  // Esperar a que nos conectemos
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200); 
  Serial.print('.');
  }

  // Mostrar mensaje de exito y dirección IP asignada
  Serial.println("Conexión establecida");  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
}

void loop() 
{
}

Hay que tener en cuenta que el router tiene que estar configurado para asignarnos la IP deseada. Típicamente, esto significa que debe estar fuera del rango de IP designadas para DHCP.

Ejemplo en modo AP

En modo AP la configuración de la IP estática es menos crítica que en modo STA. A fin de cuentas, estamos generando nuestra propia WiFi y nos ponemos la IP que queremos.

Aun así, la función WiFi.softAPConfig() permite cambiar los parámetros dentro de la red WiFi generada. El siguiente ejemplo muestra la configuración, donde también cambiamos la dirección del ESP8266 a 192.168.1.200.

#include <ESP8266WiFi.h> 

const char *ssid = "ESP8266_AP";
const char *password = "0123456789";

IPAddress ip(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

void setup()
{
  Serial.begin(115200);
  delay(10);
  Serial.println();

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(ip, gateway, subnet);
  Serial.print("Iniciado AP:\t");
  Serial.println(ssid);

  Serial.print("IP address:\t");
  Serial.println(WiFi.softAPIP());
}

void loop() { }

Ejemplo resumido

Como hicimos en las entradas anteriores, si dividimos el código en distintos ficheros, el código queda resumido y más sencillo de mantener,

#include <ESP8266WiFi.h>
 
#include "config.h"  // Sustituir con datos de vuestra red
#include "ESP8266_Utils.hpp"
  
void setup() 
{
  Serial.begin(115200);

  // Para modo STA
  ConnectWiFi_STA(true);

  // Para modo AP
  //ConnectWiFi_AP(true);
}
 
void loop() 
{
}

Un fichero adicional que llamaremos ‘ESP8266_Utils.hpp’ que contenga las funciones de conexión.

void ConnectWiFi_STA(bool useStaticIP = false)
{
   Serial.println("");
   WiFi.mode(WIFI_STA);
   WiFi.begin(ssid, password);
   if(useStaticIP) WiFi.config(ip, gateway, subnet);
   while (WiFi.status() != WL_CONNECTED) 
   { 
     delay(100);  
     Serial.print('.'); 
   }
 
   Serial.println("");
   Serial.print("Iniciado STA:\t");
   Serial.println(ssid);
   Serial.print("IP address:\t");
   Serial.println(WiFi.localIP());
}

void ConnectWiFi_AP(bool useStaticIP = false)
{ 
   Serial.println("");
   WiFi.mode(WIFI_AP);
   while(!WiFi.softAP(ssid, password))
   {
     Serial.println(".");
     delay(100);
   }
   if(useStaticIP) WiFi.softAPConfig(ip, gateway, subnet);

   Serial.println("");
   Serial.print("Iniciado AP:\t");
   Serial.println(ssid);
   Serial.print("IP address:\t");
   Serial.println(WiFi.softAPIP());
}

Un fichero con los datos de nuestra WiFi

const char* ssid     = "ssid";
const char* password = "password";

¡Así de sencillo! En la próxima entrada veremos otra forma de encontrar nuestro dispositivo con mDNS. ¡Hasta pronto!

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.

github-full

Versión para el ESP8266: https://github.com/luisllamasbinaburo/ESP8266-Examples

Versión para el ESP32: https://github.com/luisllamasbinaburo/ESP32-Examples