跳到主要内容

构造函数

darra::opcua::Session 提供两个重载: 简化构造 (常用参数 + 默认推导) 和全配置构造 (ConnectionConfig 显式传所有字段).

前置阅读

简化构造 (推荐)

Session(std::string const& endpoint,
MessageSecurityMode mode = MessageSecurityMode::None,
std::string const& username = "",
std::string const& password = "");

参数

类别属性类型访问说明
必填endpointstd::string const&inOPC UA endpoint, 形如 opc.tcp://host:port
安全modeMessageSecurityModeinNone / Sign / SignAndEncrypt, 默认 None
登录usernamestd::string const&in空 = Anonymous, 非空 = UsernameIdentityToken
passwordstd::string const&in配 username 用

例子

#include <darra/opcua/client.hpp>
using namespace darra::opcua;

// 1. 匿名 + 明文 (开发期)
Session s1("opc.tcp://localhost:4840");

// 2. 用户名 + 明文 (开发期)
Session s2("opc.tcp://server:4840",
MessageSecurityMode::None, "operator", "secret");

全配置构造 — ConnectionConfig

struct ConnectionConfig {
std::string endpoint_url;
MessageSecurityMode security_mode = MessageSecurityMode::None;
std::string security_policy_uri; // 留空按 mode 自动选
UserTokenType user_token_type = UserTokenType::Anonymous;
std::string username;
std::string password;
std::string client_cert_path; // PFX 路径 (Sign / SignAndEncrypt 必填)
std::string client_key_path; // 私钥路径 / PFX 密码
std::string server_cert_path; // 服务端 DER (空走 TOFU)
uint32_t session_timeout_ms = 600000;
uint32_t request_timeout_ms = 10000;
uint32_t connect_timeout_ms = 10000;
uint32_t keepalive_interval_ms = 10000;
bool auto_reconnect = true;
uint32_t reconnect_max_retries = 3;
uint32_t reconnect_delay_ms = 2000;
bool auto_publish_on_connect = true;
};

explicit Session(ConnectionConfig const& cfg);

字段

类别属性类型访问说明
必填endpoint_urlstd::stringinendpoint URL
安全security_modeMessageSecurityModeinNone / Sign / SignAndEncrypt, 默认 None
security_policy_uristd::stringin留空按 mode 自动选 (None → #None, 其他 → #Basic256Sha256)
client_cert_pathstd::stringin客户端 PFX 路径 (Sign / SignAndEncrypt 必填)
client_key_pathstd::stringinPFX 密码 (字段复用)
server_cert_pathstd::stringin服务端 DER, 空走 TOFU (Trust On First Use)
登录user_token_typeUserTokenTypeinAnonymous / Username / Certificate
username / passwordstd::stringinusername 非空自动切到 Username token
超时session_timeout_msuint32_tin服务端 Session 超时, 默认 600000 (10 分钟)
request_timeout_msuint32_tin单 RPC 超时, 默认 10000 (10 秒)
connect_timeout_msuint32_tin建链超时, 默认 10000 (10 秒)
心跳与重连keepalive_interval_msuint32_tinKeepAlive 周期, 默认 10000 (0 = 禁用)
auto_reconnectboolin启用自动重连, 默认 true
reconnect_max_retriesuint32_tin重连最大次数, 默认 3
reconnect_delay_msuint32_tin重连间隔, 默认 2000
发布auto_publish_on_connectboolinConnect 后自动启动后台 Publish 线程, 默认 true

全配置示例

ConnectionConfig cfg;
cfg.endpoint_url = "opc.tcp://server:4840";
cfg.security_mode = MessageSecurityMode::SignAndEncrypt;
cfg.username = "operator";
cfg.password = "secret";
cfg.client_cert_path = "C:/certs/client.pfx";
cfg.client_key_path = "123456";
cfg.session_timeout_ms = 300000;
cfg.keepalive_interval_ms = 5000;
cfg.auto_reconnect = true;
cfg.reconnect_max_retries = 5;

Session s(cfg);
s.Connect();

异常

异常原因
Exception("Session_Create failed", ...)C 层 Stack 初始化失败 / Session create 失败
Exception("Connect failed", ...)后续 Connect() 时网络 / 证书 / Token 失败

构造函数本身不会发起网络连接, 只创建 native Session handle. 真正连接见 Connect.

RAII 资源管理

{
Session s(cfg);
s.Connect();
// ... 使用 s ...
} // 离开作用域: s 析构 → Disconnect + Close + Free handle

不要在堆上 new Session(...). 必要时用 std::unique_ptr<Session>. 不要用 std::shared_ptr<Session> (拷贝语义错).

全局初始化

构造 Session 之前必须先 Stack::Init(), 程序退出前 Stack::Shutdown(). 多次 Init 内部引用计数, 安全:

int main() {
Stack::Init();
{
Session s("opc.tcp://localhost:4840");
s.Connect();
// ...
}
Stack::Shutdown();
return 0;
}

下一步