Подписка на уведомления о значениях тега по протоколу WebSocket

31 июля 2025

ID 212101

При использовании Kaspersky Industrial CyberSecurity for Networks API стороннее приложение может создавать подписку на уведомления об изменении значений определенного тега. Для создания подписки и получения уведомлений используется протокол WebSocket.

Сценарий подписки для стороннего приложения состоит из следующих этапов:

  1. Стороннее приложение устанавливает соединение с Сервером Kaspersky Industrial CyberSecurity for Networks через коннектор для этого приложения с использованием сервера REST API.

    После успешного соединения с Сервером коннектору отправляется токен аутентификации. Коннектор использует токен аутентификации для всех последующих взаимодействий с Сервером в этом сеансе (в частности для запроса своей конфигурации с Сервера).

  2. Стороннее приложение подключается с использованием WebSocket и отправляет запрос для создания подписки на уведомления о получении значений нужного тега.

    Сервер Kaspersky Industrial CyberSecurity for Networks принимает запрос и создает подписку. Для отправки запроса используются соответствующие функции, предусмотренные протоколом WebSocket.

  3. Kaspersky Industrial CyberSecurity for Networks обнаруживает в трафике новое значение при чтении или записи тега.
  4. Kaspersky Industrial CyberSecurity for Networks отправляет полученное значение тега стороннему приложению, для которого действует подписка на уведомления о получении значений этого тега.

Основные особенности реализации подписки:

  • После того, как стороннее приложение указывает нужные теги Kaspersky Industrial CyberSecurity for Networks, Сервер отправляет подтверждение о возможности получать значения этих тегов. Далее стороннее приложение ожидает поступление значений этих тегов по установленному соединению.
  • Для создания и сопровождения подписки используется протокол WebSocket и соединение по тому же адресу, который используется сервером REST API.
  • Сервер Kaspersky Industrial CyberSecurity for Networks поддерживает не более одной активной подписки на значения тегов. Если активная подписка уже создана и используется, при попытке создания еще одной подписки возвращается ошибка о слишком большом количестве подключений.
  • Стороннее приложение имеет возможность в любой момент закрыть установленное соединение по подписке для прекращения получения значений тега.
  • Подписка прекращается либо после ее закрытия сторонним приложением, либо при разрыве соединения. Если Сервер Kaspersky Industrial CyberSecurity for Networks был временно недоступен (разорвано соединение) и отправка значений по подписке не выполнялась, то после восстановления соединения стороннему приложению потребуется заново подписаться на получение значений тегов.

Подключение с использованием WebSocket

Для получения тегов по подписке могут использоваться как стандартные функции WebSocket, так и библиотека SignalR Core. Пакеты для работы с библиотекой SignalR Core доступны для наиболее распространенных языков программирования: С++, С#, Java, Python, Go, JavaScript/TypeScript.

Для подключения с использованием WebSocket вам нужно указывать следующий адрес:
<адрес publicApi из файла свертки>/kics4net/api/v4/tag-values

При этом указываемый протокол в строке адреса зависит от используемой функциональности для подключения.

Если используется библиотека SignalR Core, строка адреса начинается с https://. Например:
https://kics-server:8080/kics4net/api/v4/tag-values

Если используются стандартные функции WebSocket, в строке адреса нужно заменить https на wss. Например:
wss://kics-server:8080/kics4net/api/v4/tag-values

Если при подключении не предоставлен токен аутентификации (или предоставленный токен не прошел проверку), в ответ на открытие подключения сервер возвращает код 401.

Создание подписки на значения тегов

Для создания подписки требуется выполнить запрос с именем метода GetTagValuesStream.

Аргумент запроса состоит из следующих полей:

  • tagIdentifiers – массив идентификаторов тегов, значения которых нужно получать по подписке.
  • assetName, tagName – значения, представляющие имя устройства и имя тега (используются для идентификации тега, на значения которого нужно создать подписку).
  • samplingRateHz – частота сэмплирования значений тегов (используется для уменьшения объема передаваемых данных). Если для поля задано нулевое значение, сэмплирование не выполняется.

Если аргумент создания подписки не удовлетворяет требованиям к полям, возвращается ошибка с описанием проблемы.

Подтверждение подписки

При подтверждении подписки сервер возвращает по одному результату подтверждения для каждого тега, подходящего под значения tagIdentifiers в запросе.

Ответ с подтверждением подписки состоит из следующих полей:

  • result – статус подписки на значение тега. Может принимать значения:
    • ok – подписка успешно создана;
    • notFound – тег с указанными assetName, tagName не найден.
  • tagIdentifier – идентификатор тега, аналогичный одному значению из массива tagIdentifiers аргументов запроса на создание подписки.
  • tagId – уникальный идентификатор тега в программе. Может быть использован для получения информации о теге через Kaspersky Industrial CyberSecurity for Networks API, а также для идентификации тега в ответе с его значениями.

Значения тегов по подписке

Программа отправляет значения тегов по подписке в структуре полей. На верхнем уровне в структуре представлены следующие поля:

{

    "value": {

        "tagId": <уникальный идентификатор тега в программе>,

        "tagValue": "<JSON-объект с данными тега>"

    }

}

Информация о новом значении тега отправляется в стороннее приложение в формате JSON. Отправляемый объект с данными содержит следующие поля:

  • n – тип данных тега, представленный именем из TagStructure.
  • ts – время регистрации последнего обновления значений тега. Указывается в микросекундах от 01.01.1970.
  • dn – направление передачи. Может принимать значения: r, w, rw.
  • mp – идентификатор точки мониторинга.
  • d – содержимое полей тега.

Атрибут d представляет словарь, в котором каждый ключ является именем поля тега нулевой иерархии. Значение каждого поля имеет следующие атрибуты:

  • t – обязательный атрибут, указывающий один из следующих типов данных:
    • u – UINT64.
    • i – INT64.
    • b – BOOL.
    • d – DOUBLE.
    • s – строка UTF8.
    • t – время в микросекундах от 01.01.1970.
    • e – ENUM. Дополнительно поле содержит следующие атрибуты:
      • n – имя типа ENUM;
      • v – исходное значение ENUM;
      • s – строковое значение ENUM.
    • st – структура.
    • un – UNION.
  • v – обязательный атрибут, указывающий значение поля тега.
  • n – имя типа ENUM из TagStructure (только для типа e – ENUM).
  • s – строковое значение ENUM (только для типа e – ENUM).

    Пример:

    - enum:

        name: OpType # Имя типа ENUM (атрибут 'n')

        data:

            0: NUL # 0 запишется в атрибут 'v', NUL запишется в 's'

            1: PULSE_ON

            2: PULSE_OFF

  • x – идентифицирует основное значение тега.

    Формат: "x": 1

    Для всех остальных полей тега атрибут x отсутствует.

  • m – специальный маркер параметра тега. Соответствует атрибуту marker со следующими полями:
    • q – значение атрибута качества.
    • ts – статус метки времени, отображающий её правильность, временное состояние или причину ошибки при проверке.
    • ds – статус данных.
    • o – источник, от которого пришло значение или команда.
    • t – время последнего обновления значений тега, взятое из трафика.
    • ct – причина передачи.

    Формат: "m": "q"

Примеры получения значений тегов по подписке

Ниже представлен пример получения значений тегов по подписке с использованием стандартных функций WebSocket на языке Python.

Предварительно требуется выполнить команду:
pip install websocket_client

Ниже представлен пример получения значений тегов по подписке с использованием библиотеки SignalR Core на языке Python.

Предварительно требуется выполнить команду:
pip install signalrcore

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!