Чем-то напоминает невозможные порты DOOM
Энтузиаст под ником BogdanTheGeek запустил полноценный HTTP-сервер на микроконтроллере из одноразового вейпа. Причем сервер умеет обслуживать страницы, обрабатывать запросы и даже возвращает JSON-ответы.
Все это — на чипе с 3 КБ оперативной и 24 КБ флеш-памяти, без сетевого интерфейса, Wi-Fi или Ethernet.
Откуда там вообще чип?
Автор проекта рассказывает, что давно коллекционировал одноразовые вейпы, но со временем устройства начали попадаться с куда более интересной начинкой.
Вместо обычного черного эпоксидного «блоба» он обнаружил маркированный микроконтроллер PUYA C642F15, позже идентифицированный как PY32F002B с ARM Cortex-M0+ частотой 24 МГц.
Вейпы, по сути, оказались носителями полностью программируемых микроконтроллеров.
Как он вывел это в сеть?
Wi-Fi, Ethernet или даже Bluetooth в таких устройствах, разумеется, нет. Но автор воспользовался семихостингом — механизмом отладки, при котором отладчик может отправлять и принимать данные через подключенный JTAG/SWD интерфейс.
AMD случайно слила исходники FSR 4 на GitHub и удалила их. Пользователи успели сделать форкиtproger.ru
Далее он применил довольно хакерское решение: использовал pyOCD для создания telnet-порта с выходом семихостинга, затем через socat пробросил это в виртуальное TTY-устройство, поверх него поднял SLIP (Serial Line Internet Protocol). Да, тот самый, из эпохи dial-up.
После этого на Linux можно было поднять IP-интерфейс sl0 и назначить IP-адрес — теперь микроконтроллер был виден как узел локальной сети.
А веб-сервер?
В качестве TCP/IP-стека был выбран uIP — крайне легкий вариант от Contiki OS, специально рассчитанный на 8- и 16-битные микроконтроллеры.
Он же включает в себя минимальный HTTP-сервер. После небольшой адаптации под семихостинг и исправления проблем с выравниванием памяти на ARM все заработало.
Причем не просто «заработало», а заработало удивительно быстро: после оптимизации буферов и избавления от побайтной передачи, RTT упали до 20 мс, а загрузка страницы — до 160 мс.
Несмотря на сверхограниченные ресурсы (всего 3 КБ RAM, из которых почти половина уже занята сервером), автор сумел:
- организовать буферизацию и кольцевой буфер;
- запустить TCP/IP-стек и веб-сервер;
- реализовать подсчет посещений и возврат JSON-ответов;
- полностью уместить все в оставшиеся ~20КБ флеша.
Он даже добавил простую статистику: уникальный ID микроконтроллера и количество посещений со времени последнего «краша».
Зачем это все?
Как отмечает сам автор, цель была не в создании полезного веб-сервера, а в демонстрации возможностей предельно скромного «железа», которое в обычной жизни просто выбрасывается.
Иными словами — это искусство, хакерская эстетика и демонстрация инженерной изобретательности.
