跳到主要内容

连接 / 断开

前置阅读

connect()

def connect(self) -> None: ...

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

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

成功后:

  • is_connected == True
  • state == SessionState.Connected
  • events.connected 事件触发

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

例子

from darra_opcua import OpcUaSession, OpcUaException

with OpcUaSession("opc.tcp://localhost:4840") as ua:
ua.events.connected.append(
lambda e: print(f"Connected to {e.endpoint_url}"))
ua.events.state_changed.append(
lambda e: print(f"{e.old_state.name} -> {e.new_state.name} ({e.reason.name})"))

try:
ua.connect()
except OpcUaException as ex:
print(f"Connect failed: {ex.status_code.name} ({ex})")

disconnect()

def disconnect(self) -> None: ...

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

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

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

重连同一实例

ua.disconnect()
# ... 等待 / 业务处理 ...
ua.connect() # 同一实例可以多次 connect

自动重连 (内置)

SDK 检测到底层通讯异常时自动:

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

构造时关掉自动重连:

OpcUaSession(..., auto_reconnect=False)

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

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

状态查询

from darra_opcua import SessionState

s: SessionState = ua.state
# Disconnected / Connecting / Connected / Reconnecting / Closing / Failed

ok: bool = ua.is_connected # == (state == SessionState.Connected)

SessionState 枚举 (IntEnum):

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

下一步