Я пытаюсь записать некоторые значения на сервер OPC UA. Чтобы сделать это надежно, мне, вероятно, нужно знать DataType узла, в который я пытаюсь записать, иначе мне кажется, что я склонен к получению несовпадений типов данных.
Допустим, мой сервер имеетузел TestNodeOne с типом данных Int16
Мой API получает указание записать значение 3 в этот узел. Теперь мне нужно принять решение: обрабатывать ли я 3 как целое число или как короткую строку? Для этого кажется, что мне понадобится тип данных моего узла.
То, что я пробовал
Мой подход состоял в том, чтобы просто просмотреть сервер и создать кэш всех его узлов ссоответствующий тип данных. Вот как это выглядит:
// Recursively browse entire server
@SuppressWarnings("deprecation")
private HashMap<String, NodeId> browseNode(String indent, OpcUaClient client, NodeId browseRoot, HashMap<String, NodeId> nodesMap) {
BrowseDescription browse = new BrowseDescription(
browseRoot,
BrowseDirection.Forward,
Identifiers.References,
true, uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
uint(BrowseResultMask.All.getValue()));
try {
BrowseResult browseResult = client.browse(browse).get();
List<ReferenceDescription> references = toList(browseResult.getReferences());
for (ReferenceDescription rd : references) {
UShort namespaceIndex = rd.getNodeId().getNamespaceIndex();
String identifier = rd.getNodeId().getIdentifier().toString();
NodeId node = new NodeId(namespaceIndex, identifier);
nodesMap.put(rd.getNodeId().getIdentifier().toString(), node);
logger.info("----------------------------------------------------------------");
logger.info(identifier);
logger.info("TYPE " + rd.getTypeDefinition()); // Not the right node
logger.info("TYPE " + rd.getTypeId().getIdentifier().toString()); // Not the right node
logger.info("TYPE " + rd.getReferenceTypeId().getIdentifier().toString()); // Not the right node
rd.getNodeId().local().ifPresent(nodeId -> {
browseNode(indent + " ", client, nodeId, nodesMap);
});
}
} catch (InterruptedException | ExecutionException e) {
logger.error("Browsing nodeId={} failed: {}", browseRoot, e.getMessage(), e);
}
return nodesMap;
}
Я не могу понять, как получить тип данных узла. Я думаю, что я не на том пути. Как я могу узнать тип данных узла?