跳到主要内容

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#PythonJavaC++RustC
OpcUaNodeIdOpcUaNodeIdOpcUaNodeIdOpcUaNodeIdOpcUaNodeIdDarraUa_NodeId
ParseparseparseParseparseDarraUa_NodeId_Parse
FromNumericfrom_numericfromNumericFromNumericfrom_numericDarraUa_NodeId_FromNumeric

下一步