org.eclipse.milo opcua库浏览所有节点,部分节点查看不到

   
    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);
        }

    }


  
   

相关推荐

  1. 树形结构根据子节点ID查找所有节点ID

    2024-06-18 11:56:01       39 阅读
  2. daemonset会部署节点

    2024-06-18 11:56:01       32 阅读
  3. 链表所有节点

    2024-06-18 11:56:01       28 阅读
  4. 测试:如何查看节点进程?

    2024-06-18 11:56:01       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 11:56:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 11:56:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 11:56:01       87 阅读
  4. Python语言-面向对象

    2024-06-18 11:56:01       96 阅读

热门阅读

  1. 自然语言处理nlp概述

    2024-06-18 11:56:01       41 阅读
  2. 等保测评机构选择与测评委托流程全解析

    2024-06-18 11:56:01       34 阅读
  3. Per 语言入门学习

    2024-06-18 11:56:01       33 阅读
  4. 【Vue】图片懒加载的实现

    2024-06-18 11:56:01       30 阅读
  5. 后端开发框架有哪些?

    2024-06-18 11:56:01       32 阅读
  6. DDei在线设计器-API-DDeiEditor

    2024-06-18 11:56:01       41 阅读
  7. mongosh 和mongo 命令行连接MongoDB

    2024-06-18 11:56:01       56 阅读
  8. python基础语法(工程向)-Stage2

    2024-06-18 11:56:01       37 阅读
  9. C#使用OpenXml读取Word、PPT、Excel文档内容

    2024-06-18 11:56:01       39 阅读