自动重连
概述
OPC UA Server 维护重启 / 网络抖动时 Session 失效。SDK 内部把所有 RPC 都包了一层重试机制:
- 调底层 RPC, 命中
BadSessionClosed/BadSessionIdInvalid/BadSecureChannelClosed - 自动调
Reconnect()重建 SecureChannel + Session - 重连成功重试一次
- 仍失败 → 抛
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 自动:
- 尝试
TransferSubscriptions(old_sub_id)转移 - 失败 → 用缓存的 MonitoredItemSpec 重建全部 MI
详见 订阅自恢复。
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| ua.Reconnect() | ua.reconnect() | ua.reconnect() | ua.Reconnect() | ua.reconnect() | DarraUa_Session_Reconnect |