如何获取 UaNode 的数据类型?

How to get the DataType of an UaNode?

我正在使用 eclipse-milo`s jar,版本 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();

如何读取给定节点值的类型?在上面的示例中,node 的数据类型。 我尝试了以下方法:

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

接收到数据类型的标识符(ns=0;i=10),但不是类型。

这不是解决方案,但也许值得检查标识符 class。此 class 包含 OPC UA 数据类型,并根据数据类型的 id 值创建一个 NodeId。您可以编写一个 class 来反转此过程并根据 id 值查找数据类型。

可能有更好的解决方案,但我使用 Eclipse Milo 的时间不长,所以目前我不知道。

OPC UA 中的数据类型由 NodeId 标识,因此您看到的是正常的。

如果您需要帮助将数据类型解析为“支持”class,您可以查看 DataTypeTree class 寻求帮助:

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