Коммуникационный протокол SberMobile

Протокол SberMobile используется для взаимодействия между SberMobile Server, SberMobile агентом и SberMobile IIoT Platform Clientом. Связь осуществляется по одиночному TCP-соединению, которое опционально защищается SSL/TLS шифрованием.

На протяжении коммуникационной сессии обе стороны обмениваются командами. В этой главе инициатор команд называется клиентом, а другая сторона называется сервером:

  • Во взаимодействии SberMobile Server и SberMobile IIoT Platform Client, инициатором является SberMobile IIoT Platform Client
  • Во взаимодействии SberMobile Server и агента SberMobile, инициатором является <SberMobile Server>

На данный момент существуют 2 версии протокола: 2 и 3. Все различия будут описаны далее.

Инкапсуляция команды

Команды инкапсулируются при помощи символов <STX> (0x02) and <CR> (0x0D). Команды извлекаются из потока данных, а все остальные данные отбрасываются. Другие аспекты зависят от версии протокола.

Версия 2

Структура инкапсуляции комманды следующая:

<STX>command<CR>

Если есть два и более символов <STX> без <CR>, все данные, принадлежащие текущему потоку, отбрасываются на каждый полученный <STX>:

<STX>aaa<STX>bbb<CR> понимается как команда bbb.

Версия 3

Структура инкапсуляции комманды следующая:

<STX><L1><L2><L3><L4><T>command<CR>

После символа <STX> следует 4-байтовая символическая структура <L1><L2><L3><L4>. Это командная длина в байтах.

Далее <T> - это командный тип байта. В этой версии протокола команда может быть двух видов: Raw (0) и Compressed (1). Raw обознает, что команда отправлена в качестве первичного char массива. Compressed обозначает команду, которая отправляется сжатой в качестве ZLIB байтного массива.

Затем команда проходит в первичном или сжатом состоянии, инкапсуляция закрывается, используя символ <CR>.

Пример инкапсуляции команды для версии протокола №3: <STX><0><0><0><7><0>R/123/A<CR>

Структура команды

Каждая команда состоит из нескольких частей, разделенных символами 0x17 (“Разделитель команд”). Символ разделителя команд в данном руководстве представлен  символом /. Например:

<STX>aaa/bbb/ccc<CR>

содержит три части: aaa, bbb и ccc.

Зарезервировано три символа, которые не могут появляться внутри команды:

Код символа

Имя символа

0x02

STX

0x0D

CR

0x17

ETB

Для каждой команды характерна следующая структура:

<STX>command_code/command_parameters…<CR>

command_code - это отдельный символ, один из:

M

Команда “Message”

R

Команда “Reply”

command_parameters - это один или несколько параметров, относящихся к коду команды, разделённые символом /.

Команды

Команда "message”

Структура этой команды следующая (с этого момента, первый символ <STX> и оконечный <CR> не указываются):

M/message_ID/message_code/message_parameters…

message_ID уникальный для текущей сессии.

message_code - это символ, указывающий на тип сообщения. Доступные коды сообщения:

S

сообщение “Start”

O

сообщение “Operation”

E

сообщение “Event”

message_parameters - это один или более параметров, характерных для кода сообщения, разделяемого символом /.

Команда "reply"

R/reply_ID/reply_code/reply_parameters...

reply_ID должен соответствовать ID сообщения, на которое отвечает.

Параметр reply_code - это признак, который указывает на тип ответа. Доступные коды ответа:

A

Успешно (далее может следовать необязательный параметр data_table, см кодирование таблиц данных)

D

Отклонено

E

Ошибка (далее может следовать один или два параметра: сообщение об ошибке и/ или  кодированная строка подробного описания ошибки)

L

Учетная запись пользователя в настоящее время заблокирована из-за нарушения ограничений системы безопасности

M

Операция запрещена, так как сервер нахоится в режиме обслуживания

Сообщения

Сообщение “start”

M/message_ID/S/protocol_version

Формат данного сообщения в дальнейшем не изменяется. Его должен отправлять клиент, как самую первую команду во время обмена данными с сервером. Сервер возвращает ошибку, если какое-либо другое сообщение отправляется раньше, чем было отправлено сообщение Start.

protocol_version - это целое число, указывающее на версию протокола взаимодействия, поддерживаемого клиентом. Текущая версия 3.

Сервер отвечает на команду Start командой Reply. Если версия протокола, заданная клиентом, поддерживается сервером, код ответа - Success, в ином случае он отвегается. См. описание команды Ответ.

Сообщение “operation”

M/message_ID/O/operation/context_name/entity[/data_table]

Команда Operation приказывает серверу выполнить операцию на заданном контексте.

Operation - это свойство, определяющее операцию, которая должна быть выполнена. context_name - это имя контекста, для которого выполняется запрашиваемая операция. entity - это параметр операции. Это может быть имя переменной, если операция - “Set Variable”, или имя функции, если операция  - “Call Function”.

Список доступных кодов операций:

G

Получить переменную

S

Установить переменную

C

Вызвать функцию

L

Добавить слушателя события

R

Удалить слушателя события

data_table - это необязательный параметр, содержащий, характерные для операции данные. См. приложение кодирование таблиц данных .

Сообщение “event”

M//E/context_name/event_name/event_level/event_ID/event_listener_ID/data_table

Это сообщение отправляется клиенту, когда событие , именуемое event_name, происходит в context_name и этот клиент был ранее добавлен как слушатель данного события. Оно не требует ответа от клиента. Если событие постоянно, поле event_ID содержит его уникальный ID. event_listener_ID - это целое число, которое указывает на объект слушателя на стороне клиента. data_table содержит данные, специфичные для события.

Примечание: Событие "event" имеет пустой параметр message_ID.

Операции

Операция “получить переменную”

M/message_id/O/G/context _name/variable_name

Эта операция возвращает variable_name из context_name.

Если переменная обнаружена, и не возникает ошибка, ответ на эту команду будет содержать таблицу данных со значением запрашиваемой переменной:

R/reply_id/A/data_table

Операция “установить переменную”

M/message_id/O/S/context _name/variable_name/data_table

Эта операция устанавливает для variable_name , принадлежащему context_name, значение, содержащееся в data_table.

Если значение переменной было успешно изменено, сервер ответит:

R/reply_id/A

Операция “вызвать функцию”

M/message_id/O/C/context _name/function_name/data_table

Эта операция вызывает function_name из context_name с data_table в качестве входного параметра.

Если не возникает ошибок, ответ содержит таблицу данных, возвращаемую функцией:

R/reply_id/A/data_table

Операция “добавить слушателя события”

M/message_id/O/L/context _name/event_name/event_listener_ID

Эта операция регистрирует слушателя с заданным целым числом - идентификатором event_listener_ID для event_name в context_name. Когда происходит событие, клиент получает сообщение “Event” (E) с кодом event_listener_ID.

Опциональный параметр filter_text позволяет заранее отфильтровать события, основанные не представленном выражении фильтра. Это выражение будет расситываться для каждого подходящего события, и если результатом будет false, событие не отправится клиенту.

Среда вычисления выражения фильтра:

Контекст по умолчанию

Отсутствует.

Таблица данных по умолчанию

Таблица данных, содержащая специфичные для события данные.

Строка по умолчанию

0

Переменные среды

Только стандартные переменные.

При успешном добавлении слушателя события, сервер отвечает:

R/reply_id/A

Операция "удалить слушателя события"

M/message_id/O/R/context _name/event_name/event_listener_ID

Эта операция удаляет слушателя с заданным event_listener_ID , принадлежащим event_name, в context_name.

При успешном удалении слушателя события, сервер отвечает:

R/reply_id/A

Кодирование таблиц данных

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