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

52 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-интерфейс](../core/cli_interface.md) (вместо DE:22:33:11:22:33 - ваш адрес)
В случае Mega2560 это будет запомнено навсегда, в случае DUE - до следующей загрузки прошивки.
Замену MAC через опцию либо через команду не тестировал на ESP - там это совсем не нужно.
Для того, чтобы самостоятельно сгенерировать MAC - прочитайте [Википедию](https://ru.wikipedia.org/wiki/MAC-адрес#.D0.A1.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D0.B0_MAC-.D0.B0.D0.B4.D1.80.D0.B5.D1.81.D0.B0)
Если коротко, то у самой первой цифры, два младших бита должны быть "10", что соответствует не Multicast адресу, отвязанному от производителя
Если лень считать, возьмите первую цифру Макадреса, например, DE или 02, остальное - придумывайте как хотите
Посмотреть MAC адрес вашего контроллера проще всего, подключившись по USB - он будет выведен при перезагрузке контроллера
См. [как LightHub работает с файлом конфигурации — подключение по USB](../core/config_file_workflow.md)
---
## Сверка с кодом (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 в коде присутствует, хоть и, вероятно, не всегда применяется на практике.