跳到主要内容

自动重连

概述

OPC UA Server 维护重启 / 网络抖动时 Session 失效。SDK 内部把所有 RPC 都包了一层重试机制:

  1. 调底层 RPC, 命中 BadSessionClosed / BadSessionIdInvalid / BadSecureChannelClosed
  2. 自动调 Reconnect() 重建 SecureChannel + Session
  3. 重连成功重试一次
  4. 仍失败 → 抛 OpcUaException (Safe 版本折叠为 StatusCode)

业务侧无需处理, 重连结果通过 ua.Events() 通道推 Reconnecting / Reconnected

API

方法 / 事件类别读写说明
ua.Reconnect()方法手动触发
events.OnReconnecting(callback)事件重连开始
events.OnReconnected(callback)事件重连成功
events.OnDisconnected(callback)事件断开
events.OnSessionLost(callback)事件Session 失效预警

代码示例

#include <darra/opcua.h>
using namespace darra::opcua;

DarraOpcUa ua("opc.tcp://localhost:4840");

ua.Events().OnReconnecting([](const ConnectionEventArgs& e) {
std::cout << "重连中... " << e.endpoint_url << "\n";
});
ua.Events().OnReconnected([](const ConnectionEventArgs& e) {
std::cout << "已恢复\n";
});
ua.Events().OnSessionLost([](const OpcUaEventEntry& e) {
std::cerr << "Session 失效: " << e.message << " (" << e.status_code << ")\n";
});

ua.Connect();

// 业务代码完全不需要 try/catch 重连
while (running) {
auto rr = ua.ReadSafe("ns=2;s=Temp");
// 即使中途服务端重启, ReadSafe 已自动重连+重试
std::this_thread::sleep_for(std::chrono::seconds(1));
}

重连策略

  • 单次 RPC 最多重连 1 次
  • 重连超时 = 构造时 connect_timeout_ms (默认 10000)
  • 多 RPC 并发触发时内部串行化
  • 完全失败由业务侧通过 OnDisconnected 事件提示用户

与订阅自恢复

Session 重连后 SDK 自动:

  1. 尝试 TransferSubscriptions(old_sub_id) 转移
  2. 失败 → 用缓存的 MonitoredItemSpec 重建全部 MI

详见 订阅自恢复

跨语言对照

C#PythonJavaC++RustC
ua.Reconnect()ua.reconnect()ua.reconnect()ua.Reconnect()ua.reconnect()DarraUa_Session_Reconnect

下一步