Страница 1 из 21

Поддержка websockets

Добавлено: Вт окт 20, 2015 3:38 pm
sergejey
Очень большое и достаточно рискованное обновление. Пожалуйста, сообщайте о найденных неполадках в работе.

Итак, небольшой "ликбез". Технология 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>
т.е. функция $.subscribe с параметром названиесвойства.updated (выше в примере switch1.status.updated).
Важны два момента: во-первых, в коде обязательно должна быть конструкция типа %switch1.status|NN% -- она создаёт событие, на которое можно подписаться (NN в вышеуказанном примере равно 0, но оно может быть любым числом). Причём, эта конструкция может быть даже закомментирована, чтобы не отображаться, например так:

Код: Выделить всё

<!-- %switch1.status|0% --> 
Во-вторых, имя для подписки на событие используется название объекта/свойства в нижнем регистре. Т.е. вы можете вставлять %Switch1.Status|0%, но подписываться нужно на switch1.status.updated

Собственно, у меня пока всё :)

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 4:34 pm
kostya77
Алиса стоит на Убунте 12 .
После обновления левая панель ( меню управления ) пропала ... просто белое место .
Это только у меня так ?
Кто обновлял Алису установленную на ПК ? у вас все нора ?

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 4:54 pm
f00fc7c8
Обновил Raspberry Pi2, изменений не заметил.

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 6:10 pm
lavstudia
sergejey - Поздравляю! ;)

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 6:45 pm
sergejey
lavstudia писал(а):sergejey - Поздравляю! ;)
Пока рано :)
Ловлю много багов и исправляю по ходу дела.

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 7:26 pm
Vovix
sergejey писал(а):
lavstudia писал(а):sergejey - Поздравляю! ;)
Пока рано :)
Ловлю много багов и исправляю по ходу дела.
т.е. пока не обновлять?

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 8:37 pm
Ivan
Мои баги разбежались. Работает отлично. Обновляется моментально. (Учтите что ещё идёт тестирование)
Обязательно закрыть вкладку с МД. И открыть заново, по F5+Shift не работает WebSocket - если открыто до обновления

ПК хром ВИН10 - 100%

ПК ИЕ ВИН10 - 100%
ПК FireFox ВИН10 - 100%
ПК Opera ВИН10 - 100%

Планшет хром андроид - 100%

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 9:22 pm
ILGAS
после обновления не наблюдаю изменений
у меня даже не файла не цикл cycle_websockets не появилось
файл config.php не изменен.

зы. у меня что то с обновлением((
majordomo пишет что у меня последняя версия.

Re: Поддержка websockets

Добавлено: Вт окт 20, 2015 9:33 pm
Alien
Скрипт изменения статуса датчика движения из камеры стал выдавать ошибку, раньше работал.
Код:
sg("sensorCC.status",1);
clearTimeOut("sensorCCStatusClear");
SetTimeOut('sensorCCStatusClear',"sg('sensorCC.status','0');", 60);

Ошибка:
Notice: Undefined offset: 0 in /var/www/html/modules/objects/objects.class.php on line 364
Notice: Undefined index: status in /var/www/html/modules/objects/objects.class.php(536) : eval()'d code on line 1

Прошу прощения, если не связано, но код не правил - только обновился.
В остальном вроде как все замечательно.

PS
В дебмесе шедулера нашел:
Warning: Not connected in /var/www/html/lib/websockets/client/lib/class.websocket_client.php on line 33

Re: Поддержка websockets

Добавлено: Ср окт 21, 2015 9:20 am
pavelt
ILGAS писал(а):после обновления не наблюдаю изменений
у меня даже не файла не цикл cycle_websockets не появилось
файл config.php не изменен.

зы. у меня что то с обновлением((
majordomo пишет что у меня последняя версия.

Аналогично, такое впечатление, что обновления не происходит, а по факту пишет что последняя версия. У меня вообще нет каталога websockets/server. В каком логе посмотреть, что происходит во время обновления?

И еще вопрос попутно. "Под кнопкой обновить систему" у меня стоит какой-то флажок без описания. Может он какую роль играет?