Files
2026-10-11 01:27:15 +03:00

6.3 KiB

MAC-адрес контроллера

Источник: Wiki LightHub (lazyhome.ru), страница «mac_адрес». Снапшот от 2026-10-02.

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

У разных аппаратных платформ ситуация с MAC адресами разная:

  • ESP8266 и ESP32 и так имеют уникальные адреса, тут ничего мудрить не надо

  • DUE и STM имеют уникальный ID каждого чипа, из которого прошивка генерирует уникальный MAC

  • Mega2560 не имеет такого ID, но, зато, имеет честный EEPROM, в который при первом запуске этот адрес можно записать и он сохранится на всю жизнь, даже если контроллеру обновлять прошивку

Кроме этого, при компиляции прошивки, можно задать опцию CUSTOM_FIRMWARE_MAC - в этом случае, у прошивки будет такой MAC адрес, как вы задали

Также, MAC адрес можно заменить командой mac DE:22:33:11:22:33, подключившись к контроллеру через CLI-интерфейс (вместо DE:22:33:11:22:33 - ваш адрес) В случае Mega2560 это будет запомнено навсегда, в случае DUE - до следующей загрузки прошивки.

Замену MAC через опцию либо через команду не тестировал на ESP - там это совсем не нужно.

Для того, чтобы самостоятельно сгенерировать MAC - прочитайте Википедию Если коротко, то у самой первой цифры, два младших бита должны быть "10", что соответствует не Multicast адресу, отвязанному от производителя

Если лень считать, возьмите первую цифру Макадреса, например, DE или 02, остальное - придумывайте как хотите

Посмотреть MAC адрес вашего контроллера проще всего, подключившись по USB - он будет выведен при перезагрузке контроллера См. как LightHub работает с файлом конфигурации — подключение по USB


Сверка с кодом (2026-10-02)

Проверено по lighthub/main.cpp (функция setupMacAddress(), строка 2817) и lighthub/options.h.

Логика генерации MAC в setupMacAddress() (при отсутствии MAC в NVRAM) выстроена цепочкой условий, что полностью подтверждает описание в wiki:

Платформа Механизм в коде Строки Соответствие wiki
(все) CUSTOM_FIRMWARE_MAC MAC разбирается из build-flag (parseBytes(macStr, ':', ...)), затем принудительно: mac[0] &= 0xFE; mac[0] |= 2; (locally-administered, не multicast) main.cpp:2823-2828 ✅ «опция CUSTOM_FIRMWARE_MAC»
ESP8266/ESP32 (WIFI_ENABLE) Используется штатный MAC чипа: WiFi.macAddress(sysConf.mac) main.cpp:2830-2833 ✅ «ESP и так имеют уникальные адреса»
DUE (__SAM3X8E__) / STM32 (ARDUINO_ARCH_STM32) MAC генерируется из серийного номера чипа: mac[0]=0xDE; остальные байты = сумма байтов UniqueID.UID_Byte[] main.cpp:2835-2840 ✅ «DUE и STM имеют уникальный ID чипа»
fallback DEFAULT_FIRMWARE_MAC Хардкод {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xFF} options.h:180 (доп. fallback, в wiki не описан)

Дополнительные подтверждения:

  • Mega / EEPROM: MAC хранится в NVRAM и читается в systemConfig::getMAC() (config.cpp:44-47), область EEPROM описана константой OFFSET_MAC/EEPROM_FIX_PART_LEN (options.h:128). Для Mega запись в EEPROM сохраняется при перепрошивке — согласуется с утверждением «запомнено навсегда».
  • Команда mac: обработчик cmdFunctionSetMac (main.cpp:1820) парсит адрес формата de:ad:be:ef:fe:00 и сохраняет его в EEPROM. Команда регистрируется только при not FLASH_64KB (main.cpp:2860). Подтверждает возможность замены MAC командой.
  • Вывод MAC по USB: функция printMACAddress() (main.cpp:543) выводит адрес в infoSerial при старте — совпадает с «выведен при перезагрузке контроллера».

Нюанс (расхождение): wiki утверждает, что замена MAC командой/опцией «не тестировал на ESP». В коде для ESP32 при старте вызывается wifi_set_macaddr(STATION_IF, sysConf.mac) (main.cpp:1207) — то есть механизм замены MAC на ESP в коде присутствует, хоть и, вероятно, не всегда применяется на практике.