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方法源码进行改造,代码如下:
@Overridepublic 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);}}