【发布时间】:2020-02-18 09:13:53
【问题描述】:
我正在使用 OPC UA 项目https://github.com/OPCFoundation/UA-Java。我能够使用UAExpert 浏览OPCUA 服务器上的所有节点。
现在我正在尝试使用我的 java 客户端浏览所有节点。我能够检索节点层次结构第一级中节点的引用,其中 rootnameSpace = 1 和 rootIdentifier = "simsre"
BrowseDescription browse = new BrowseDescription();
browse.setNodeId(new NodeId(rootnameSpace, rootIdentifier));
browse.setBrowseDirection(BrowseDirection.Forward);
browse.setIncludeSubtypes(true);
browse.setNodeClassMask(NodeClass.Object, NodeClass.Variable);
browse.setResultMask(BrowseResultMask.All );
BrowseResponse res = mySession.Browse(null, null, null, browse);
ReferenceDescription[] references = res.getResults()[0].getReferences();
当我调用其他节点的代码时,如 rootnameSpace = 31 和 rootIdentifier = "/simsrede/" 下面我仍然得到一个结果但没有引用(所以 res.getResults()[0].getReferences() 返回 null) - browseResponse 的状态码类似于“GOOD” -
根据规范,标识符中允许使用所有 unicode 字符,因此斜杠和“|”不应该是问题。
我还尝试将条目添加到我的命名空间表中,并使用该表在从根节点开始的连续浏览请求中设置节点 ID
NamespaceTable table = NamespaceTable.getDefaultInstance();
table.add(1, "urn:something:UnifiedAutomation:Uagateway");
...
//consecutive browse request starting from reference returned by first call
browse1.setNodeId(table.toNodeId(references[0].getNodeId()));
BrowseResponse res1 = mySession.Browse(null, null, null, browse);
ReferenceDescription[] references1 = res.getResults()[0].getReferences();
有人知道为什么会返回空引用,或者如何调试它吗?
【问题讨论】:
-
你确定这是一个有效的 NodeId 吗?您可以与其他客户端浏览相同的节点吗?你能得到一个 Wireshark 捕获吗?
-
我忘了提到我能够使用UAExpert浏览节点,并且browseResponse的状态代码类似于GOOD。我会尝试让wireshark 在我的环境中运行——这是检查响应的最佳选择吗?
-
比较来自 UaExpert 的 Wireshark 捕获与来自您的代码的捕获,以了解您在做什么不同/错误。
-
另外,来自 OPC 基础的 Java 堆栈也不再维护。你可以考虑github.com/eclipse/milo。