跳到主要内容

自动重连

概述

OPC UA Server 维护重启 / 网络抖动时 Session 失效, SDK 内部把所有 RPC 都包了 _retry_on_session_fault:

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

业务侧无需处理。重连结果通过 ua.events 通道推 Reconnecting / Reconnected

API

方法 / 事件类别读写说明
ua.reconnect()方法手动触发重连
ua.events.on('reconnecting', ...)事件重连开始
ua.events.on('reconnected', ...)事件重连成功
ua.events.on('disconnected', ...)事件连接断开
ua.events.on('session_lost', ...)事件Session 失效预警

代码示例

from opcua import DarraOpcUa

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

@ua.events.on('reconnecting')
def on_reconnecting(args):
print(f"重连中... {args.endpoint_url}")

@ua.events.on('reconnected')
def on_reconnected(args):
print(f"已恢复")

@ua.events.on('session_lost')
def on_lost(args):
print(f"Session 失效: {args.message}")

ua.connect()

# 业务代码完全不需要 try/except
while running:
st, dv = ua.read_safe("ns=2;s=Temp")
# 即使中途服务端重启, read_safe 已自动重连+重试
time.sleep(1)

重连策略

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

与订阅自恢复

Session 重连后 SDK 自动:

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

详见 订阅自恢复.

跨语言对照

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

下一步