Хостинг сайта на 8-битном микроконтроллере
Можно ли держать веб-сайт в интернете на микроконтроллере за доллар? Звучит как шутка, но один энтузиаст действительно заставил 8-битный AVR раздавать HTML — и это работает.
Железо: больше памяти, чем ожидаешь
Эксперимент построен на AVR64DD32 из линейки AVR DD от Microchip. Для микроконтроллера это внушительный запас ресурсов: 8 КБ SRAM, 64 КБ Flash и питание в широком диапазоне. Этого достаточно, чтобы не только исполнять код, но и держать простой сетевой стек.
Главная мысль здесь проста: даже очень скромный чип может оказаться не совсем «игрушкой», если у задачи минимальные требования к интерфейсу и логике.
Сетевое подключение: почему ethernet не подошёл
Классический Ethernet оказался слишком тяжёлым для такой платформы. Даже 10BASE-T требует высокой скорости и точной генерации сигнала, а периферия AVR DD для этого слишком медленная.
Вместо этого был выбран SLIP — старый, но рабочий способ передавать IP-пакеты поверх последовательного порта. Он оборачивает пакет байтами-ограничителями и экранирует служебные значения, чтобы кадры не слипались между собой.
На стороне Linux это поднимается стандартными утилитами: последовательный порт превращается в сетевой интерфейс, а дальше трафик можно маршрутизировать как обычный IP.
ПРИНЦИП РАБОТЫ SLIP
────────────────────────
┌───────────────┐
│ Данные IP │
└───────────────┘
│
▼
┌───────────────┐
│ Обрамление │
│ C0 ... C0 │
└───────────────┘
│
▼
┌───────────────┐
│ Экранирование │
│ C0 → DB DC │
│ DB → DB DD │
└───────────────┘
Сетевой стек: ip просто, tcp больно
IP оказался относительно простым: для ответа достаточно поменять местами адреса источника и назначения и обновить служебные поля.
TCP — уже совсем другая история. Здесь нужен контроль состояния соединения, окна передачи, повторная отправка потерянных пакетов и обработка множества краевых случаев. Именно TCP стал самой сложной частью проекта.
HTTP тоже не реализовали «по-взрослому»: микроконтроллер просто выдаёт заранее подготовленный ответ. Это нормально, если сайт фактически состоит из одной страницы.
АРХИТЕКТУРА СЕТЕВОГО СТЕКА НА MCU
──────────────────────────────────
┌───────────────┐
│ HTTP сервер │
│ без маршрутов │
└───────┬───────┘
▼
┌───────────────┐
│ TCP │
│ состояние │
└───────┬───────┘
▼
┌───────────────┐
│ IP │
│ swap src/dst │
└───────┬───────┘
▼
┌───────────────┐
│ SLIP │
│ encode/decode │
└───────┬───────┘
▼
┌───────────────┐
│ Serial TX/RX │
└───────────────┘
Публичный доступ: vpn вместо прямого адреса
Локальный сервер по UART сам по себе в интернет не виден, поэтому нужен внешний вход. Решение оказалось практичным: домашняя машина подключается к VPS через WireGuard, а уже VPS принимает запросы снаружи.
Дальше вступает в дело reverse proxy на Nginx: запросы по пути /mcu проксируются в туннель и попадают к микроконтроллеру. Так можно оставить основной сайт на VPS, не выставляя MCU наружу напрямую.
В итоге веб-запрос проходит длинный, но рабочий путь: интернет → VPS → WireGuard → домашний Linux → UART → микроконтроллер.
Что ограничивает систему больше всего?
Слабые места очевидны: всего 8 КБ RAM, 64 КБ Flash, ограниченная скорость последовательного интерфейса, отсутствие TLS и минималистичная реализация HTTP. Но для одной статической страницы этого достаточно.
Самое интересное не в том, что система может работать, а в том, насколько далеко можно увести идею «веб-сервер» от привычного железа, прежде чем она перестанет быть веб-сервером.
Выводы
Это хороший пример инженерного «зачем?», который всё же даёт полезные ответы.
- TCP/IP реально поднять даже на очень слабом MCU, если не требовать лишнего.
- SLIP до сих пор остаётся рабочим способом перенести IP поверх последовательного порта.
- WireGuard позволяет связать такой эксперимент с обычным интернетом без прямого публичного адреса.
Главная проблема чаще не в вычислениях, а в инфраструктуре вокруг них.
IDEA ──▶ DRAFT ──▶ REVIEW ──▶ PUBLISH
Ссылки
- Maurycy’s blog — исходный проект и описание эксперимента
- AVR64DD32 datasheet — характеристики микроконтроллера
- RFC 1055 — SLIP — стандарт передачи IP поверх последовательного канала
- Vape Server — похожий проект автора на другом чипе
- lcamtuf’s обзор AVR Dx — обзор семейства AVR Dx
- WireGuard VPN — туннель для соединения домашней сети с VPS
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.