代码之家  ›  专栏  ›  技术社区  ›  af-silva

浏览服务器命名空间并访问自定义引用

  •  1
  • af-silva  · 技术社区  · 8 年前

    我有一个OPC-UA服务器实例正在运行,它将一些节点加载到服务器名称空间。另一方面,我有一个客户端订阅此服务器并尝试浏览此节点。我可以看到客户端中的节点,并且可以访问定义到此节点的一些引用。我现在试图做的是访问服务器中定义的引用,UA专家可以看到它,但我的Milo客户端实现无法看到。 “或” ".

    我相信这可能是一个简单的问题,但现在我正在努力解决这个问题。

    我将留下一些印刷屏幕来举例说明我在上文中的意思:

    在下面的图片中,红色箭头指向我试图阅读的参考,因此在第二张图片中,我们可以看到具有以下类型的制造和描述: HAS组件 簧片是否正确,但 HasAMLRoleReference公司

    Custom Reference

    Debug info

    这段代码不是我的,所以我不能保证正确的实现,但在服务器端,我知道会发生这种情况:

    server.getNodeMap().addReference(new Reference(
                        new NodeId(NAMESPACE_IDX, getPrefix(e.getParentElement())),
                        new NodeId(1, 4001),// new NodeId(1,4001) = HasAmlRoleReference
                        server.getNodeMap().getNode(new NodeId(NAMESPACE_IDX, name)).get().getNodeId().expanded(), 
                        server.getNodeMap().getNode(new NodeId(NAMESPACE_IDX, name)).get().getNodeClass(), 
                        true)
    

    所以 参考类型ID 是一个 new NodeId(1, 4001) 这就是我试图在客户端读取的类型。我的代码基于Milo git repo中的BrowseNode示例。

    因此,我可能会使用错误的方法来访问我无法访问的方法 ,我真的不知道。 enter image description here

    提前感谢您的帮助。


    public void browseNode(String indent, OpcUaClient client, NodeId browseRoot){
    try
    {
    
      String equipmentNamespace = "openMOSRoleClassLib/Equipment";
      String skillNamespace = "openMOSRoleClassLib/Skill";
      String moduleNamespace = "openMOSRoleClassLib/Equipment/Module";
    
      BrowseDescription browse = new BrowseDescription(
              browseRoot,
              BrowseDirection.Forward,
              Identifiers.References,
              true,
              //uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
              uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue() | NodeClass.ReferenceType.getValue()),
              uint(BrowseResultMask.All.getValue())
      );
    
      BrowseDescription browse2 = new BrowseDescription(
              browseRoot,
              BrowseDirection.Forward,
              new NodeId(1, 4001),
              true,
              //uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
              uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue() | NodeClass.ReferenceType.getValue()),
              uint(BrowseResultMask.All.getValue())
      );
    
      BrowseResult browseResult = client.browse(browse).get();
      List<ReferenceDescription> references = toList(browseResult.getReferences());
    
      System.out.println("\n");
      for (ReferenceDescription rd : references)
      {
    
        //logger.info("Node={}", rd.getBrowseName().getName());
        System.out.println(indent + "Node=                         " + rd.getBrowseName().getName());
        System.out.println(indent + "Type=                         " + rd.getTypeId().toParseableString());
        System.out.println(indent + "NodeId:                       " + rd.getNodeId().toString());
        System.out.println(indent + "Other INFO[]:                 " + rd.getTypeDefinition().toParseableString());
        System.out.println(indent + "Other INFO[NamespaceIndex]:   " + rd.getReferenceTypeId().expanded().getNamespaceIndex());
        System.out.println(indent + "Other INFO[ReferenceTypeId]:  " + rd.getReferenceTypeId().expanded().toString());
    
        // recursively browse to children
        rd.getNodeId().local().ifPresent(nodeId -> browseNode("\t" + indent, client, nodeId));
    
      }
    } catch (InterruptedException | ExecutionException e)
    {
      logger.error("Browsing nodeId={} failed: {}", browseRoot, e.getMessage(), e);
    }
    }
    

    enter image description here

    当我右键单击 参考它加载如下所示的信息。

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  1
  •   Kevin Herron    8 年前

    好的,问题似乎是您只浏览带有NodeClass的节点:Object、Variable、ReferenceType。

    您正在查找的HasAMLRoleReferences指向具有ObjectType NodeClass的节点,这就是为什么您没有看到它们返回的原因。