Cómo encontrar y cambiar la dirección MAC en ESP32

Cada dispositivo ESP32 cuenta con una dirección MAC única que está hardcodeada en el chip y desempeña un papel crucial en la comunicación efectiva entre dispositivos dentro de una red. Sin embargo, existen circunstancias en las que puede ser necesario asignar una nueva dirección MAC al ESP32. Por ejemplo, esto puede ser útil por razones de seguridad de la red, como implementar una lista blanca de direcciones MAC que permita únicamente a ciertos dispositivos conectarse a una red Wi-Fi. En este artículo, te ofreceremos una guía completa sobre cómo encontrar la dirección MAC actual de tu ESP32 y cómo configurarla a una nueva.

Índice de contenido
  1. ¿Qué es una dirección MAC?
  2. Cómo encontrar la dirección MAC
    1. Explicación del código para encontrar la dirección MAC
  3. Cambiar la dirección MAC
    1. Explicación del código para cambiar la dirección MAC

¿Qué es una dirección MAC?

La dirección MAC (Control de Acceso de Medios) es un identificador único asignado a cada dispositivo que se conecta a una red. Está compuesta por 12 caracteres hexadecimales agrupados en seis pares, como por ejemplo AA:BB:CC:DD:EE:FF. Este identificador permite que los dispositivos se reconozcan unos a otros dentro de la red.

Cada dispositivo que se conecta a una red tiene un controlador de interfaz de red (NIC) que incluye la electrónica necesaria para comunicarse utilizando un protocolo de red específico, como Wi-Fi, Bluetooth o Ethernet. Durante el proceso de fabricación, se asigna una dirección MAC única a cada NIC, la cual se almacena de forma permanente en el hardware del dispositivo.

Las direcciones MAC son fundamentales para el envío y recepción de datos en la red. Mientras que las direcciones IP identifican conexiones de red, las direcciones MAC identifican el hardware. Es importante destacar que, a diferencia de las direcciones IP, que pueden cambiar con frecuencia, las direcciones MAC son estáticas, ya que se utilizan únicamente en la red local.

Aunque la dirección MAC suele estar grabada en el hardware, muchos sistemas, incluido el ESP32, permiten que se sobrescriba mediante software. Sin embargo, es importante recordar que la dirección MAC personalizada es temporal y se restablecerá a la predeterminada del fabricante al reiniciar el chip, a menos que programes el ESP32 para establecerla en cada inicio.

El ESP32 tiene varias direcciones MAC, una para cada interfaz de red que soporta, incluyendo:

  • Wi-Fi en modo estación (STA)
  • Punto de acceso Wi-Fi (AP)
  • Interfaz Bluetooth (Clásica y BLE)
  • Ethernet

Solo la primera, conocida como Dirección MAC Base, se almacena en eFuse o en almacenamiento externo, y se utiliza para generar las direcciones MAC de otras interfaces.

La dirección MAC de la estación Wi-Fi (STA) usa la dirección MAC base. Por otro lado, la dirección MAC del punto de acceso (AP) se deriva incrementando el último octeto de la dirección MAC base en uno. De manera similar, la dirección MAC Bluetooth se deriva sumando dos al último octeto de la dirección base, y la dirección MAC Ethernet sumando tres al último octeto de la dirección base.

Cómo encontrar la dirección MAC

Para encontrar la dirección MAC en un ESP32, puedes utilizar el marco de desarrollo IoT de Espressif (ESP-IDF) o el IDE de Arduino. A continuación, te mostramos un ejemplo utilizando el IDE de Arduino.

Primero, asegúrate de tener instalado el soporte para la placa ESP32 en tu IDE de Arduino:

Aquí tienes un sencillo sketch que imprime la dirección MAC del dispositivo:

#include <WiFi.h>

void setup() {
  Serial.begin(115200);
  
  // Variable para almacenar la dirección MAC
  uint8_t baseMac[6];
  
  // Obtener la dirección MAC de la interfaz de estación Wi-Fi
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("Estación MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  // Obtener la dirección MAC de la interfaz de AP Wi-Fi
  esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);
  Serial.print("SoftAP MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  // Obtener la dirección MAC de la interfaz Bluetooth
  esp_read_mac(baseMac, ESP_MAC_BT);
  Serial.print("Bluetooth MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);

  // Obtener la dirección MAC de la interfaz Ethernet
  esp_read_mac(baseMac, ESP_MAC_ETH);
  Serial.print("Ethernet MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
}

void loop() {
}

Después de cargar el código, abre el Monitor Serial y establece la velocidad de baudios en 115200. Luego, presiona el botón EN en el ESP32. Deberías ver las direcciones MAC de cada interfaz de red impresas en el Monitor Serial.

Explicación del código para encontrar la dirección MAC

El código comienza incluyendo la biblioteca WiFi, que proporciona las funciones necesarias para manejar operaciones Wi-Fi en el ESP32.

Dentro de la función setup(), se inicia la comunicación Serial a una velocidad de 115200 bps.

Se declara una variable llamada baseMac para almacenar la dirección MAC. Esta variable es un arreglo de seis elementos uint8_t, que son enteros sin signo de 8 bits, ideales para contener bytes de dirección MAC que van del 00 al FF (Hex).

A continuación, se llama a la función incorporada del ESP32 esp_read_mac() con baseMac y ESP_MAC_WIFI_STA como argumentos para leer la dirección MAC de la interfaz de estación Wi-Fi y almacenarla en el arreglo baseMac.

El Monitor Serial imprime "Estación MAC: ", seguido de la dirección MAC. Un for recorre los primeros cinco elementos del arreglo baseMac, formateando cada byte en dos dígitos hexadecimales seguidos de un dos puntos. Después del bucle, se imprime el sexto elemento del arreglo sin un dos puntos final, marcando el final de la dirección MAC.

El proceso se repite para la dirección MAC del AP Wi-Fi, esta vez con el argumento ESP_MAC_WIFI_SOFTAP para leer la dirección MAC de la interfaz de punto de acceso.

De manera similar, se obtiene la dirección MAC de la interfaz Bluetooth con ESP_MAC_BT y de la interfaz Ethernet con ESP_MAC_ETH.

La función loop() está vacía porque las direcciones MAC se imprimen solo una vez cuando se reinicia el ESP32.

Cambiar la dirección MAC

El siguiente código cambia la dirección MAC base de un ESP32 y luego muestra las direcciones MAC actualizadas para cada interfaz de red.

Es importante destacar que solo necesitas cambiar la dirección MAC base en un ESP32, ya que todas las demás direcciones MAC para diferentes interfaces de red (Wi-Fi AP, Bluetooth y Ethernet) se actualizan automáticamente, ya que se derivan de la dirección base con desplazamientos específicos.

Antes de cargar el código, es fundamental realizar una modificación. Debes actualizar la variable newMAC con tu dirección MAC personalizada:

uint8_t newMAC[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

Después de realizar el cambio, procede a cargar el código.

#include <WiFi.h>
#include <esp_wifi.h>

// Define tu nueva dirección MAC
uint8_t newMAC[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

void setup() {
  Serial.begin(115200);
  
  // Desactivar WiFi
  WiFi.mode(WIFI_OFF);
  
  Serial.println("[ANTIGUA]---");
  FindMACAddress();
  
  // Establecer la nueva dirección MAC
  if (esp_base_mac_addr_set(newMAC) == ESP_OK) {
    Serial.println("Dirección MAC establecida con éxito");
  } else {
    Serial.println("Error al establecer la dirección MAC");
  }
  
  Serial.println();
  Serial.println("[NUEVA]---");
  FindMACAddress();
}

void loop() {}

void FindMACAddress() {
  // Obtener la dirección MAC de la interfaz de estación Wi-Fi
  uint8_t baseMac[6];
  
  // Obtener dirección MAC para WiFi station
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("Estación MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  // Obtener la dirección MAC de la interfaz AP Wi-Fi
  esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);
  Serial.print("SoftAP MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  // Obtener la dirección MAC de la interfaz Bluetooth
  esp_read_mac(baseMac, ESP_MAC_BT);
  Serial.print("Bluetooth MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);

  // Obtener la dirección MAC de la interfaz Ethernet
  esp_read_mac(baseMac, ESP_MAC_ETH);
  Serial.print("Ethernet MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  Serial.println();
}

Después de cargar el código, abre el Monitor Serial y establece la velocidad de baudios en 115200. Luego, presiona el botón EN en el ESP32. Deberías ver tanto las direcciones MAC antiguas como las nuevas para las interfaces de estación Wi-Fi, punto de acceso Wi-Fi, Bluetooth y Ethernet.

Recuerda que, como se mencionó anteriormente, las modificaciones realizadas no sobrescriben permanentemente la dirección MAC establecida por el fabricante. Por lo tanto, cada vez que reinicies la placa o cargues un nuevo código, revertirá a su dirección MAC predeterminada, a menos que programes el ESP32 para establecerla en cada inicio.

Explicación del código para cambiar la dirección MAC

El código comienza incluyendo las bibliotecas WiFi.h y esp_wifi.h, que proporcionan las funciones necesarias para las operaciones Wi-Fi y características específicas del Wi-Fi en el ESP32.

Se define una nueva dirección MAC como un arreglo de seis bytes hexadecimales.

En la función setup(), se inicializa el Monitor Serial y se apaga el Wi-Fi para garantizar que la nueva dirección MAC se establezca antes de comenzar cualquier actividad Wi-Fi.

A continuación, se llama a la función FindMACAddress() para imprimir las direcciones MAC actuales de varias interfaces. Esta función es prácticamente el segmento de código anterior que recupera e imprime las direcciones MAC, envuelta en una función para modularidad y reutilización.

La función esp_base_mac_addr_set() se llama luego con la nueva dirección MAC. Si tiene éxito, se imprime un mensaje de confirmación; si falla, se muestra un mensaje de error.

Después de establecer la nueva dirección MAC, se llama nuevamente a FindMACAddress() para mostrar las nuevas direcciones MAC.

Finalmente, la función loop() se deja vacía porque el código solo necesita ejecutarse una vez al inicio.

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido activo a través de TikTok @carlosjulian_mx

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir