Как проверить свет из зала, не бегая к ноутбуку, почему для этого хватило SSE вместо вебсокетов и что произойдёт, если не поставить PIN на площадке с открытым Wi-Fi.
Сценарии, ради которых это заводят
Проверка из зала. Идёте по рядам, на ходу гоняете кью и смотрите, как
это выглядит с мест. Без этого настройка углов и уровней превращается в
эстафету: пять шагов туда, пять обратно, и так сорок раз.
Фокусировка со сцены. Стоите под прибором, выбираете его на телефоне,
крутите яркость — и видите пятно там, где стоите, а не через
видеотрансляцию.
Второй человек на прогоне. Помощник ведёт 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, и вы
разблокируете его одной рукой, стоя на лестнице.