Darra OPC UA Client — Java SDK
Darra OPC UA Client Java 绑定. 跨语言对齐的高级 API, 你在这里学到的概念可以直接迁移到 C# / Python / C++ / Rust / C, 但 API 命名按 Java 惯例 (camelCase 方法 + try-with-resources + java.util.List 集合).
- 入门 → Session 会话 (构造 / 连接 / Read / Write / KeepAlive)
- 浏览 → Nodes 节点 (Browse / 路径解析 / RegisterNodes)
- 实时 → Subscription 订阅 (CreateSubscription / MonitoredItem / DataChanged)
- 历史 → History 历史 (Raw / Modified / AtTime / Processed / Events / Update / Delete)
- 调用 → Method 方法 (Call)
- 发现 → Discovery 发现 (GetEndpoints / FindServers)
- 数据 → Data Types (Variant / DataValue / WellKnownNodes)
- 安全 → Security (证书 / 加密)
安装
- Maven (推荐)
- Gradle
- Gradle (Kotlin DSL)
<dependency>
<groupId>com.darra</groupId>
<artifactId>darra-opcua-sdk</artifactId>
<version>0.6.0</version>
</dependency>
implementation 'com.darra:darra-opcua-sdk:0.6.0'
implementation("com.darra:darra-opcua-sdk:0.6.0")
依赖通过 JNA 加载本地 Darra.OpcUa.Core.dll (Windows) / libDarra.OpcUa.Core.so (Linux), 已打包进 jar.
系统要求
| 项 | 要求 |
|---|---|
| Java | 11+ (推荐 17 LTS) |
| OS | Windows 10/11, Windows Server 2019+, Linux (Ubuntu 20.04+) |
| 平台 | x64 |
| 协议 | OPC UA TCP (opc.tcp://) |
| 内存 | 100MB+ (Stack 自身约 30MB) |
包结构
import com.darra.opcua.*;
主要类型:
| 类型 | 用途 |
|---|---|
OpcUaSession | Client 主类 (对应 C# DarraOpcUa) |
OpcUaSubscription | 数据订阅容器 |
OpcUaEventSubscription | 事件订阅 (Alarms & Conditions) |
NodeCollection / OpcUaNode | Lazy Load 节点访问 |
OpcUaVariant / OpcUaDataValue | 数据封装 (实现 AutoCloseable) |
OpcUaDiscovery (静态) | GetEndpoints / FindServers |
WellKnownNodes (静态) | OPC Foundation 标准节点常量 |
OpcUaException | RuntimeException, 携带 StatusCode |
Enums.* | StatusCode / NodeClass / AttributeId / MessageSecurityMode / UserTokenType / SessionState / BuiltinType / MonitoringMode |
跨语言主类映射
| 概念 | C# | Java |
|---|---|---|
| Client 主类 | DarraOpcUa | OpcUaSession |
| 构造连接 | using var ua = new DarraOpcUa(url) + ua.Connect() | try (OpcUaSession ua = new OpcUaSession(url)) { ua.connect(); } |
| 数据值容器 | Variant | OpcUaVariant (链式 setXxx) |
| 单点读 | var dv = ua.Read(nid) | OpcUaDataValue dv = ua.read(nid) |
| 事件订阅 | ua.Events.Connected += h | ua.events.onConnected.add(consumer) |
| 资源管理 | using | try-with-resources |
| 时间类型 | DateTime | java.time.Instant (内部用 FileTime long) |
| 集合返回 | IReadOnlyList<T> | java.util.List<T> |
一分钟快速开始
import com.darra.opcua.*;
try (OpcUaSession ua = new OpcUaSession("opc.tcp://localhost:4840")) {
ua.connect();
// 读
try (OpcUaDataValue dv = ua.read("ns=2;s=Temperature")) {
System.out.println("Temperature = " + dv.variant().asDouble() + " °C");
}
// 写
try (OpcUaVariant v = new OpcUaVariant().setDouble(42.0)) {
ua.write("ns=2;s=Setpoint", v);
}
// 订阅
try (OpcUaSubscription sub = ua.createSubscription(500.0)) {
sub.add("ns=2;s=Counter", e ->
System.out.println(e.nodeId + " = " + e.valueString));
Thread.sleep(3000);
}
}
高级 API 概览
| 功能 | 入口 API | 说明 |
|---|---|---|
| 连接 / 加密 | new OpcUaSession(...) + connect() | None / Sign / SignAndEncrypt + Username / Anonymous / Certificate |
| 单点读写 | ua.read / write | 单节点单 Attribute |
| 批量读 | ua.readMany(nodes, attr) | 一次 RPC, N 节点 |
| 浏览树 | ua.browse / browseMany / browseWithPaging / browseNext / browseAll | 完整分页支持 |
| 路径解析 | ua.resolve / translateBrowsePaths | 浏览路径 → NodeId |
| 注册节点 | ua.registerNodes / unregisterNodes | 高频访问加速 30-50% |
| 数据订阅 | ua.createSubscription + sub.add / addMany | publishing / sampling 双层 |
| 事件订阅 | ua.subscribeEvents | 报警 & 条件 |
| 调方法 | ua.call(objId, mtdId, ...) | OPC UA Method 节点 |
| 历史读 | ua.readHistory / readHistoryModified / readHistoryAtTime / readHistoryProcessed / readHistoryEvents | Raw / Modified / AtTime / Processed / Events |
| 历史写 | ua.updateHistory / deleteHistoryRange | Insert / Replace / Update / Delete |
| 心跳 | ua.setKeepAliveIntervalMs(int) | 后台周期探测 |
| 自动重连 | (内置, 通过构造参数 autoReconnect=true) | 检测断线 → Republish 订阅 |
| 统一事件 | ua.events.onAny.add(...) | 会话 / 订阅 / 数据 / 通讯异常 |
| 服务发现 | OpcUaDiscovery.getEndpoints / findServers | 不需要 Session |
Java 特有约束
OpcUaSession / OpcUaSubscription / OpcUaDataValue / OpcUaVariant 都实现 AutoCloseable, 漏 close 会泄漏 native 内存. 永远用 try-with-resources.
任何注册到 native 的 callback (DataChange / Event / StateChange) 必须由 Java 端持有强引用. SDK 内部已用成员列表保活, 用户只要不显式释放 OpcUaSubscription 就安全.
事件回调在 native Publish 线程上调用. UI 操作必须 SwingUtilities.invokeLater / Platform.runLater 切回 UI 线程.
- Instant ↔ FileTime: SDK 内部用 Windows FileTime (100ns since 1601 UTC); 历史 API 自动转换
Instant. 自定义 DateTime Variant 时用setDateTime(long fileTime)直接传 FileTime - OpcUaException 是 RuntimeException: 不强制 try-catch, 业务层按需捕获
- 没有
event +=语法: 用events.onConnected.add(consumer)/events.onConnected.remove(consumer)
跨语言对齐
C# SDK 的 API 命名 / 行为是其他语言绑定的参考实现. Java 绑定按 Java 命名惯例 (camelCase, getXxx getter), 但语义一致 (例如 C# ua.Read ↔ Java ua.read ↔ Python ua.read). 选 Java 作为入门, 后续切其他语言时只需查 跨语言映射.
按左侧侧边栏顺序读完即可掌握全部 SDK API.