我是新來的OPC-UA的宇宙和米洛SDK,所以我會盡我所能解釋我想做什麼。瀏覽服務器名稱空間和訪問自定義引用
我有一個OPC-UA服務器實例正在運行,它將一些節點加載到服務器NameSapce。另一方面,我有一個訂閱此服務器並嘗試瀏覽此節點的客戶端。我可以看到客戶端中的節點,並且可以訪問爲此節點定義的一些引用。我現在想要做的是取得很大的成功,是訪問服務器中定義的引用,UA-Expert可以看到它,但是我的Milo Client實現不能。 自定義引用是在服務器端定義的,我的目標是訪問其「BrowseName」或「DisplayName」。
我相信這可能是一個簡單的問題,但現在我正在努力解決這個問題。
我會留下一些打印屏幕來舉例說明我的意思是在上面的文字:
在紅色箭頭指向參考,我試圖閱讀以下的形象,所以我們可以在第二圖像請參閱具有類型HasComponent的製造和說明是正確的,但HasAMLRoleReference未在調試窗口中列出。
此代碼它不是我的,所以我不能保證正確執行,但是在服務器端我知道,發生這種情況:
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,所以我可以使用了錯誤的方法來訪問一個,我可以我很誠懇地不知道。
在此先感謝您的幫助。
[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]
當我右擊設備參考它加載所顯示的信息下面。
客戶端代碼是否也列出了您的引用?它寫在米洛嗎? UaExpert是指着你的Milo服務器還是你用的另一臺服務器? –
該代碼列出了它是我的引用,它基於Milo SDK git回購中提供的示例。您可以在我現在編輯的編輯中查找上面的代碼。 UaExpert指向我的Milo服務器,是的。 –
你知道什麼樣的節點設備和模塊?您可以在UaExpert中點擊查看。 –