跳到主要内容

连接 / 断开

前置阅读

connect()

public void connect();

建立到 endpoint 的连接. 内部串行执行:

  1. Hello — 协商 BufferSize / MaxMessageSize
  2. OpenSecureChannel — 协商加密通道 (None / Sign / SignAndEncrypt)
  3. GetEndpoints — 拉取服务端 Endpoint 列表 (用于校验)
  4. CreateSession — 创建会话, 协商 SessionTimeout
  5. ActivateSession — 用 UserToken 激活
  6. 加载 NamespaceArray 到 namespaces
  7. 自动启 autoPublishOnConnect = true 后台线程
  8. 自动启 KeepAlive 心跳

成功后:

  • isConnected() == true
  • getState() == SessionState.Connected
  • events.onConnected 监听者触发

失败抛 OpcUaException 携带具体 StatusCode (BadCertificateInvalid / BadIdentityTokenRejected / BadCommunicationError / ...).

例子

try (OpcUaSession ua = new OpcUaSession("opc.tcp://localhost:4840")) {
ua.events.onConnected.add(e ->
System.out.println("Connected to " + e.endpointUrl));
ua.events.onStateChanged.add(e ->
System.out.println(e.oldState + " → " + e.newState + " (reason=" + e.reason + ")"));

try {
ua.connect();
} catch (OpcUaException ex) {
System.err.println("Connect failed: " + ex.statusCode + " (" + ex.getMessage() + ")");
}
}

disconnect()

public void disconnect();

主动断开连接, 但保留 OpcUaSession 实例可重连. 内部:

  1. 停 KeepAlive
  2. 停 AutoPublish
  3. 关 Session (CloseSession + CloseSecureChannel)
  4. 触发 events.onDisconnected("主动断开")

close() 自动调用 disconnect(), 一般 try-with-resources 即可, 不需要显式 disconnect.

重连同一实例

try (OpcUaSession ua = new OpcUaSession("opc.tcp://server:4840")) {
ua.connect();
// ... 业务 ...
ua.disconnect();
// ... 等待 / 处理 ...
ua.connect(); // 同一实例可以多次 connect
// ...
}

自动重连 (内置)

构造时传 autoReconnect=true 启用. SDK 检测到底层通讯异常时自动:

Connected
↓ (异常)
Reconnecting (events.onReconnecting 触发)
↓ (重试 N 次)
├── 成功 → Reconnected (events.onReconnected 触发) → 自动 Republish 订阅
└── 失败 → Disconnected (events.onDisconnected 触发)

重连参数 (默认 3 次, 间隔 2 秒) 可通过环境变量调整:

环境变量默认说明
DARRA_OPCUA_RECONNECT_MAX3最大重试次数
DARRA_OPCUA_RECONNECT_INTERVAL_MS2000重试间隔 (毫秒)

状态查询

Enums.SessionState s = ua.getState();
// Disconnected / Connecting / Connected / Reconnecting / Closing / Failed

boolean ok = ua.isConnected(); // == (getState() == Connected)

Enums.SessionState 枚举:

含义
Disconnected未连接 / 已断开
Connecting正在 connect (Hello / OpenSecureChannel)
Connected已连接, 可正常 read / write / subscribe
Reconnecting检测到断线, 自动重连中
Closing正在 disconnect / close
Failed重连失败终态, 需要新建实例

下一步