← все статьи

Телефон как пульт: зачем это нужно и почему сервер живёт внутри приложения

Как проверить свет из зала, не бегая к ноутбуку, почему для этого хватило SSE вместо вебсокетов и что произойдёт, если не поставить PIN на площадке с открытым Wi-Fi.

Главная проблема светового оператора описывается одной фразой: он сидит не там, откуда смотрит зритель.

За пультом — свой ракурс, свой уровень глаз, свои отражения от монитора. Контровой, который из-за пульта выглядит нормально, из шестого ряда бьёт зрителю в глаза. Заливка, которая на визуализаторе ровная, на сцене собирается пятнами. Чтобы это увидеть, надо встать и отойти — а на пульте в этот момент некому нажать GO.

Отсюда веб-пульт: телефон в той же сети открывает страницу и делает то, ради чего вы возвращались бы к ноутбуку.

Сценарии, ради которых это заводят

Проверка из зала. Идёте по рядам, на ходу гоняете кью и смотрите, как это выглядит с мест. Без этого настройка углов и уровней превращается в эстафету: пять шагов туда, пять обратно, и так сорок раз.

Фокусировка со сцены. Стоите под прибором, выбираете его на телефоне, крутите яркость — и видите пятно там, где стоите, а не через видеотрансляцию.

Второй человек на прогоне. Помощник ведёт GO по тексту, вы правите уровни. Или наоборот.

Монтаж. Blackout с телефона, когда нужно быстро погасить сцену, а вы на стремянке.

Пульт при этом остаётся у оператора. Телефон — это не замена, а вторая рука.

Что внутри: почему SSE, а не вебсокеты

Инженерное решение, которое стоит объяснить, потому что оно контринтуитивное.

Данные тут текут в две стороны: вниз на телефон — состояние (активная кью, включённые пресеты, положение мастера), вверх — команды. Рефлекс говорит: двусторонний обмен, берите WebSocket.

Мы взяли Server-Sent Events вниз и обычные POST вверх, и вот почему.

Наверх летят нажатия пальцем — несколько штук в секунду в самом бодром случае. Для такого потока POST-запрос ничем не хуже кадра вебсокета, а отлаживается он curl-ом.

Вниз течёт состояние, и оно течёт только вниз. SSE — это буквально HTTP-ответ, который не закончился: сервер держит соединение и досылает в него строки. Никакого фрейминга, никакого рукопожатия, никакого пинг-понга, чтобы понять, жив ли клиент.

Разница в цене: WebSocket в Node — это либо внешняя зависимость, либо своя реализация RFC 6455 с фреймингом и маскированием. SSE — это res.write() в цикле. Для функции «показать телефону, какая кью активна» второе честнее.

Побочный выигрыш: SSE переподключается сам. Телефон заснул, Wi-Fi моргнул — браузер восстановит поток без единой строки нашего кода. С вебсокетом это писали бы руками, и написали бы с багами.

Состояние уходит с троттлингом 120 мс и дедупликацией: пока оператор тащит фейдер, снапшоты не летят по кадру на каждое движение.

Команды идут тем же путём, что MIDI и OSC

Это принципиально. Телефон не получает своей дороги в сторы приложения: его команда проходит через тот же диспетчер, что и нажатие пэда на MIDI-контроллере или сообщение OSC с планшета.

Мотив прагматичный: три параллельных пути к одному действию — это три набора багов и три места, где забыли обновить логику. Один путь — один набор.

Сам HTTP-сервер живёт в главном процессе приложения, рядом с DMX и OSC. Окно интерфейса портов не открывает вовсе.

Про безопасность: PIN не для галочки

Сервер слушает все сетевые интерфейсы — иначе телефон до него не достучится. Значит, его видит вся сеть площадки.

Прикиньте, что это означает на концерте: гостевой Wi-Fi, к которому подключены триста человек, и открытая страница, где есть кнопка blackout. Никакого злого умысла не требуется — достаточно любопытства и случайно угаданного адреса вида 192.168.1.42:7331.

Поэтому:

  • Ставьте PIN. Пустой PIN означает «пускать всех в этой сети», и настройки прямо об этом предупреждают. С PIN телефон получает сессионную cookie (HttpOnly, 12 часов), и вводить его каждый раз не нужно.
  • Перебор отсекается: больше десяти попыток с одного адреса в минуту — отказ. Четырёхзначный PIN перебирается за десять тысяч попыток, то есть за семнадцать часов такого лимита, а не за минуту.
  • Смена PIN разлогинивает всех. Ушёл помощник со своим телефоном — меняете PIN, и его сессия умирает вместе с остальными.

Идеальный вариант, конечно, — отдельная сеть для шоу, куда посторонним физически не попасть. Но раз уж мы знаем, что в реальности будет один свитч на всё, PIN включён по умолчанию не просто так.

Подключение и мелочь, которая всё портит

В настройках показан адрес и QR-код — телефон наводят камерой вместо того, чтобы набирать IP пальцами в полутёмном зале. Экономит секунд тридцать и одну опечатку.

Если страница не открывается, дело почти всегда в изоляции клиентов: гостевой Wi-Fi часто настроен так, что устройства не видят друг друга. Проверяется мгновенно — телефон и ноутбук должны пинговать друг друга.

И самое обидное, что стоит сделать заранее: выключите автоблокировку экрана. Телефон гаснет ровно в тот момент, когда нужно нажать GO, и вы разблокируете его одной рукой, стоя на лестнице.

Читайте также