TranslateBrowsePaths
TranslateBrowsePathsToNodeIds 服务把 "BrowsePath 字符串"批量解析为 NodeId, 单次 RPC. 比循环 resolve 快得多.
前置阅读
- 想链式探索建议用 OpcUaNode
node.get(browseName). - 100+ 路径批量初始化必用本 API.
签名
public List<TranslateResult> translateBrowsePaths(
List<Map.Entry<String, String>> paths);
// 同起点的便捷重载
public List<TranslateResult> translateBrowsePathsAt(
String startingNodeId, List<String> browsePaths);
TranslateResult 字段
| 方法 | 返回 | 说明 |
|---|---|---|
getNodeId() | String (失败 null) | 解析得到的 NodeId |
getStatus() | Enums.StatusCode | Good = 解析成功 |
用法
不同起点的混合路径
import java.util.AbstractMap;
import java.util.Arrays;
List<Map.Entry<String, String>> paths = Arrays.asList(
new AbstractMap.SimpleImmutableEntry<>("i=85" /* Objects */, "/Server/ServerStatus/CurrentTime"),
new AbstractMap.SimpleImmutableEntry<>("i=85", "/Server/ServerStatus/State"),
new AbstractMap.SimpleImmutableEntry<>("ns=2;s=Boiler1", "/Temperature"),
new AbstractMap.SimpleImmutableEntry<>("ns=2;s=Boiler1", "/Pressure"));
List<TranslateResult> results = ua.translateBrowsePaths(paths);
for (TranslateResult r : results) {
if (r.getStatus() == Enums.StatusCode.Good) {
System.out.println("OK: " + r.getNodeId());
} else {
System.out.println("Fail: " + r.getStatus());
}
}
同起点的便捷重载
List<String> children = Arrays.asList(
"/Temperature", "/Pressure", "/FlowRate");
List<TranslateResult> results = ua.translateBrowsePathsAt("ns=2;s=Boiler1", children);
BrowsePath 段格式
| 格式 | 含义 |
|---|---|
BrowseName | ns=0 默认 |
ns:BrowseName | 指定 NamespaceIndex |
/seg1/seg2/seg3 | 多段, 用 / 分 |
例子:
| BrowsePath | 含义 |
|---|---|
/Server | ns=0 下子节点 Server |
/2:Boiler1 | ns=2 下子节点 Boiler1 |
/Server/2:Boilers/2:Boiler1/2:Temperature | 多层组合 |
与 resolve 的对比
| API | RPC 次数 | 适用 |
|---|---|---|
resolve(path) | 1 (内部走 TranslateBrowsePaths 单条) | 偶尔用, 单条路径 |
translateBrowsePaths(paths) | 1 | 100+ 路径批量 |
链式索引 node.get(a).get(b).get(c) | N (每段一次 Browse) | 探索式 |
100 个 Tag 的初始化 NodeId 解析, 用 translateBrowsePaths 比循环 resolve 快 10-100 倍.