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

Si eres un desarrollador o entusiasta de la tecnología, es crucial que conozcas cómo encontrar y cambiar la dirección MAC en ESP32. La dirección MAC es un identificador único que permite a los dispositivos conectarse a una red de manera única. En esta guía, te enseñaremos paso a paso cómo acceder a esta información vital en tu ESP32 y cómo modificarla según tus necesidades. ¡Sigue leyendo para convertirte en un experto en este proceso!

Cada ESP32 tiene una dirección MAC única que está codificada en el chip y juega un papel importante para permitir una comunicación efectiva entre dispositivos. Sin embargo, puede haber ocasiones en las que necesite asignar una nueva dirección MAC a su ESP32. Esto puede resultar útil, por ejemplo, por motivos de seguridad de la red, como implementar una lista blanca de direcciones MAC que solo permita que dispositivos seleccionados se conecten a una red Wi-Fi.

En tales casos, el siguiente tutorial será invaluable. Proporciona instrucciones paso a paso sobre cómo encontrar la dirección MAC actual de su ESP32 y configurar una nueva.

¿Qué es una dirección MAC?

Una dirección MAC (abreviatura de Media Access Control) es una serie de números y letras que sirve como identificador único para un dispositivo de red. Las direcciones MAC constan de 12 caracteres hexadecimales agrupados en seis pares, p. B.AA:BB:CC:DD:EE:FF.

Cada dispositivo que se conecta a una red está equipado con un controlador de interfaz de red (NIC), que contiene los circuitos electrónicos necesarios para comunicarse a través de un protocolo de red específico, como Wi-Fi, Bluetooth o Ethernet. El fabricante asigna a cada NIC (si hay más de una) una dirección MAC única durante el proceso de producción, y esta dirección se almacena permanentemente en el hardware del dispositivo.

Necesitamos estas direcciones para poder enviar o recibir datos a través de la red. Mientras que las direcciones IP identifican una conexión de red, las direcciones MAC identifican el hardware. Sin embargo, a diferencia de las direcciones IP, que cambian con frecuencia, las direcciones MAC son estáticas porque sólo se utilizan dentro de la red local.

Aunque la dirección MAC generalmente está integrada en el hardware del dispositivo, muchos sistemas, incluido el ESP32, pueden sobrescribirla mediante software. Sin embargo, tenga en cuenta que la dirección MAC personalizada es temporal y se restablecerá a la configuración predeterminada del fabricante cuando reinicie el chip, a menos que programe el ESP32 para configurarlo en cada arranque.

Dirección MAC en ESP32

El ESP32 tiene varias direcciones MAC, una para cada interfaz de red compatible, incluidas las siguientes:

  • Estación WLAN (STA)
  • Punto de acceso WiFi (AP)
  • Interfaz Bluetooth (Clásica y BLE)
  • Ethernet

Sólo la primera, llamada dirección MAC base, se almacena en eFuse o en la memoria externa y se utiliza para generar direcciones MAC para otras interfaces.

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

interfaz Dirección MAC Ejemplo
Estación Wi-Fi base_mac 80:7D:3A:CB:12:5C
Wi-Fi SoftAP base_mac +1 al último octeto 80:7D:3A:CB:12:5D
Bluetooth base_mac +2 hasta el último octeto 80:7D:3A:CB:12:5E
Ethernet base_mac +3 hasta el último octeto 80:7D:3A:CB:12:5F

Se puede encontrar más información en el Documentación expresiva.

Determinar la dirección MAC

Para encontrar la dirección MAC en un ESP32, puede utilizar Espressif IoT Development Framework (ESP-IDF) o Arduino IDE. El ejemplo proporcionado aquí es para el IDE de Arduino.

Primero, asegúrese de que la compatibilidad con la placa ESP32 esté instalada en su IDE de Arduino:

Cómo encontrar y cambiar la dirección MAC en ESP32
Instalación de la placa ESP32 en el IDE de Arduino
Hay varias plataformas de desarrollo disponibles para programar el ESP32. Puedes optar por: Arduino IDE – para aquellos que estén familiarizados con ArduinoEspruino…

Aquí hay un boceto simple para imprimir la dirección MAC del dispositivo:

#include <WiFi.h>

void setup(){
  Serial.begin(115200);
  
  // Variable to store the MAC address
  uint8_t baseMac[6];
  
  // Get MAC address of the WiFi station interface
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("Station MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  // Get the MAC address of the Wi-Fi AP interface
  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]);
  
  // Get the MAC address of the Bluetooth interface
  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]);

  // Get the MAC address of the Ethernet interface
  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, abra el monitor serie y establezca la velocidad en baudios en 115200. Luego presione el botón EN en el ESP32. Debería ver las direcciones MAC para cada interfaz de red mostradas en el monitor serie.

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

Explicación del código:

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

#include "WiFi.h"

Dentro de la función setup(), comenzamos inicializando la comunicación serie con una velocidad de baudios de 115.200 bps.

Serial.begin(115200);

Se declara una variable llamada baseMac para almacenar la dirección MAC. Esta variable es una matriz de seis uint8_t Elementos, que son enteros sin signo de 8 bits, perfectos para almacenar bytes de direcciones MAC en el rango de 00 a FF (Hex).

uint8_t baseMac[6];

La función incorporada del ESP32 esp_read_mac() luego se llama con baseMac Y ESP_MAC_WIFI_STA como argumentos para leer la dirección MAC de la interfaz de la estación Wi-Fi y en baseMac -Formación.

esp_read_mac(baseMac, ESP_MAC_WIFI_STA);

El monitor serie luego mostrará “Station MAC:” seguido de la dirección MAC. for Loop recorre los primeros cinco elementos del baseMac Matriz donde cada byte tiene el formato de dos dígitos hexadecimales seguidos de dos puntos. Después del bucle, el sexto elemento del baseMac La matriz se imprime sin dos puntos al final para marcar el final de la dirección MAC.

Serial.print("Station MAC: ");
for (int i = 0; i < 5; i++) {
  Serial.printf("%02X:", baseMac[i]);
}
Serial.printf("%02Xn", baseMac[5]);

El proceso se repite para la dirección MAC del AP WiFi, esta vez con el ESP_MAC_WIFI_SOFTAP Argumento para leer la dirección MAC de la interfaz del punto de acceso 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]);

A continuación, la interfaz Bluetooth MAC llamando esp_read_mac() con ESP_MAC_BT.

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]);

También se lee la MAC de la interfaz Ethernet. ESP_MAC_ETH.

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]);

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

void loop(){
}

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 tener en cuenta que en un ESP32 solo necesita cambiar la dirección MAC base, 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 tienen compensaciones específicas derivadas de la base. DIRECCIÓN.

Antes de cargar el código, es importante realizar un cambio. Tienes que newMAC Variable con su dirección MAC personalizada:

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

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

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

// Define your new MAC address
uint8_t newMAC[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

void setup(){
  Serial.begin(115200);
  
  // Disable WiFi
  WiFi.mode(WIFI_OFF);
  
  Serial.println("[OLD]---");
  FindMACAddress();
  
  // Set the new MAC address
  if (esp_base_mac_addr_set(newMAC) == ESP_OK) {
    Serial.println("MAC address set successfully");
  } else {
    Serial.println("Failed to set MAC address");
  }
  
  Serial.println();
  Serial.println("[NEW]---");
  FindMACAddress();
}
 
void loop(){
}

void FindMACAddress(){
  // Get the MAC address of the Wi-Fi station interface
  uint8_t baseMac[6];
  
  // Get MAC address for WiFi station
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("Station MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  // Get the MAC address of the Wi-Fi AP interface
  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]);
  
  // Get the MAC address of the Bluetooth interface
  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]);

  // Get the MAC address of the Ethernet interface
  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, abra el Monitor serie y establezca la velocidad en baudios en 115200. Luego presione el botón EN en el ESP32. Debería ver las direcciones MAC antiguas y nuevas de la estación WiFi, el punto de acceso WiFi y las interfaces Bluetooth y Ethernet.

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

Tenga en cuenta que, como ya se explicó, los cambios realizados no sobrescriben permanentemente la dirección MAC establecida por el fabricante. Por lo tanto, cada vez que reinicie la tarjeta o cargue nuevos códigos, la dirección MAC predeterminada se restaurará a menos que programe el ESP32 para configurar esto cada vez que arranca.

Explicación del código:

El código comienza incluyendo el WiFi.h Y esp_wifi.h Bibliotecas que brindan la funcionalidad requerida para el funcionamiento de Wi-Fi y funciones específicas de Wi-Fi ESP32.

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

Luego se define una nueva dirección MAC como una matriz de seis bytes hexadecimales.

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

Setup() inicializa el monitor serie y apaga WiFi para garantizar que la nueva dirección MAC esté configurada antes de que comience cualquier actividad WiFi.

WiFi.mode(WIFI_OFF);

A continuación la función FindMACAddress() Se llama para imprimir las direcciones MAC actuales para varias interfaces. FindMACAddress() La función es esencialmente el segmento de código anterior que recupera e imprime las direcciones MAC, envuelto en una función para modularidad y reutilización.

FindMACAddress();

El esp_base_mac_addr_set() Luego se llama a la función con la nueva dirección MAC. Si tiene éxito, se emite un mensaje de confirmación. Si falla, se muestra un mensaje de error.

if (esp_base_mac_addr_set(newMAC) == ESP_OK) {
  Serial.println("MAC address set successfully");
} else {
  Serial.println("Failed to set MAC address");
}

Después de configurar la nueva dirección MAC, el FindMACAddress() Se vuelve a llamar a la función para mostrar las nuevas direcciones MAC.

FindMACAddress();

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

void loop(){
}
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

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

Cada ESP32 tiene una dirección MAC única que está codificada en el chip y desempeña un papel importante en facilitar la comunicación efectiva entre los dispositivos. Sin embargo, hay momentos en los que es posible que necesites asignar una nueva dirección MAC a tu ESP32. Por ejemplo, es posible que desees hacer esto por motivos de seguridad de red, como implementar una lista blanca de direcciones MAC que permita que solo los dispositivos seleccionados se conecten a una red Wi-Fi.

¿Qué es una dirección MAC?

Una dirección MAC (abreviatura de «control de acceso a los medios») es una serie de números y letras que sirve como identificador único para un dispositivo de red. Las direcciones MAC constan de 12 caracteres hexadecimales agrupados en seis pares, como AA:BB:CC:DD:EE:FF.

Cada dispositivo que se conecta a una red está equipado con un controlador de interfaz de red (NIC), que incorpora la electrónica necesaria para la comunicación a través de un protocolo de red específico, como Wi-Fi, Bluetooth o Ethernet. El fabricante asigna una dirección MAC única a cada NIC (si hay varios) durante el proceso de producción, y esta dirección se almacena permanentemente en el hardware del dispositivo.

Necesitamos estas direcciones para poder enviar o recibir datos a través de la red. Mientras que las direcciones IP identifican una conexión de red, las direcciones MAC identifican el hardware. Sin embargo, a diferencia de las direcciones IP, que cambian con frecuencia, las direcciones MAC son estáticas porque solo se utilizan dentro de la red local.

Aunque la dirección MAC generalmente está grabada en el hardware del dispositivo, muchos sistemas, incluido el ESP32, permiten anularla a través de software. Pero ten en cuenta 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.

Dirección MAC en ESP32

El ESP32 tiene varias direcciones MAC, una para cada interfaz de red que admite, incluidas las siguientes:

– Wi-Fi Station (STA)
– Wi-Fi Access Point (AP)
– Interfaz Bluetooth (Clásica y BLE)
– Ethernet

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

La Estación Wi-Fi (STA) utiliza la dirección MAC base. En contraste, la dirección MAC del Punto de Acceso Wi-Fi (AP) se deriva incrementando el último octeto de la dirección base MAC en uno. De manera similar, la dirección MAC de Bluetooth se deriva agregando dos al último octeto de la dirección base, y la dirección MAC de Ethernet agregando tres al último octeto de la dirección base.

Para obtener más información, consulta la documentación de Espressif.

Cómo encontrar la dirección MAC

Para encontrar la dirección MAC en un ESP32, puedes utilizar el Espressif IoT Development Framework (ESP-IDF) o el Arduino IDE. El siguiente tutorial proporciona instrucciones paso a paso sobre cómo encontrar la dirección MAC actual de tu ESP32 y cómo establecer una nueva.

  1. Primero, asegúrate de tener instalado el soporte para la placa ESP32 en tu Arduino IDE.
  2. Aquí hay un boceto simple para imprimir 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 la Estación Wi-Fi
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("MAC de la Estación: ");
  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 del Punto de Acceso Wi-Fi
  esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);
  Serial.print("MAC del Punto de Acceso: ");
  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 Bluetooth
  esp_read_mac(baseMac, ESP_MAC_BT);
  Serial.print("MAC de Bluetooth: ");
  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 Ethernet
  esp_read_mac(baseMac, ESP_MAC_ETH);
  Serial.print("MAC de Ethernet: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
}

void loop(){
}

Una vez que cargues el código, abre el Monitor en Serie y establece la velocidad de bits en 115200. Luego, presiona el botón EN en el ESP32. Deberías ver las direcciones MAC para cada interfaz de red impresas en el Monitor en Serie.

Cambiando 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 tener en cuenta 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 subir el código, es esencial 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 hacer el cambio, carga 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);
  
  // Deshabilitar 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 la Estación Wi-Fi
  uint8_t baseMac[6];
  
  // Obtener la dirección MAC de WiFi station
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("MAC de la Estación: ");
  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 del Punto de Acceso Wi-Fi
  esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);
  Serial.print("MAC del Punto de Acceso: ");
  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 Bluetooth
  esp_read_mac(baseMac, ESP_MAC_BT);
  Serial.print("MAC de Bluetooth: ");
  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 Ethernet
  esp_read_mac(baseMac, ESP_MAC_ETH);
  Serial.print("MAC de Ethernet: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02Xn", baseMac[5]);
  
  Serial.println();
}

Una vez que subas el código, abre el Monitor en Serie y establece la velocidad de bits en 115200. Luego, presiona el botón EN en el ESP32. Deberías ver tanto las direcciones MAC antiguas como las nuevas para la estación Wi-Fi, el punto de acceso Wi-Fi, Bluetooth, y las interfaces de Ethernet.

Ten en cuenta que, como se explicó 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, volverá a su dirección MAC predeterminada, a menos que programes el ESP32 para establecerla en cada inicio.

5 comentarios en «Cómo encontrar y cambiar la dirección MAC en ESP32»

Deja un comentario