Создаем нейросеть для роутера на Shell-скриптах: тернарная логика, стигмергия и MIPS без FPU
Вместо введения: почему нейросеть на роутере? Представьте ситуацию: вечер пятницы, вы садитесь смотреть фильм в 4K, а Wi-Fi начинает тормозить. Соседи тоже включили телевизоры, микроволновки, смартфоны — эфир забит. Роутер продолжает работать на максимальной мощности, создавая еще больше помех.
А что, если роутер сам понимал бы, что творится в эфире, и адаптировался? Что, если бы у него была нейросеть?
Звучит как научная фантастика для домашнего роутера за 1500 рублей? А вот и нет.
В этой статье я расскажу, как я создал TriTon — тернарную каскадную нейросеть для управления WiFi-роутером. Она работает на архитектуре MIPS без FPU, написана на чистом Shell (Busybox/ash) и не требует ничего, кроме стандартных утилит OpenWrt. Никакого Python, никакого TensorFlow, никакого облака.
Спойлер: она реально работает и умеет самообучаться.
Почему обычные роутеры тупят (и при чем здесь нейросети) Большинство роутеров используют примитивные алгоритмы выбора канала:
При старте сканируют эфир, выбирают наименее загруженный канал И всё. Дальше они сидят на этом канале годами, даже если вокруг всё изменилось.
Более дорогие решения (Cisco, Ubiquiti, TP-Link Omada) отправляют данные в облако, где крутые AI-алгоритмы анализируют обстановку и отдают команды роутерам. Это работает, но:
- Требует постоянного интернета
- Данные уходят на чужой сервер
- Есть задержка
- Нужна подписка
Я пошел другим путем — нейросеть прямо на роутере, без облака, без FPU, на голом Shell.
Как устроена нейросеть в голове (и почему это важно) В классическом понимании нейросеть — это матричные умножения, градиентный спуск и обратное распространение ошибки. Но мозг устроен иначе.
Биологический нейрон: Получает входные сигналы
Если сумма превысила порог — возбуждается (1) Если нет — тормозится (0) Иногда бывает состояние покоя или неопределенности
Никаких градиентов. Никаких производных. Простые пороги. Почему бы не сделать так же в коде? Так родилась идея тернарной логики — три состояния:
-1 — хорошо (зеленая зона)
0 — средне (желтая зона, требует проверки)
+1 — плохо (красная зона)
Три параметра WiFi, которые легко измерить: RSSI — уровень сигнала (dBm) Retry ratio — процент повторных передач Expected throughput — полезная скорость (Mbps)
Тернарная логика: превращаем числа в решения
Первый шаг — перевести непрерывные величины в три четких состояния.
Как это работает в коде:
Внимание: в Busybox нет поддержки <<< (here-string), поэтому конструкцию read var <<< $(command) пришлось заменить на:
Каскадная архитектура: сначала канал, потом мощность
Классическая нейросеть — это один большой слой, который сразу выдает ответ. Я пошел другим путем — каскады.
Каскад 1: Выбор канала
Сначала роутер сканирует эфир командой iw dev wlan0 scan. Парсинг вывода — отдельный квест (честно говоря, самый муторный). Из каждого BSS (соседней точки доступа) извлекаем:
- primary channel — на каком канале сидит
- signal — уровень сигнала (RSSI)
- station count — сколько клиентов подключено
- channel utilisation — насколько загружен канал (0-255)
- secondary channel offset — использует ли сосед ширину 40 МГц (HT40)
Каждый сосед получает тернарный вес по громкости:
- RSSI > -60 dBm → +1 (громкий, сильно мешает)
- RSSI < -75 dBm → -1 (тихий, почти не мешает)
- Иначе → 0 (средний)
Для каждого канала суммируем:
Количество AP Суммарное количество клиентов Суммарную загруженность (utilisation) Суммарный вес соседей (RSSI-сумму)
Итоговая оценка канала:
- -1 — чистый (можно заходить)
- 0 — средний (терпимо)
- +1 — грязный (лучше не заходить)
Код парсинга (упрощенно):
Каскад 2: Подбор мощности
После выбора канала нейросеть начинает подбирать оптимальную мощность передатчика:
- Ставим минимальную мощность (5 dBm)
- Ждем 30 секунд (клиенты должны стабилизироваться)
- Измеряем RSSI, retry ratio, throughput клиентов
- Если все три параметра в зеленой зоне (-1) — останавливаемся, мощность оптимальна
- Если есть проблемы — повышаем мощность на 5 dBm
- Повторяем до 20 dBm
Обучение через подкрепление (без градиентного спуска)
Нейросеть не просто действует по правилам — она учится на своих ошибках. Основной цикл мониторинга каждые 10 секунд проверяет качество связи:
Веса хранятся в /tmp/weights.conf и влияют на будущие решения. Чем больше успешных повышений мощности, тем увереннее нейросеть будет повышать мощность в похожих ситуациях.
Стигмергия: как несколько роутеров договариваются без общения
Это самая интересная часть. В классических системах роутеры общаются через центральный контроллер или LAN. TriTon использует косвенную координацию через изменения в эфире.
Принцип такой же, как у муравьев с феромонными следами:
- Роутер А выбирает канал 6 и начинает работать
- Роутер Б сканирует эфир и видит: на канале 6 появилась новая AP с сильным сигналом
- Оценка канала 6 ухудшается (из -1 превращается в 0 или +1)
- Роутер Б выбирает другой свободный канал (1 или 11)
- Роутер В сканирует и видит занятость каналов 6 и 1 → выбирает оставшийся (11)
Результат: три роутера автоматически разъехались по непересекающимся каналам без единого отправленного пакета между ними. Это и есть эмерджентность — глобальная самоорганизация из простых локальных правил. Никакого центрального контроллера, никакой настройки, никакого LAN между роутерами.
Что получилось в итоге: реальные тесты Я протестировал нейросеть на роутере с MIPS MT7628 в жилом доме ( 40+ соседних AP в эфире).
Подбор оптимальной мощности на канале 9
Лог реальной работы:
2026-05-14 07:10:00 | MONITOR | power=10dBm | ch=9 | retry=18% | thr=28Mbps
2026-05-14 07:10:10 | POWER_UP | power=15dBm | ch=9 | retry=18% | thr=28Mbps
2026-05-14 07:11:10 | MONITOR | power=15dBm | ch=9 | retry=9% | thr=44Mbps
Повышение мощности помогло.
Стигмергия в действии
Два роутера с TriTon в одной комнате:
- Оба стартовали на канале 6
- Через 2 минуты один переключился на канал 1
- Еще через минуту второй переключился на канал 11
- Разъехались по непересекающимся каналам
Без единого LAN-кабеля между ними!
Технические тонкости: Busybox и MIPS
Самое сложное было заставить все работать на Busybox ash (не bash) и MIPS
- Нет <<< (here-string) — заменили на stats=stats" | awk
- Нет массивов в ash — используем eval для динамических переменных
- Нет дробных чисел в сравнениях — преобразуем float в int через cut -d. -f1
- awk в Busybox не поддерживает захват групп в match() — парсим через grep и sed
Пример костыля для throughput:
Что дальше: планы и идеи
- Портирование на C — для встраивания в прошивку OpenWrt как стандартный пакет
- Интеграция с ubus — вместо парсинга iw через JSON API
- Web-интерфейс — чтобы настраивать пороги и смотреть графики
- Поддержка 5 GHz — сейчас только 2.4 GHz
- Адаптивные пороги — чтобы нейросеть сама подбирала пороги под свою среду
Заключение: зачем все это
TriTon — это не просто скрипт для роутера. Это:
- Доказательство концепции — нейросеть может работать без градиентного спуска и float
- Готовая система — работает на реальном железе, протестирована в бою
- Исследовательский проект — сочетает тернарную логику, каскадность, обучение через подкрепление и стигмергию
- Вклад в сообщество — OpenWrt получает инструмент, которого там не было
Нейросеть, которая работает на роутере за ~2000 рублей, без облака, без интернета, без FPU. На Shell-скриптах.
Хотите попробовать?
Скрипт доступен на GitHub: https://github.com/den4ik86/TriTon
Для установки достаточно:
Вопросы, идеи, пулл-реквесты приветствуются! Спасибо за внимание!