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:
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.
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.
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(){
}
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.
- Primero, asegúrate de tener instalado el soporte para la placa ESP32 en tu Arduino IDE.
- 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.
¡Genial! Nunca había probado a cambiar la dirección MAC en un ESP32, así que esto me vendrá de perlas. ¡Gracias por el tutorial! 😊👍
¡Buena info! Siempre es útil tener estos tutoriales a mano. ¡Gracias por compartir! 👌🔥
Esa info me salvó la vida, gracias por compartir!
¡Qué buen tip! Me viene justo en el momento perfecto, ¡gracias por compartir! 👏👏🔥
¡Muy útil y fácil de seguir! ¡Gracias por la info!