跳到主要内容

构造函数

Session 提供两个关联函数: Session::new 简化构造 (默认推导), Session::with_config 全配置构造.

前置阅读

简化构造 (推荐)

pub fn Session::new(endpoint_url: &str) -> Result<Session, OpcUaError>;

默认参数: MessageSecurityMode::None + 匿名登录 + 默认超时 (10 分钟 session, 10 秒请求).

use darra_opcua::Session;

darra_opcua::initialize()?;
let mut s = Session::new("opc.tcp://localhost:4840")?;
s.connect()?;

全配置 with_config

pub fn Session::with_config(cfg: ConnectionConfig) -> Result<Session, OpcUaError>;

通过 ConnectionConfig 结构传所有字段.

ConnectionConfig 字段

类别属性类型访问说明
必填endpoint_urlStringinOPC UA endpoint, 形如 opc.tcp://host:port
安全security_modeMessageSecurityModeinNone / Sign / SignAndEncrypt, 默认 None
security_policy_uriOption<String>inNone 时按 mode 自动选 (None → #None, 其他 → #Basic256Sha256)
client_cert_pathOption<String>in客户端 PFX 路径 (Sign / SignAndEncrypt 必填)
client_key_pathOption<String>in私钥路径 (PFX 自带, 字段保留对齐 Stack)
server_cert_pathOption<String>in服务端 DER, None = TOFU (Trust On First Use)
登录usernameOption<String>inNone = Anonymous, Some = UsernameIdentityToken
passwordOption<String>in配 username 用
超时session_timeout_msu32in服务端 Session 超时, 默认 600 000 ms (10 分钟)
request_timeout_msu32in单 RPC 超时, 默认 10 000 ms (10 秒)
connect_timeout_msu32in建链超时, 默认 10 000 ms (10 秒)
keepalive_interval_msu32inKeepAlive 心跳周期, 默认 10 000 ms
重连auto_reconnectboolin启用自动重连, 默认 true
reconnect_max_retriesu32in最大重连次数, 默认 3
reconnect_delay_msu32in重连间隔 (ms), 默认 2000
auto_publish_on_connectboolinconnect 后自动启 AutoPublish, 默认 true

ConnectionConfig::new(url) 已填好所有默认值, 修改你关心的字段即可:

use darra_opcua::{Session, ConnectionConfig};

let mut cfg = ConnectionConfig::new("opc.tcp://localhost:4840");
cfg.session_timeout_ms = 1_800_000; // 30 分钟
cfg.request_timeout_ms = 30_000; // 30 秒
let mut s = Session::with_config(cfg)?;

例子

1. 匿名 + 明文 (开发期)

let mut s = Session::new("opc.tcp://localhost:4840")?;
s.connect()?;

2. 匿名 + Sign 加密

use darra_opcua::{Session, ConnectionConfig, MessageSecurityMode};

let mut cfg = ConnectionConfig::new("opc.tcp://server:4840");
cfg.security_mode = MessageSecurityMode::Sign;
cfg.client_cert_path = Some("C:/certs/client.pfx".into());
let mut s = Session::with_config(cfg)?;
s.connect()?;

3. 用户名 + SignAndEncrypt (典型生产)

let mut cfg = ConnectionConfig::new("opc.tcp://server:4840");
cfg.security_mode = MessageSecurityMode::SignAndEncrypt;
cfg.username = Some("operator".into());
cfg.password = Some("secret".into());
cfg.client_cert_path = Some("C:/certs/client.pfx".into());
let mut s = Session::with_config(cfg)?;
s.connect()?;

4. 按 GetEndpoints 结果工厂构造

use darra_opcua::{Discovery, Session, ConnectionConfig, MessageSecurityMode};

let endpoints = Discovery::get_endpoints("opc.tcp://server:4840", 10_000)?;
let ep = endpoints.iter()
.find(|e| e.security_mode == MessageSecurityMode::SignAndEncrypt)
.ok_or("no SignAndEncrypt endpoint")?;

let mut cfg = ConnectionConfig::new(&ep.endpoint_url);
cfg.security_mode = ep.security_mode;
cfg.security_policy_uri = Some(ep.security_policy_uri.clone());
cfg.client_cert_path = Some("C:/certs/client.pfx".into());
cfg.username = Some("operator".into());
cfg.password = Some("secret".into());
let mut s = Session::with_config(cfg)?;
s.connect()?;

错误

构造时可能返回的 OpcUaError:

status原因
StatusCode::DARRA_INVALID_ARGUMENTendpoint_url 为空 / 含 NUL
StatusCode::BAD_CERTIFICATE_INVALID客户端证书加载失败
其他 Bad*Stack 创建 native session 失败

资源管理 (Drop)

Session 实现 Drop — 离开作用域时自动:

  1. 停 KeepAlive 线程
  2. 解除 state callback
  3. DarraUa_Session_Close() 释放 native handle
{
let mut s = Session::new("opc.tcp://localhost:4840")?;
s.connect()?;
// ... 用 s ...
} // <- 此处 s Drop, native 资源全部释放

不需要手动 disconnect() (但显式调用更明确, 也能让事件回调拿到主动断开通知).


全局 init / shutdown

构造前必须调一次进程级 initialize():

darra_opcua::initialize()?;        // 进程入口调一次
{
let mut s = Session::new("opc.tcp://localhost:4840")?;
s.connect()?;
// ...
}
darra_opcua::shutdown()?; // 进程退出前调一次

initialize() / shutdown() 内部引用计数, 多次调用安全.

下一步