Шалость удалась (часть 2)

Первоначальный план

Итак, решение принято: готовое устройство мы не покупаем — будем собирать своё. В качестве основы я выбрал ESP32 и отдельную плату расширения с Ethernet. Подключение по кабелю казалось самым надёжным вариантом: устройство должно было подключаться к офисному роутеру и становиться обычным участником локальной сети.

При этом активно сканировать или как-то нагружать сеть мне не хотелось. Задача устройства была гораздо проще: периодически сообщать наружу что-то вроде: Я здесь. Я смог выйти в интернет. Всё в порядке.

То есть вместо того, чтобы пытаться достучаться до офиса извне, я развернул схему наоборот: устройство внутри офиса само периодически обращается к внешнему серверу. У такого подхода есть приятный бонус: не нужен белый IP, не нужно открывать входящие порты на роутере и вообще выставлять устройство наружу. Для внешнего мира наш монитор остаётся обычным клиентом офисной сети.

Оставалась небольшая проблема. У меня ещё не было ни ESP32, ни Ethernet-платы. А делать что-то уже хотелось. Железа нет — будем эмулировать

Ждать доставки компонентов показалось слишком скучно, поэтому разработку я начал с противоположного конца системы — с backend. Заодно появился хороший повод использовать Go, который я как раз изучал. Идея была простой: backend принимает периодические сигналы от устройств и запоминает время последнего успешного обращения.

Причём сразу не хотелось привязываться к одной ESP32. Сегодня устройство одно, завтра их может стать несколько — поэтому появились регистрация устройств и независимый heartbeat для каждого из них. Настоящего устройства всё ещё не было, поэтому его место временно занял simulator.

Я написал программную эмуляцию, которая с заданной периодичностью обращалась к backend примерно так, как впоследствии должна была это делать настоящая ESP32. Получилась немного забавная последовательность разработки: физического устройства ещё не существовало, а сервер уже умел регистрировать устройства, принимать heartbeat, сохранять данные и работать с эмулятором будущего железа.

На этом же этапе появился первый простой Web UI. Без сложных dashboard, графиков и аналитики — достаточно было показать главное: выходит устройство сейчас на связь или нет.

В итоге начала складываться первая архитектура системы: ESP32 → Internet → Go Backend → DB / Web UI

Но здесь был принципиальный момент: сервер не должен был проверять устройство сам.

Никакого подключения к офисной сети извне. Никаких запросов к ESP32. Никаких открытых входящих портов.

Связь инициирует только устройство: находясь внутри офисной сети, оно само сообщает внешнему серверу, что ещё живо.

Если heartbeat приходит — мы знаем, что устройство работает и смогло через интернет добраться до нашего backend.

Если heartbeat перестаёт приходить — значит, что-то произошло. Пропал интернет? Отключилось электричество? Перезагрузился роутер? Зависла ESP32? Упал backend? Пока неизвестно.

Для сервера всё это первоначально выглядело одинаково: устройство перестало выходить на связь.

Но для первой версии системы этого уже было достаточно.

#backend #go #IoT #ESP32

Шалость удалась (часть 2) | Сетка — социальная сеть от hh.ru