org.eclipse.milo opcua库浏览所有节点,部分节点查看不到,并没有报错
前提:使用pom
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>sdk-client</artifactId>
<version>0.xx.xx</version>
</dependency>
原因:
请求节点时,当节点个数过多时;服务端是按照多个报文返回的。现有方法browse(NodeId nodeId)并不支持。针对现有browse方法源码进行改造,代码如下:
@Override
public CompletableFuture<List<Node>> browse(NodeId nodeId) {
UInteger nodeClassMask = uint(
NodeClass.Method.getValue() |
NodeClass.Object.getValue() |
NodeClass.Variable.getValue());
UInteger resultMask = uint(BrowseResultMask.All.getValue());
CompletableFuture<BrowseResult> future = client.browse(new BrowseDescription(
nodeId,
BrowseDirection.Forward,
Identifiers.HierarchicalReferences,
true,
nodeClassMask,
resultMask
));
List<Node> allNode = new ArrayList<>();
try {
BrowseResult result = future.get();
extracted(result, allNode);
List<ReferenceDescription> references = l(result.getReferences());
List<Node> list2 = references.stream()
.flatMap(r -> opt2stream(
r.getNodeId()
.local(client.getNamespaceTable())
.map(id -> createNode(id, r.getNodeClass()))
))
.collect(toList());
allNode.addAll(list2);
CompletableFuture<List<Node>> finalRes = CompletableFuture.supplyAsync(() -> {
return allNode;
});
return finalRes;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void extracted(BrowseResult result, List<Node> allNode) {
try {
if (result.getContinuationPoint().isNotNull()) {
BrowseResult br = client.browseNext(false, result.getContinuationPoint()).get();
List<ReferenceDescription> references = l(br.getReferences());
List<Node> list1 = references.stream()
.flatMap(r -> opt2stream(
r.getNodeId()
.local(client.getNamespaceTable())
.map(id -> createNode(id, r.getNodeClass()))
))
.collect(toList());
allNode.addAll(list1);
extracted(br, allNode);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}