gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:31:56 24 4
gpt4 key购买 nike

我是 OPC-UA 世界和 Milo SDK 的新手,因此我将尽力解释我正在尝试做什么。

我有一个正在运行的 OPC-UA 服务器实例,它将一些节点加载到服务器 NameSapce。另一方面,我有一个客户端订阅该服务器并尝试浏览该节点。我可以看到客户端中的节点,并且可以访问为此节点定义的一些引用。我现在尝试做的白色成功是访问服务器中定义的引用,并且 UA 专家可以看到它,但我的 Milo 客户端实现看不到。自定义引用是在服务器端定义的,我的目标是访问它们的“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 示例。

在最后一张图片中,我们可以看到地址空间,因此这里我们有一些参数也作为 HasComponent 出现在引用中,因此我可以使用访问我无法HasAMLRoleReference的方法是错误的,我真的不知道。 enter image description here

预先感谢您的帮助。

<小时/>

[编辑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);
}
}
<小时/>

[编辑2]

enter image description here

当我右键单击设备引用时,它会加载如下所示的信息。

enter image description here

最佳答案

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

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

关于java - 浏览服务器命名空间并访问自定义引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45918629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com