如何获取uanode的数据类型?

yvfmudvl  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(476)

我使用的是eclipsemilo的jars,版本0.5.3。
我想读取特定的节点,并将它们的值存储在数据库中。考虑到数据类型,我打算动态构造数据库列。例如:float(identifiers.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),但不是类型。

bfrts1fy

bfrts1fy1#

这不是一个解决方案,但是也许值得检查identifiers类。此类包含opc ua数据类型,并基于数据类型的id值创建nodeid。您可以编写一个类来反转此过程,并根据id值查找数据类型。
可能有更好的解决方案,但我使用EclipseMilo的时间不长,所以目前我还不知道。

eeq64g8w

eeq64g8w2#

opc ua中的数据类型由nodeid标识,所以您看到的是正常的。
如果需要帮助将数据类型解析为“backing”类,可以查看 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

相关问题