Как получить тип данных UaNode?

#java #opc-ua #milo

#java #opc-ua #мило

Вопрос:

Я использую банки eclipse-milo’s, версия 0.5.3.

Я хотел бы прочитать определенные узлы и сохранить их значения в базе данных. Я намерен динамически создавать столбец базы данных с учетом типа данных. Например: узел типа Float (Идентификаторы.Float) будет ПЛАВАЮЩИМ значением в базе данных.

Я могу подключиться к серверу OPCUA, получить адресное пространство и прочитать значение узла.

 UaNode node = uaClient.getAddressSpace().getNode(nodeId);
DataValue dataValue = node.readAttribute(AttributeId.Value);
Object value = dataValue.getValue().getValue();
 

Как я могу прочитать тип значения данного узла? В приведенном выше примере тип данных узла.
Я попробовал следующее:

 Optional<ExpandedNodeId> dataType = dataValue.getValue().getDataType();        
if (dataType.isPresent()) {
    ExpandedNodeId nodeDataType = dataType.get();
    nodeDataType.getIdentifier();
}
 

Получен идентификатор типа данных (ns=0; i=10), но не тип.

Ответ №1:

Типы данных в OPC UA идентифицируются с помощью NodeID, поэтому то, что вы видите, является нормальным.

Если вам нужна помощь в преобразовании типа данных в «резервный» класс, вы можете обратиться за помощью к DataTypeTree классу:

https://github.com/eclipse/milo/blob/master/opc-ua-sdk/sdk-core/src/main/java/org/eclipse/milo/opcua/sdk/core/DataTypeTree.java

https://github.com/eclipse/milo/blob/master/opc-ua-sdk/integration-tests/src/test/java/org/eclipse/milo/opcua/sdk/core/DataTypeTreeTest.java


 DataTypeTree tree = DataTypeTreeBuilder.build(client);

UaVariableNode currentTimeNode = client.getAddressSpace()
    .getVariableNode(Identifiers.Server_ServerStatus_CurrentTime);

NodeId dataType = currentTimeNode.getDataType();

Class<?> clazz = tree.getBackingClass(dataType);

System.out.println(clazz); // class org.eclipse.milo.opcua.stack.core.types.builtin.DateTime
 

Ответ №2:

Это не решение, однако, возможно, стоит проверить класс Identifiers. Этот класс содержит типы данных OPC UA и создает NodeID на основе значения id типа данных. Вы могли бы написать класс, который отменяет этот процесс и находит тип данных на основе значения id.

Может быть лучшее решение, но я так долго не использовал Eclipse Milo, поэтому в настоящее время я не знаю.