На одном из проектов по интеграции промышленного оборудования с корпоративными системами встал вопрос: как читать данные с датчиков в реальном времени и при этом сохранить совместимость с REST API внешних потребителей? Решение нашлось в связке Entaxy ION + OPC UA — два разных подхода к одной задаче, которые отлично дополняют друг друга.
В этой статье покажем оба сценария на работающем примере: подключаемся к программному симулятору датчика и передаём данные — через подписку на изменения и через REST-сервис по запросу.
Предварительные требования
Перед началом работы потребуются:
- Entaxy ION — версия 1.10.0 и выше
- JDK 11 — компонент Camel Milo требует Java 9+
- Prosys OPC UA Simulation Server — бесплатный симулятор промышленного оборудования (Community Edition)
- Postman или любой REST-клиент — для тестирования второго сценария
Что такое OPC UA и зачем он нужен
OPC UA (OPC Unified Architecture) — современный открытый стандарт передачи данных в промышленных сетях. Он обеспечивает защищённую и надёжную коммуникацию между устройствами, являясь аппаратно и платформенно независимым: один и тот же протокол одинаково работает на Windows, Linux, встраиваемых системах и промышленных контроллерах.
Ключевое понятие в OPC UA — Node ID (идентификатор узла): уникальный адрес переменной, метода или объекта в адресном пространстве сервера. Node ID состоит из пространства имён (namespace) и идентификатора. Поддерживаются четыре формата: строковый (s=), числовой (i=), GUID (g=) и байтовый (b=). Пример строкового Node ID:
nsu=urn:prosys:SimulationServer;s=Sawtooth.
Архитектура решения
В демонстрации участвуют три компонента:
|
Компонент |
Роль |
|
OPC UA Simulation Server (Prosys) |
Виртуальный датчик; генерирует сигналы: пилообразный, синусоида, случайный |
|
Entaxy ION |
Интеграционная шина; читает данные и передаёт во внешние системы |
|
Postman |
REST-клиент для проверки второго сценария |
Entaxy ION — российская low-code платформа для создания интеграционных маршрутов. Под капотом — Apache Camel для маршрутизации и Apache Karaf как OSGi-контейнер. Поддержка OPC UA реализована через компонент Camel Milo (Eclipse Milo™ implementation).
Шаг 1. Проверка бандлов Camel Milo в Entaxy ION
Перед созданием маршрутов убедитесь, что необходимые бандлы для работы с OPC UA установлены и находятся в статусе Active.
В веб-интерфейсе Entaxy ION перейдите в раздел Deployer → Bundles и найдите бандлы с именем camel-milo. Все они должны иметь статус Active.
Если бандлы camel-milo отсутствуют, установите фичу через консоль Karaf:
feature:install camel-milo
Фича camel-milo обеспечивает поддержку OPC UA для Apache Camel через реализацию Eclipse Milo™ и требует Java 9+ или Java 11+.
Шаг 2. Настройка OPC UA симулятора
Скачайте и запустите Prosys OPC UA Simulation Server. После запуска:
- На главной вкладке Connection найдите адрес OPC UA сервера вида opc.tcp://hostname:53530/OPCUA/SimulationServer — он понадобится для подключения клиента.
- Перейдите на вкладку Objects → Simulation.
- Выберите переменную Sawtooth (пилообразный сигнал).
- На вкладке Attributes скопируйте значение NodeId.
Типичный NodeId переменной Sawtooth выглядит так:
ns=3;s=Sawtooth
Для использования в URI Camel Milo он записывается с указанием namespace URI:
nsu=urn:prosys:OPCUA:SimulationServer;s=Sawtooth
Сценарий 1: Подписка на изменения (Push-модель)
Этот способ подходит для систем мониторинга в реальном времени: данные поступают автоматически при каждом изменении значения узла OPC UA.
Создание профиля и входного коннектора
В Entaxy ION перейдите в раздел Профили, нажмите Add Profile и создайте профиль системы, назвав его, например, opcua-source.
Нажмите Add Connector, установите направление (IN) и тип CUSTOM. В настройках коннектора заполните поле Input route следующим маршрутом Apache Camel:
<route>
<from uri="milo-client:opc.tcp://localhost:53530/OPCUA/SimulationServer
?node=RAW(nsu=urn:prosys:OPCUA:SimulationServer;s=Sawtooth)
&publishingInterval=1000"/>
<log message="OPC UA [Sawtooth] value: ${body}"/>
</route> Разберём параметры URI:
|
Параметр |
Значение |
Описание |
|
opc.tcp://host:port/path |
адрес сервера |
Транспортный адрес OPC UA сервера |
|
node=RAW(…) |
Node ID узла |
Обёртка RAW() защищает спецсимволы от URI-экранирования |
|
publishingInterval |
1000 |
Интервал публикации данных сервером, мс (по умолчанию 1000.0) |
Важно о RAW(…): значение параметра node содержит символы = и ;, которые имеют специальное значение в URI. Обёртка RAW(…) указывает Camel не экранировать содержимое, что обязательно для корректной работы.
Проверка в логах Karaf
После сохранения и запуска маршрута (кнопка Start в карточке профиля) откройте раздел Monitoring → Logs в Entaxy ION. При успешном подключении вы увидите поток значений:
INFO route1 - OPC UA [Sawtooth] value: DataValue{
value=Variant{value=42.857, dataType=Double},
statusCode=StatusCode{name='Good'},
serverTime=DateTime{...}
}
INFO route1 - OPC UA [Sawtooth] value: DataValue{
value=Variant{value=43.214, dataType=Double},
statusCode=StatusCode{name='Good'},
...
}Разберём параметры URI:
|
Параметр |
Значение |
Описание |
|
opc.tcp://host:port/path |
адрес сервера |
Транспортный адрес OPC UA сервера |
|
node=RAW(…) |
Node ID узла |
Обёртка RAW() защищает спецсимволы от URI-экранирования |
|
publishingInterval |
1000 |
Интервал публикации данных сервером, мс (по умолчанию 1000.0) |
Важно о RAW(…): значение параметра node содержит символы = и ;, которые имеют специальное значение в URI. Обёртка RAW(…) указывает Camel не экранировать содержимое, что обязательно для корректной работы.
Проверка в логах Karaf
После сохранения и запуска маршрута (кнопка Start в карточке профиля) откройте раздел Monitoring → Logs в Entaxy ION. При успешном подключении вы увидите поток значений:
INFO route1 - OPC UA [Sawtooth] value: DataValue{
value=Variant{value=42.857, dataType=Double},
statusCode=StatusCode{name='Good'},
serverTime=DateTime{...}
}
INFO route1 - OPC UA [Sawtooth] value: DataValue{
value=Variant{value=43.214, dataType=Double},
statusCode=StatusCode{name='Good'},
...
}Здесь используется direct:getOpcValue — внутренняя точка вызова, которую будет дёргать REST-сервис. Блок с Groovy-скриптом преобразует объект DataValue, возвращаемый Camel Milo, в JSON без необходимости создавать отдельный Java-класс процессора.
Создание REST-сервиса
В разделе Сервисы → REST нажмите Add Service и создайте публичный GET-эндпоинт. В настройках укажите путь, например /opcua/value, и привяжите его к маршруту direct:getOpcValue через параметры входного потока.
Тестирование через Postman
Выполните GET-запрос:
GET http://<host>/opcua/value
Ответ сервиса:
{
"nodeId": "ns=3;s=Sawtooth",
"value": 42.857,
"statusCode": "Good"
}REST-сервис вызывает маршрут выходного коннектора, тот обращается к OPC UA серверу, считывает актуальное значение и возвращает его JSON-ответом клиенту.
Сравнение двух подходов
|
Сценарий 1: Подписка |
Сценарий 2: REST-запрос |
|
|
Модель |
Push (данные поступают автоматически) |
Pull (данные запрашиваются вручную) |
|
Применение |
Мониторинг, алерты, SCADA |
Внешние системы, дашборды, API |
|
Поле коннектора |
Input route (IN) |
Output route (OUT) |
|
Camel URI |
milo-client как consumer () |
milo-client как producer () |
|
Ключевой параметр |
publishingInterval |
— |
|
Задержка |
Равна publishingInterval |
Время RT-запроса к серверу |
|
Нагрузка на OPC UA сервер |
Постоянное подписочное соединение |
Соединение по требованию |
Итог
Оба подхода взаимодополняют друг друга: подписка обеспечивает непрерывный поток для онлайн-мониторинга, а REST-сервис — удобный API для внешних систем, которым данные нужны по запросу. Вместе они позволяют Entaxy ION работать как с промышленным мониторингом, так и с корпоративными ИС — без написания кастомного кода на уровне протокола.
Компонент camel-milo поддерживает все форматы Node ID (строковый, числовой, GUID, opaque), настройку политик безопасности (TLS, аутентификацию) и работу в режиме клиента и сервера OPC UA — это делает Entaxy ION полноценным инструментом для IIoT-интеграции.
Источник: https://habr.com/ru/articles/1039756/
🔗 Entaxy ION + OPC UA: два способа получить данные с промышленного оборудования