连接 / 断开
connect()
def connect(self) -> None: ...
建立到 endpoint 的连接. 内部串行执行:
- Hello — 协商 BufferSize / MaxMessageSize
- OpenSecureChannel — 协商加密通道 (NONE / Sign / SignAndEncrypt)
- GetEndpoints — 拉取服务端 Endpoint 列表 (用于校验)
- CreateSession — 创建会话, 协商 SessionTimeout
- ActivateSession — 用 UserToken 激活
- 加载 NamespaceArray 到
namespaces - 自动启
auto_publish = True后台线程 (若auto_publish_on_connect=True) - 自动启 KeepAlive 心跳
成功后:
is_connected == Truestate == SessionState.Connectedevents.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 实例可重连. 内部:
- 停 KeepAlive
- 停 AutoPublish
- 关 Session (CloseSession + CloseSecureChannel)
- 触发
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_MAX | 3 | 最大重试次数 |
DARRA_OPCUA_RECONNECT_INTERVAL_MS | 2000 | 重试间隔 (毫秒) |
状态查询
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 | 重连失败终态, 需要新建实例 |