构造函数
Session 提供两个关联函数: Session::new 简化构造 (默认推导), Session::with_config 全配置构造.
前置阅读
- 加密参数 (security_mode / security_policy_uri / 证书) 见 Security 加密.
- 服务端预扫描见 Discovery.
- 连上后的操作见 连接管理.
简化构造 (推荐)
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_url | String | in | OPC UA endpoint, 形如 opc.tcp://host:port |
| 安全 | security_mode | MessageSecurityMode | in | None / Sign / SignAndEncrypt, 默认 None |
security_policy_uri | Option<String> | in | None 时按 mode 自动选 (None → #None, 其他 → #Basic256Sha256) | |
client_cert_path | Option<String> | in | 客户端 PFX 路径 (Sign / SignAndEncrypt 必填) | |
client_key_path | Option<String> | in | 私钥路径 (PFX 自带, 字段保留对齐 Stack) | |
server_cert_path | Option<String> | in | 服务端 DER, None = TOFU (Trust On First Use) | |
| 登录 | username | Option<String> | in | None = Anonymous, Some = UsernameIdentityToken |
password | Option<String> | in | 配 username 用 | |
| 超时 | session_timeout_ms | u32 | in | 服务端 Session 超时, 默认 600 000 ms (10 分钟) |
request_timeout_ms | u32 | in | 单 RPC 超时, 默认 10 000 ms (10 秒) | |
connect_timeout_ms | u32 | in | 建链超时, 默认 10 000 ms (10 秒) | |
keepalive_interval_ms | u32 | in | KeepAlive 心跳周期, 默认 10 000 ms | |
| 重连 | auto_reconnect | bool | in | 启用自动重连, 默认 true |
reconnect_max_retries | u32 | in | 最大重连次数, 默认 3 | |
reconnect_delay_ms | u32 | in | 重连间隔 (ms), 默认 2000 | |
auto_publish_on_connect | bool | in | connect 后自动启 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_ARGUMENT | endpoint_url 为空 / 含 NUL |
StatusCode::BAD_CERTIFICATE_INVALID | 客户端证书加载失败 |
| 其他 Bad* | Stack 创建 native session 失败 |
资源管理 (Drop)
Session 实现 Drop — 离开作用域时自动:
- 停 KeepAlive 线程
- 解除 state callback
- 调
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() 内部引用计数, 多次调用安全.