OpcUaNodeId — 强类型 NodeId
概述
OPC UA 节点 ID 默认用字符串编码 ("ns=2;s=Foo")。OpcUaNodeId 是不可变值类型, 显式带 namespace / idType / identifier 三件套。
对应规范段: Part 6 §5.2.2。
API
| 成员 | 类别 | 读写 | 说明 |
|---|---|---|---|
| OpcUaNodeId.NULL | 静态 | 读 | 空哨兵 |
| OpcUaNodeId.fromNumeric(ns, id) | 工厂 | — | 数字型 |
| OpcUaNodeId.fromString(ns, id) | 工厂 | — | 字符串型 |
| OpcUaNodeId.fromGuid(ns, uuid) | 工厂 | — | GUID 型 |
| OpcUaNodeId.fromOpaque(ns, bytes) | 工厂 | — | 不透明型 |
| OpcUaNodeId.parse(s) | 静态 | — | 解析, 失败抛 IllegalArgumentException |
| OpcUaNodeId.tryParse(s) | 静态 | — | 安全解析, 返回 Optional<OpcUaNodeId> |
| nid.toString() | — | — | 序列化 |
| nid.namespaceIndex() / idType() / identifier() / isNull() | 属性 | 读 | 字段 |
相关结构:
public enum NodeIdType {
NUMERIC, // 编码 i=, uint32
STRING, // 编码 s=, UTF-8
GUID, // 编码 g=, {xxxx-...}
OPAQUE // 编码 b=, base64
}
代码示例
import com.darra.opcua.*;
import java.util.UUID;
// 1) 工厂
OpcUaNodeId n1 = OpcUaNodeId.fromNumeric(0, 84); // i=84
OpcUaNodeId n2 = OpcUaNodeId.fromString(2, "Boiler1.Temp");
OpcUaNodeId n3 = OpcUaNodeId.fromGuid(3, UUID.randomUUID());
OpcUaNodeId n4 = OpcUaNodeId.fromOpaque(4, new byte[]{1, 2, 3});
// 2) 解析
OpcUaNodeId n5 = OpcUaNodeId.parse("ns=2;s=Demo.Tag");
System.out.println("ns=" + n5.namespaceIndex() + ", type=" + n5.idType());
Optional<OpcUaNodeId> n6 = OpcUaNodeId.tryParse("ns=99;i=foo"); // empty
if (n6.isEmpty()) System.out.println("invalid");
// 3) 序列化
String s = n2.toString(); // "ns=2;s=Boiler1.Temp"
// 4) 与 SDK 互转
try (DataValue dv = ua.read(n2.toString())) { ... }
// 5) 字典 key (immutable, 自动 equals/hashCode)
Map<OpcUaNodeId, String> dict = new HashMap<>();
dict.put(n2, "锅炉一温度");
// 6) Null
System.out.println(OpcUaNodeId.NULL.isNull()); // true
最佳实践
- 配置文件存字符串, 加载用 parse
- 代码内部用强类型
- Numeric 优先 (uint 比较快)
- 用户输入永远先 tryParse
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| OpcUaNodeId | OpcUaNodeId | OpcUaNodeId | OpcUaNodeId | OpcUaNodeId | DarraUa_NodeId |
| Parse | parse | parse | Parse | parse | DarraUa_NodeId_Parse |
| FromNumeric | from_numeric | fromNumeric | FromNumeric | from_numeric | DarraUa_NodeId_FromNumeric |