Total Kontrol/TKT/Протокол обмена с демоном

Материал из KONANlabs
Перейти к: навигация, поиск

Описание протокола 1.0

Протокол однонаправленный, от страницы к демону. На любое действие пользователя страница формирует событие. При отсутствии событий страница отправляет запросы на обновление через заданный промежуток времени (атрибут refresh элемента daemon).

Пакет представляет собой серию текстовых строк, завершаемую пустой строкой (два CRLF в конце пакета). После передачи любого пакета (событие или обновление) страница не закрывает соединение, демон передаёт данные обновления состояния видимых элементов и закрывает соединение сам. Страница закрывает соединение при отсутствии ответа от демона в течение периода eventrate страницы (атрибут элемента daemon).

Пакет может содержать кадры информации об одном или нескольких видимых элементах. Кадр выглядит следующим образом:

<id видимого элемента><CRLF>
<количество параметров><CRLF>
<параметр 1><CRLF>
....
<параметр n><CRLF>

Количество и назначение каждого параметра определяется типом видимого элемента (см. Формат XML файла). Количество кадров в пакете не ограничено.

Обновления

Для экономии трафика обновления привязываются ко времени. Клиент (открытая в браузере страница) передаёт серверу (демону) запрос на обновление с указанием времени предыдущего обновления в миллисекундах (чтобы демон знал, какие именно обновления нужно передать именно этому клиенту), и имя страницы (чтобы демон не обновлял все страницы). Пакет запроса на обновление:

UPDATE <время> <id страницы><CRLF>
<CRLF>

Время - внутренний счётчик демона, он отдаёт его значение с каждым пакетом данных обновления. Если страница только что открылась - она передаёт демону время 1, демон обновляет всё что есть.

Ответ демона начинается со строки с текущим счётчиком времени, затем (при наличии необновлённых данных) следуют кадры обновления.

События

Для исключения перегрузки клиентской машины, сервера и локальной сети частота отправки событий ограничивается атрибутом eventrate элемента daemon. В период ожидания после отправки события страница не формирует новые события, но отслеживает изменения состояния элементов, по истечении периода ожидания отправляет событие с состоянием изменившихся элементов на момент отправки. Как и обновления, пакет события может содержать кадры для нескольких видимых элементов, с которыми произошли события за период ожидания. Пакет события:

EVENT<CRLF>
<кадр>
[<кадр>]
[...   ]
[<кадр>]
<CRLF>

Описание протокола 2.0

Надмножество версии 1.0. Главное отличие - система идентификации клиентов. Страница идентифицирует рабочую станцию по MAC адресу. Привязка MAC к внутреннему идентификатору веб-интерфейса осуществляется однократно, вручную, открытием URL веб-интерфейса с параметром ?setid=<id>. Если вместо <id> указать delete - привязка удаляется. Если поступает запрос на привязку к id, который уже есть в базе - к этому id привязывается новый MAC. Идентификаторы клиентов могут быть только числовыми.

Если клиент зарегистрирован, все идентификаторы при обмене с ним указываются в нотации :<клиент>:<элемент> (:12:/~dsp/gain/in/1). Обновления без указания id клиента игнорируются зарегистрированными клиентами. В одном пакете EVENT могут быть кадры от разных клиентов.

В запросе на обновление от зарегистрированного клиента id страницы дополняется id клиента аналогичным образом (:12:page_main).

Клиенты могут объединяться в группы. Регистрация клиента в группе - запрос с параметром ?groupadd=<id>, исключение клиента из группы - ?groupremove=<id>. Идентификатор группы может быть только числовым. Один клиент может быть в нескольких группах.

Предопределена группа 0 - все зарегистрированные клиенты. Удалить клиента из неё нельзя.

В протоколе обмена группы обозначаются так же, как клиенты, только id группы предваряется буквой G (:G0:/~dsp/gain/in/1).

Проверка связи

Для поддержания постоянного соединения сервер (апач) может отправлять демону пакет PING<CRLF><CRLF>, демон отвечает PONG<CRLF><CRLF>.

?

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