Изменение MAC-адреса WiFi на ESP32

Узнайте, почему MAC-адрес ESP32 может изменяться между перезагрузками или режимами Wi-Fi, и как обеспечить стабильную идентификацию устройства.


← Назад к решению проблем

Частые причины

  • 🔄

    MAC получен из EFUSE, но различается по интерфейсам

    ESP32 имеет несколько MAC-адресов для Wi-Fi STA, AP и Bluetooth. Если вы читаете из разных режимов, значения могут отличаться.

  • ⚙️

    Генерация случайного MAC-адреса

    Некоторые библиотеки или приложения (например, ESP-Now, softAP) намеренно используют рандомизированные или локально-администрируемые MAC-адреса для конфиденциальности или работы в mesh-сетях.

  • 📦

    MAC не прошит в EFUSE

    В редких случаях (например, пользовательские модули или инженерные образцы) заводской MAC не запрограммирован, что приводит к генерации резервного адреса.

  • 🧯

    Ручная перезапись в коде

    Ваша прошивка или библиотека может вызывать esp_wifi_set_mac() или esp_base_mac_addr_set() для перезаписи MAC-адреса по умолчанию.

Симптомы

MAC-адрес меняется между перезагрузками

Логи Serial или логи роутера показывают разные MAC-адреса для одного и того же устройства при каждом включении питания.

Устройство определяется как новое при каждой загрузке

Платформы умного дома, DHCP-серверы или файрволы рассматривают каждый перезагруженный ESP32 как новое устройство.

MAC в режиме SoftAP отличается от MAC в режиме STA

При переключении между режимами точки доступа и станции видимый MAC меняется даже без перезагрузки.

Привязка статического IP не работает

Резервирования DHCP на основе MAC работают ненадёжно, потому что MAC-адрес ESP32 кажется переменным.

Решения

Всегда читайте MAC в режиме Station

Используйте WiFi.macAddress() или esp_wifi_get_mac(WIFI_IF_STA) для получения основного MAC-адреса последовательно.

Избегайте SoftAP или ESP-Now, если они не нужны

Эти режимы могут использовать другие или динамические MAC-адреса. Оставайтесь в режиме STA, если постоянство MAC важно.

Прошейте или заблокируйте MAC в EFUSE

Для производственных модулей убедитесь, что действительный MAC прошит в EFUSE и считывается при загрузке.

Установите фиксированный MAC вручную (опционально)

Используйте esp_base_mac_addr_set() в начале кода для назначения фиксированного базового MAC-адреса для стабильности.

Подробнее

MAC-адрес Wi-Fi на ESP32 неожиданно меняется

Если ваше устройство ESP32 появляется с новым MAC-адресом каждый раз при перезагрузке, переключении режимов Wi-Fi или включении питания, вы не одиноки. Эта проблема может создавать трудности в сетях, которые полагаются на статические DHCP-аренды, правила файрвола на основе MAC или идентификацию устройств.

Давайте разберёмся, почему это происходит, как диагностировать проблему и как сделать MAC-адрес вашего ESP32 стабильным.


Понимание поведения MAC-адресов ESP32

Чип ESP32 поставляется с несколькими MAC-адресами:

  • Wi-Fi Station (STA) — для подключения к сети
  • Wi-Fi Access Point (AP) — для создания точки доступа
  • Bluetooth — для BLE и классического Bluetooth
  • (Опционально) Ethernet или SDIO-интерфейсы

Каждый из них получается из заводского базового MAC, прошитого в EFUSE, со специфическими смещениями по интерфейсам от Espressif. Ключевой момент: MAC может казаться изменённым в зависимости от того, какой интерфейс или режим активен.


Распространённые ситуации изменения MAC

🔄 Переключение между режимами STA и AP

Если ваш код использует оба режима — Station и Access Point (WIFI_AP_STA) — MAC-адреса, полученные через WiFi.softAPmacAddress() и WiFi.macAddress(), будут различаться:

Serial.println(WiFi.macAddress());       // MAC режима STA
Serial.println(WiFi.softAPmacAddress()); // MAC режима AP

Это законные и ожидаемые различия — но они могут запутать сети, ожидающие единый MAC.

⚙️ Рандомизированный MAC в определённых функциях

Режимы вроде ESP-NOW, mesh или softAP иногда используют локально-администрируемые (рандомизированные) MAC-адреса для конфиденциальности. Это особенно характерно для прототипирования или когда MAC не прошит в EFUSE.

Вы также можете увидеть MAC-адреса вида 02:xx:xx..., где префикс 02 указывает на локально-администрируемый адрес.

🧯 MAC установлен в коде (перезаписан)

Библиотеки или пользовательский код могут вызывать:

esp_wifi_set_mac(WIFI_IF_STA, my_mac);

Это явно устанавливает MAC и перезаписывает значение по умолчанию. Если это делается непоследовательно, MAC будет различаться между загрузками.


Диагностика проблемы

Чтобы определить, имеет ли ваш ESP32 постоянный заводской MAC:

#include "esp_efuse.h"
#include "esp_mac.h"

uint8_t base_mac[6];
esp_efuse_mac_get_default(base_mac);
Serial.printf("Базовый MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
  base_mac[0], base_mac[1], base_mac[2],
  base_mac[3], base_mac[4], base_mac[5]);

Если этот базовый MAC остаётся постоянным, ваш чип имеет правильный прошитый адрес.

Если он содержит одни нули или вызов завершается неудачей, возможно, вы используете пользовательский чип или инженерный образец без действительного MAC в EFUSE.

Полный диагностический скетч

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

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  // Базовый MAC из EFUSE
  uint8_t base_mac[6];
  esp_efuse_mac_get_default(base_mac);
  Serial.printf("Базовый MAC (EFUSE): %02X:%02X:%02X:%02X:%02X:%02X\n",
    base_mac[0], base_mac[1], base_mac[2],
    base_mac[3], base_mac[4], base_mac[5]);
  
  // Инициализация Wi-Fi
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin("ТестоваяСеть", "пароль");
  WiFi.softAP("ESP32_Test");
  
  delay(2000);
  
  // MAC в режиме Station
  Serial.print("STA MAC: ");
  Serial.println(WiFi.macAddress());
  
  // MAC в режиме AP
  Serial.print("AP MAC:  ");
  Serial.println(WiFi.softAPmacAddress());
  
  // Сравнение
  if (WiFi.macAddress() != WiFi.softAPmacAddress()) {
    Serial.println("⚠️ MAC-адреса STA и AP различаются — это нормальное поведение!");
  }
}

void loop() {}

Лучшие практики для стабильного MAC-адреса

✅ Всегда используйте STA MAC для идентификации

При использовании ESP32 в режиме клиента получайте MAC через:

WiFi.macAddress();

или

uint8_t mac[6];
esp_wifi_get_mac(WIFI_IF_STA, mac);

Это обеспечивает стабильное отображение между перезагрузками.

✅ Избегайте переключения режимов Wi-Fi в процессе работы

Переключение между режимами STA и AP может изменить видимый MAC. Если нужна стабильность, используйте только WIFI_STA.

✅ Назначьте ручной MAC (продвинутый вариант)

Если ваш модуль не имеет MAC в EFUSE или вы создаёте предпроизводственное оборудование, вы можете установить свой MAC:

#include "esp_mac.h"

uint8_t my_mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
esp_base_mac_addr_set(my_mac);

Делайте это в начале setup(), до инициализации Wi-Fi.

Убедитесь, что MAC соответствует правилам допустимого формата — избегайте multicast/зарезервированных адресов и обеспечьте уникальность.

✅ Прошивка MAC-адреса в EFUSE (только для производства)

Для коммерческих продуктов Espressif рекомендует прошивать постоянный MAC в EFUSE. Это требует доступа к инструментам программирования и должно выполняться с осторожностью.


Таблица MAC-адресов по интерфейсам

ИнтерфейсСмещение от базового MACКак получить
Wi-Fi STA+0WiFi.macAddress()
Wi-Fi AP+1WiFi.softAPmacAddress()
Bluetooth+2esp_read_mac(mac, ESP_MAC_BT)
Ethernet+3esp_read_mac(mac, ESP_MAC_ETH)

Заключение

Изменение MAC-адреса на ESP32 — не обязательно баг, но может создавать проблемы, если вы полагаетесь на него для отслеживания в сети или назначения статического IP.

Чтобы избежать сюрпризов:

  • Используйте STA MAC последовательно
  • Не смешивайте режимы Wi-Fi без необходимости
  • Избегайте библиотек, которые перезаписывают MAC, если не понимаете зачем
  • Используйте esp_base_mac_addr_set() только если знаете, что делаете

С правильным подходом вы можете обеспечить надёжную идентификацию ESP32 при каждом подключении.

Быстрая навигация

Дополнительные ресурсы

Всё ещё есть проблема с ESP32? Давайте решим её вместе.

Наш интерактивный мастер устранения неполадок проведёт вас через распространённые проблемы ESP32 и их решения шаг за шагом.

Начать устранение неполадок

Регистрация не требуется. Начните решать проблемы прямо сейчас!

Узнайте больше о нашем процессе устранения неполадок →