跳到主要内容

连接 / 断开

前置阅读

Connect()

public void Connect();

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

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

成功后:

  • IsConnected == true
  • State == SessionState.Connected
  • Events.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 实例可重连. 内部:

  1. 停 KeepAlive
  2. 停 AutoPublish
  3. 关 Session (CloseSession + CloseSecureChannel)
  4. 触发 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_MAX3最大重试次数
DARRA_OPCUA_RECONNECT_INTERVAL_MS2000重试间隔 (毫秒)

状态查询

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重连失败终态, 需要新建实例

下一步