2017-08-28 61 views
1

我是新來的OPC-UA的宇宙和米洛SDK,所以我會盡我所能解釋我想做什麼。瀏覽服務器名稱空間和訪問自定義引用

我有一個OPC-UA服務器實例正在運行,它將一些節點加載到服務器NameSapce。另一方面,我有一個訂閱此服務器並嘗試瀏覽此節點的客戶端。我可以看到客戶端中的節點,並且可以訪問爲此節點定義的一些引用。我現在想要做的是取得很大的成功,是訪問服務器中定義的引用,UA-Expert可以看到它,但是我的Milo Client實現不能。 自定義引用是在服務器端定義的,我的目標是訪問其「BrowseName」或「DisplayName」。

我相信這可能是一個簡單的問題,但現在我正在努力解決這個問題。

我會留下一些打印屏幕來舉例說明我的意思是在上面的文字:

在紅色箭頭指向參考,我試圖閱讀以下的形象,所以我們可以在第二圖像請參閱具有類型HasComponent的製造和說明是正確的,但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) 

所以ReferenceTypeId是一個new NodeId(1, 4001),這是我試圖在客戶端閱讀的類型。我的代碼基於來自Milo git回購的BrowseNode Exemple。

在這最後的圖像,我們可以看到的地址空間,所以在這裏我們有一些參數,這些參數也存在於參考HasComponent,所以我可以使用了錯誤的方法來訪問一個,我可以我很誠懇地不知道。 enter image description here

在此先感謝您的幫助。


[EDIT 1]

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

[EDIT 2]

enter image description here

當我右擊設備參考它加載所顯示的信息下面。

enter image description here

+0

客戶端代碼是否也列出了您的引用?它寫在米洛嗎? UaExpert是指着你的Milo服務器還是你用的另一臺服務器? –

+0

該代碼列出了它是我的引用,它基於Milo SDK git回購中提供的示例。您可以在我現在編輯的編輯中查找上面的代碼。 UaExpert指向我的Milo服務器,是的。 –

+0

你知道什麼樣的節點設備和模塊?您可以在UaExpert中點擊查看。 –

回答

1

好吧,這個問題似乎是,你只是瀏覽與結點類別節點:對象,變量,引用類型。

您正在查找的HasAMLRoleReferences指向NodeType爲ObjectType的節點,這就是爲什麼你沒有看到它們返回。

+0

邑,你是對的!太感謝了 :) –