Ported the relevant lazyhome.ru dokuwiki pages to markdown, verified against the code; each page carries a 'cross-check with code' section where behavior differs from or extends the wiki.
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 в коде присутствует, хоть и, вероятно, не всегда применяется на практике.