构造函数
darra::opcua::Session 提供两个重载: 简化构造 (常用参数 + 默认推导) 和全配置构造 (ConnectionConfig 显式传所有字段).
前置阅读
- 加密参数 (SecurityMode / SecurityPolicyUri / 证书) 见 Security 加密.
- 服务端预扫描见 Discovery.
- 连上后的操作见 连接管理.
简化构造 (推荐)
Session(std::string const& endpoint,
MessageSecurityMode mode = MessageSecurityMode::None,
std::string const& username = "",
std::string const& password = "");
参数
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 必填 | endpoint | std::string const& | in | OPC UA endpoint, 形如 opc.tcp://host:port |
| 安全 | mode | MessageSecurityMode | in | None / Sign / SignAndEncrypt, 默认 None |
| 登录 | username | std::string const& | in | 空 = Anonymous, 非空 = UsernameIdentityToken |
password | std::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_url | std::string | in | endpoint URL |
| 安全 | security_mode | MessageSecurityMode | in | None / Sign / SignAndEncrypt, 默认 None |
security_policy_uri | std::string | in | 留空按 mode 自动选 (None → #None, 其他 → #Basic256Sha256) | |
client_cert_path | std::string | in | 客户端 PFX 路径 (Sign / SignAndEncrypt 必填) | |
client_key_path | std::string | in | PFX 密码 (字段复用) | |
server_cert_path | std::string | in | 服务端 DER, 空走 TOFU (Trust On First Use) | |
| 登录 | user_token_type | UserTokenType | in | Anonymous / Username / Certificate |
username / password | std::string | in | username 非空自动切到 Username token | |
| 超时 | session_timeout_ms | uint32_t | in | 服务端 Session 超时, 默认 600000 (10 分钟) |
request_timeout_ms | uint32_t | in | 单 RPC 超时, 默认 10000 (10 秒) | |
connect_timeout_ms | uint32_t | in | 建链超时, 默认 10000 (10 秒) | |
| 心跳与重连 | keepalive_interval_ms | uint32_t | in | KeepAlive 周期, 默认 10000 (0 = 禁用) |
auto_reconnect | bool | in | 启用自动重连, 默认 true | |
reconnect_max_retries | uint32_t | in | 重连最大次数, 默认 3 | |
reconnect_delay_ms | uint32_t | in | 重连间隔, 默认 2000 | |
| 发布 | auto_publish_on_connect | bool | in | Connect 后自动启动后台 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;
}