连接 / 断开
Connect()
public void Connect();
建立到 endpoint 的连接. 内部串行执行:
- Hello — 协商 BufferSize / MaxMessageSize
- OpenSecureChannel — 协商加密通道 (None / Sign / SignAndEncrypt)
- GetEndpoints — 拉取服务端 Endpoint 列表 (用于校验)
- CreateSession — 创建会话, 协商 SessionTimeout
- ActivateSession — 用 UserToken 激活
- 加载 NamespaceArray 到
Namespaces - 自动启
AutoPublish = true后台线程 - 自动启 KeepAlive 心跳
成功后:
IsConnected == trueState == SessionState.ConnectedEvents.Connected事件触发
失败抛 OpcUaException 携带具体 StatusCode (BadCertificateInvalid / BadIdentityTokenRejected / BadCommunicationError / ...).
例子
using var ua = new DarraOpcUa("opc.tcp://localhost:4840");
ua.Events.Connected += (s, e) => Console.WriteLine($"Connected to {e.EndpointUrl}");
ua.Events.StateChanged += (s, e) => Console.WriteLine($"{e.OldState} → {e.NewState} (reason={e.Reason})");
try
{
ua.Connect();
}
catch (OpcUaException ex)
{
Console.WriteLine($"Connect failed: {ex.StatusCode} ({ex.Message})");
}
Disconnect()
public void Disconnect();
主动断开连接, 但保留 DarraOpcUa 实例可重连. 内部:
- 停 KeepAlive
- 停 AutoPublish
- 关 Session (CloseSession + CloseSecureChannel)
- 触发
Events.Disconnected("主动断开")
Dispose() 自动调用 Disconnect(), 一般 using 即可, 不需要显式 Disconnect.
重连同一实例
ua.Disconnect();
// ... 等待 / 业务处理 ...
ua.Connect(); // 同一实例可以多次 Connect
自动重连 (内置)
SDK 检测到底层通讯异常时自动:
Connected
↓ (异常)
Reconnecting (Events.Reconnecting 触发)
↓ (重试 N 次)
├── 成功 → Reconnected (Events.Reconnected 触发) → 自动 Republish 订阅
└── 失败 → Disconnected (Events.Disconnected 触发)
重连参数 (默认 3 次, 间隔 2 秒) 可通过环境变量调整:
| 环境变量 | 默认 | 说明 |
|---|---|---|
DARRA_OPCUA_RECONNECT_MAX | 3 | 最大重试次数 |
DARRA_OPCUA_RECONNECT_INTERVAL_MS | 2000 | 重试间隔 (毫秒) |
状态查询
SessionState s = ua.State;
// Disconnected / Connecting / Connected / Reconnecting / Closing / Failed
bool ok = ua.IsConnected; // == (State == Connected)
SessionState 枚举:
| 值 | 含义 |
|---|---|
Disconnected | 未连接 / 已断开 |
Connecting | 正在 Connect (Hello / OpenSecureChannel) |
Connected | 已连接, 可正常 Read / Write / Subscribe |
Reconnecting | 检测到断线, 自动重连中 |
Closing | 正在 Disconnect / Dispose |
Failed | 重连失败终态, 需要新建实例 |