Поддержка websockets
Добавлено: Вт окт 20, 2015 3:38 pm
Очень большое и достаточно рискованное обновление. Пожалуйста, сообщайте о найденных неполадках в работе.
Итак, небольшой "ликбез". Технология websockets (вебсокетов) была в своё время разработана для поддержки браузерами обновления содержимого страницы в реальном времени. Т.е. буквально в реальном, а не иммитация оного с помощью технологии AJAX. Основное отличие в том, что в случае AJAX-а браузер периодически отправляет запрос на сервер и разбирает его для изменения состояния страницы, а в случае вебсокетов браузер устанавливает одно постоянное соединение с сервером и получает команды от сервера на инициирование каких-либо изменений. Последнее позволяет избавиться от задержек в обновлении интерфейса и реагировать на серверные изменения сразу, как только они происходят.
Теперь ближе к нашей теме. Что нам даёт переход на вебсокеты:
* Мгновенное обновление интерфейса при изменении данных в системе (сцены, меню, домашние страницы)
* Избавляемся от понятия "время авто-обновления" (меню, домашние страницы)
* "Подписка" на обновления свойств объектов для кастомных интерфейсов (домашние страницы)
* Уменьшается загрузка на сервер, т.к. отключаются AJAX-запросы (сцены, меню, домашние страницы)
Короче, в этом самом рискованном обновлении реализована поддержка вебсокетов со всеми вышеперечисленными плюсами, но обновление слишком серьёзное, чтобы я мог гарантировать стабильную работу.
Как пользоваться -- как обычно, ничего дополнительно настраивать не нужно. После перезапуска системы запускается дополнительный цикл cycle_websockets, который создаёт сервер вебсокетов на порту 8001 (по-умолчанию), после чего весь веб-интерфейс использует для обновления состояния веб-сокеты.
В /config.php можно опционально использовать следующие настройки:
Некоторые особенности использования в домашних страницах.
Свойства объектов можно по-прежнему вставлять в html-код как %object.property%, так и %object.property|NN%, но при включенных вебсокетах, значение NN (время обновления в секундах) игнорируется и свойство обновляется не в заданном промежутке, а в реальном времени. Если NN не указано, то свойство не обновляется.
Далее, для подписки на событие обновления свойства и использовании его в своём интерфейсе, можно использовать такую конструкцию:
т.е. функция $.subscribe с параметром названиесвойства.updated (выше в примере switch1.status.updated).
Важны два момента: во-первых, в коде обязательно должна быть конструкция типа %switch1.status|NN% -- она создаёт событие, на которое можно подписаться (NN в вышеуказанном примере равно 0, но оно может быть любым числом). Причём, эта конструкция может быть даже закомментирована, чтобы не отображаться, например так:
Во-вторых, имя для подписки на событие используется название объекта/свойства в нижнем регистре. Т.е. вы можете вставлять %Switch1.Status|0%, но подписываться нужно на switch1.status.updated
Собственно, у меня пока всё
Итак, небольшой "ликбез". Технология websockets (вебсокетов) была в своё время разработана для поддержки браузерами обновления содержимого страницы в реальном времени. Т.е. буквально в реальном, а не иммитация оного с помощью технологии AJAX. Основное отличие в том, что в случае AJAX-а браузер периодически отправляет запрос на сервер и разбирает его для изменения состояния страницы, а в случае вебсокетов браузер устанавливает одно постоянное соединение с сервером и получает команды от сервера на инициирование каких-либо изменений. Последнее позволяет избавиться от задержек в обновлении интерфейса и реагировать на серверные изменения сразу, как только они происходят.
Теперь ближе к нашей теме. Что нам даёт переход на вебсокеты:
* Мгновенное обновление интерфейса при изменении данных в системе (сцены, меню, домашние страницы)
* Избавляемся от понятия "время авто-обновления" (меню, домашние страницы)
* "Подписка" на обновления свойств объектов для кастомных интерфейсов (домашние страницы)
* Уменьшается загрузка на сервер, т.к. отключаются AJAX-запросы (сцены, меню, домашние страницы)
Короче, в этом самом рискованном обновлении реализована поддержка вебсокетов со всеми вышеперечисленными плюсами, но обновление слишком серьёзное, чтобы я мог гарантировать стабильную работу.
Как пользоваться -- как обычно, ничего дополнительно настраивать не нужно. После перезапуска системы запускается дополнительный цикл cycle_websockets, который создаёт сервер вебсокетов на порту 8001 (по-умолчанию), после чего весь веб-интерфейс использует для обновления состояния веб-сокеты.
В /config.php можно опционально использовать следующие настройки:
Код: Выделить всё
Define('DISABLE_WEBSOCKETS', 1); // если не закомментировано, то протокол вебсокетов не старует и всё должно работать по-старому
Define('WEBSOCKETS_PORT', 8001); // здесь можно поменять порт, если он занят. если строчку не добавлять, то будет использоваться пот по-умолчанию
Свойства объектов можно по-прежнему вставлять в html-код как %object.property%, так и %object.property|NN%, но при включенных вебсокетах, значение NN (время обновления в секундах) игнорируется и свойство обновляется не в заданном промежутке, а в реальном времени. Если NN не указано, то свойство не обновляется.
Далее, для подписки на событие обновления свойства и использовании его в своём интерфейсе, можно использовать такую конструкцию:
Код: Выделить всё
%switch1.status|0%
<script language="javascript">
$.subscribe('switch1.status.updated',function (_, value) {
alert('New value: '+value);
});
</script>
Важны два момента: во-первых, в коде обязательно должна быть конструкция типа %switch1.status|NN% -- она создаёт событие, на которое можно подписаться (NN в вышеуказанном примере равно 0, но оно может быть любым числом). Причём, эта конструкция может быть даже закомментирована, чтобы не отображаться, например так:
Код: Выделить всё
<!-- %switch1.status|0% -->
Собственно, у меня пока всё