mirror of
https://github.com/anklimov/lighthub
synced 2026-10-28 11:15:00 +00:00
docs: import wiki pages into the repo (core/integrations/hardware)
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.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
# 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 в коде присутствует, хоть и, вероятно, не всегда применяется на практике.
|
||||
Reference in New Issue
Block a user