跳到主要内容

Session 会话 — OpcUaSession

OpcUaSession 是 Java SDK 的 Client 主类 (对应 C# 的 DarraOpcUa), 一个实例对应一个 OPC UA Session. 所有访问 (Read / Write / Browse / Subscribe / Call / History) 都从这个对象出发.

实现 AutoCloseable, 必须try-with-resources 中使用, 否则会泄漏 native 资源 + 服务端 Session.

子页跳转

公共字段 / 属性

类别属性类型访问说明
连接getEndpointUrl()StringR构造时指定的 endpoint URL
getSecurityMode()Enums.MessageSecurityModeR安全模式 (None / Sign / SignAndEncrypt)
状态getState()Enums.SessionStateR当前会话状态 (Disconnected / Connecting / Connected / Reconnecting / Closing / Failed)
isConnected()booleanR是否已连接 (= getState() == Connected)
子对象nodesNodeCollectionRLazy Load 节点访问器 (final 字段)
namespacesNamespaceCollectionR命名空间 URI ↔ Index 互转 (final 字段)
事件eventsOpcUaEventsR会话级事件统一通道 (Connected / Disconnected / DataChange / ServerEvent / ...) (final 字段)
配置getKeepAliveIntervalMs() / setKeepAliveIntervalMs(int)intRWKeepAlive 心跳周期 (默认 10000 ms, 0 = 禁用)
isAutoPublish() / setAutoPublish(boolean)booleanRW启停后台 Publish 线程 (connect 后默认 true)
内部handle()intRC 层句柄 (调试用)

公共方法

连接管理

  • connect() — 建立连接 (Hello → SecureChannel → Session → Activate)
  • disconnect() — 主动断开, 实例可重连
  • close() — 释放资源, 自动 disconnect (来自 AutoCloseable)

心跳与发布

  • publish(int timeoutMs) — 手动触发一次 Publish (一般无需调用)

读 / 写

浏览

订阅

方法调用

历史

控制

  • cancel(int requestHandle) — 取消未完成请求

完整示例

import com.darra.opcua.*;
import com.darra.opcua.OpcUaEvents.ConnectionEventArgs;

try (OpcUaSession ua = new OpcUaSession("opc.tcp://localhost:4840")) {
ua.events.onConnected.add(e ->
System.out.println("Connected to " + e.endpointUrl));
ua.events.onDisconnected.add(e ->
System.out.println("Disconnected: " + e.message));
ua.connect();

// 读
try (OpcUaDataValue dv = ua.read("ns=2;s=Temperature")) {
System.out.println("T = " + dv.variant().asDouble() + " °C");
}

// 写
try (OpcUaVariant v = new OpcUaVariant().setDouble(42.0)) {
Enums.StatusCode st = ua.write("ns=2;s=Setpoint", v);
System.out.println("Write status = " + st);
}

// 订阅
try (OpcUaSubscription sub = ua.createSubscription(500.0)) {
sub.add("ns=2;s=Counter", e ->
System.out.println(e.nodeId + " = " + e.valueString + " (" + e.status + ")"));
Thread.sleep(60_000);
}
}

下一步