Note
Проект родился из любопытства и простаивавшего без дела микроконтроллера. Серьезного опыта в embedded не было, с Arduino не работал со времен университета.
Получился небольшой скетч для управления домашним сервером и практическое знакомство с основами разработки под ESP32.
ESP32 подключается к домашней сети Wi-Fi и выступает посредником между пользователем и сервером.
Поддерживаются три основные команды:
- ping - проверяет доступность сервера по сети;
- wake - отправляет Magic Packet (Wake-on-LAN) на MAC-адрес сервера;
- shutdown - отправляет HTTP-запрос на небольшой Python-сервис, который выполняет корректное завершение работы (
shutdown -h now).
Полноценный SSH-клиент для ESP32 требует значительно больше флеш-памяти и оперативной памяти. Небольшой HTTP-сервис решает ту же задачу гораздо проще, стабильнее и практически без накладных расходов.
Вся конфигурация устройства хранится в энергонезависимой памяти (NVS) и может изменяться через Serial без перепрошивки.
Помимо Serial-интерфейса устройство поддерживает управление по MQTT. Для удаленного управления проект интегрирован с платформой Rightech IoT Core. Это позволяет управлять сервером удаленно, в том числе через мессенджеры, если подключить брокер к соответствующему боту.
![]() Rightech IoT Core |
![]() Telegram-бот |
Папку Firmware необходимо открыть в Arduino IDE, выбрав соответствующую плату ESP32.
Устанавливаются через стандартный менеджер библиотек Arduino IDE:
- ESP32Ping - выполнение ICMP Ping;
- PubSubClient - работа с MQTT.
В файле Config.h задаются значения по умолчанию, чтобы не вводить их вручную при первом запуске.
#define DEFAULT_WIFI_SSID "твоя_сеть"
#define DEFAULT_WIFI_PASSWORD "твой_пароль"
#define DEFAULT_MQTT_HOST "адрес_твоего_брокера"
#define DEFAULT_SERVER_IP "192.168.1.100"
#define DEFAULT_SERVER_MAC "AA:BB:CC:DD:EE:FF"
#define DEFAULT_SERVER_PORT 9999Если оставить значения по умолчанию, все параметры можно будет изменить позже через Serial.
После прошивки откройте монитор порта на скорости 115200 бод и выполните команду:
help
Она выведет список всех доступных команд.
| Команда | Назначение |
|---|---|
status |
Статус Wi-Fi, RSSI, время работы и объем свободной памяти |
ping |
Проверка доступности сервера |
wake |
Отправка WoL-пакета пакета |
shutdown |
Корректное завершение работы сервера |
config |
Просмотр текущей конфигурации |
set ip <ip> |
Изменить IP-адрес сервера |
set mac <mac> |
Изменить MAC-адрес сервера |
set port <port> |
Изменить порт HTTP-сервиса |
set ssid <ssid> |
Изменить Wi-Fi сеть (требуется перезагрузка) |
set wifi pass <password> |
Изменить пароль Wi-Fi (требуется перезагрузка) |
set mqtt host <host> |
Изменить адрес MQTT-брокера (требуется перезагрузка) |
set mqtt topic_cmd <topic> |
Изменить топик входящих команд |
set mqtt topic_out <topic> |
Изменить топик исходящих сообщений |
set led on/off |
Включить или отключить статусный светодиод |
reset |
Сбросить настройки к значениям из Config.h (требуется перезагрузка) |
Для корректного завершения работы сервера используется небольшой HTTP-сервис на Python.
Он ожидает GET-запрос на путь /shutdown и выполняет команду:
shutdown -h nowImportant
Сервис принимает запросы только из доверенной локальной подсети. Если запрос поступит с другого адреса, будет возвращен ответ 403 Forbidden.
-
Скопируйте папку
shutdown_listenerна сервер (например, в/root/). -
Укажите свою локальную подсеть в файле
app.py:
ALLOWED_SUBNETS = [
ipaddress.ip_network("192.168.1.0/24"),
]- Для автоматического запуска рекомендуется использовать systemd:
ln -s shutdown_listener/shutdown-listener.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now shutdown-listenerЕсли app.py расположен не в /root/, необходимо изменить путь в файле .service.
Для ручного запуска:
cd shutdown_listener
python3 app.pyESP32 в 3D-печатном корпусе, питание от USB-порта роутера
- Управление кнопкой питания сервера через GPIO ESP32.
- Независимое питание ESP32, не зависящее от состояния сервера.


