Протокол Digispot Events (XML версия)¶
- Table of contents
- Протокол Digispot Events (XML версия)
Модель¶
Протокол представляет собой трансляцию в виде XML внутреннего протокола обмена событиями. Используя данный протокол, можно общаться с приложением Digispot II, которое предоставило возможность подключения.
- протокол описывает общение двух приложений (хостов), установивших между собой связь по протоколу TCP/IP. Соответственно, одно является TCP-сервером, а другое TCP-клиентом. Но эти роли не имеют отношения к данному протоколу, а только к механизму установки связи и процедуре первоначального хендшейка. В дальнейшем обмене данными роли типа клиент и сервер отсутствуют.
- данные передаются в виде текста в кодировке UTF-8, содержащего XML.
- каждая XML-посылка терминируется одиночным нулевым байтом, в других местах байты со значением 0 не встречаются никогда.
- если соединение было разорвано, подключение выполняется повторно, с самого начала.
- соединение поддерживается постоянно, протокол не требует разрыва соединения. При обрыве TCP-клиент инициирует попытки восстановления связи с сервером.
- каждый участник по данному протоколу называется хост.
- между двумя хостами допускается наличие только одного соединения.
- хост имеет уникальное строчное имя, чувствительное к регистру, уникальное среди всех других хостов данной системы. Правила именования совпадают с правилами именования XML-тегов. Имя хоста не имеет отношения к имени компьютера.
- один хост может иметь произвольное кол-во соединений другими хостами, причем он может выступать и TCP-сервером и TCP-клиентом одновременно. Но во всех используемых соединениях хост имеет одно и тоже уникальное имя.
- за исключением хендшейка, все остальные посылки требуют указания получателя.
- Получатель - это объект, существующий внутри хоста и имеющий уникальный строчный идентификатор, чувствительный к регистру, правила именования совпадают с правилами именования XML тегов. Ближайшая аналогия - tcp-адрес и порт. Порт идентифицирует получателя внутри адреса.
- формат имени получателя общего вида: /host_name.receiver_name
Формат XML¶
XML рассматривается как древовидная структура именованных типизированных значений. В каждом теге присутствует атрибут dt, описывающий тип содержимого тега.
dt может быть:
- i4 - 4 bytes integer
- i8 - 8 bytes integer
- f - float
- b - binary
- s - string. В этом случае атрибут dt опускается за исключением специальных случаев
Если dt не указан, то тег считается:
- контейнером
- строкой, если нет вложенных тэгов, но есть текстовый узел
Тег не может содержать в перемешку текстовые узлы и дочерние тэги одновременно.
Тег верхнего уровня всегда называется .
Если тег не содержит детей и атрибута dt - он считается пустым контейнером, а не пустой строкой. Для редких случаев передачи значения пустой строки используется явное указание dt="s".
- пустой контейнер
- пустая строка
Хендшейк¶
Хендшейк происходит непосредственно после успешной установки TCP/IP-соединения.
- клиент инициировал и установил TCP соединение с сервером.
- клиент посылает серверу посылку c указанием имени своего хоста client_name (заменятся реальным именем хоста), и логина и пароля к серверу. Тэги LOGIN и PASSWORD опциональны, и могут быть опущены, если не требуются.
<code class="xml">
<root>
<Type>HOST</Type>
<HOST>client_name</HOST>
<LOGIN>login1</LOGIN>
<PASSWORD>password1</PASSWORD>
</root>
- В ответ должно придти посылка такого вида, с именем удаленного хоста:
<code class="xml">
<root>
<Type>HOST</Type>
<HOST>host_name</HOST>
</root>
- Хендшейк закончен. Соединение между хостом client_name и хостом host_name установлено. Далее начинается обмен сообщениями, для которых связь собственно и устанавливалась. В случае потери TCP/IP-соединения клиент должен закрыть сокет и перейди к пункту 1.
- Если в ответ получено сообщение с другим типом - клиент должен отключиться и начать все сначала.
Типы посылок¶
В процессе хендшейка и последующего обмена могут передаваться посылки следующих типов.
Type=HOST¶
Используются при хендшейке.
Type=ERR¶
Сообщение об ошибке. Может придти в ответ на хендшейк или любого другой пакет.
Содержит единственный тег ERR_STR - с описанием ошибки.
<code class="xml">
<root>
<Type>ERR</Type>
<ERR_STR>сообщение об ошибке</ERR_STR>
</root>
Type=EVT¶
Обычная посылка - событие. Не подразумевает ответа.
- Обязательные теги:
- Dst - получатель
В случае посылки хосту, подключенному к другой стороне сокета, указывается только получатель, без указания имени хоста: receiver, в случае транзитной посылки другому хосту указывается полное имя получателя: /host.receiver - Cmd - тип события
- Src - отправитель
- Dst - получатель
- Необязательные теги:
- ARGS - тег, содержащий произвольную XML-структуру дополнительных параметров, уникальную для данного типа Cmd.
Пример:
<code class="xml">
<root>
<Type>EVT</Type>
<Cmd>GET_VER</Cmd>
<Dst>SYS_THR</Dst>
<Src>Src1</Src>
</root>
Type=ASK¶
То же, что и Evt, но требующее ответа.
Имеет дополнительный обязательный тег Id - номер данной посылки. В ответ должна придти посылка с типом REP:
<code class="xml">
<Id dt='i4'>1234</Id>
Type=REP¶
Ответ на ASK. То же, что и Cmd, но полученное в ответ на ASK
Имеет дополнительный обязательный тег Id - номер посылки, ответ на которую получен.
Широковещательные посылки (NOTIFY)¶
Если необходимо послать сообщение, которое может получить любой желающий, то в качестве получателя указывается NOTIFY
Формат аргументов (ARGS)¶
Содержимое посылок зависит от их типа, заранее не определено и известно только получателям, обменивающимся посылками такого типа. Существует единственное правило: не должно быть событий с одинаковым Cmd и разной структурой XML узла ARGS.