跳到主要内容

构造函数

OpcUaSession 提供多个重载: 最简化的 endpoint-only 构造、用户名构造、加密构造, 以及全配置构造. 还有两个静态加密快捷工厂.

前置阅读

简化构造 (推荐)​

public OpcUaSession(String endpointUrl)
public OpcUaSession(String endpointUrl, String username, String password)
public OpcUaSession(String endpointUrl,
Enums.MessageSecurityMode mode,
String username, String password)

例子​

// 1. 匿名 + 明文 (开发期)
try (OpcUaSession ua = new OpcUaSession("opc.tcp://localhost:4840")) {
ua.connect();
}

// 2. 用户名 + 明文
try (OpcUaSession ua = new OpcUaSession(
"opc.tcp://server:4840", "operator", "secret")) {
ua.connect();
}

加密快捷工厂 (推荐)​

public static OpcUaSession secureSign(String endpointUrl, String clientCertPath)
public static OpcUaSession secureSignAndEncrypt(String endpointUrl, String clientCertPath)

封装好默认参数 (Basic256Sha256, 自动重连, 心跳 10 秒), 只需 endpoint + PFX:

// Sign (防篡改, 不防嗅探)
try (OpcUaSession ua = OpcUaSession.secureSign(
"opc.tcp://server:4840", "C:\\certs\\client.pfx")) {
ua.connect();
}

// SignAndEncrypt (典型生产)
try (OpcUaSession ua = OpcUaSession.secureSignAndEncrypt(
"opc.tcp://server:4840", "C:\\certs\\client.pfx")) {
ua.connect();
}

全配置构造​

public OpcUaSession(String endpointUrl,
Enums.MessageSecurityMode securityMode,
String username, String password,
int sessionTimeoutMs, int requestTimeoutMs, int connectTimeoutMs,
int keepAliveIntervalMs, boolean autoReconnect, boolean autoPublishOnConnect,
String clientCertPath, String clientKeyPath, String serverCertPath,
String securityPolicyUri)

参数​

类别属性类型访问说明
必填endpointUrlStringinOPC UA endpoint, 形如 opc.tcp://host:port
安全securityModeEnums.MessageSecurityModeinNone / Sign / SignAndEncrypt
securityPolicyUriStringinnull = 按 mode 自动选 (None → #None, 其他 → #Basic256Sha256)
clientCertPathStringin客户端 PFX 路径 (Sign / SignAndEncrypt 必填)
clientKeyPathStringinPFX 密码
serverCertPathStringin服务端 DER, null = TOFU (Trust On First Use)
登录usernameStringinnull = Anonymous, 非空 = UsernameIdentityToken
passwordStringin配 username 用
超时sessionTimeoutMsintin服务端 Session 超时 (典型 600000 = 10 分钟)
requestTimeoutMsintin单 RPC 超时 (典型 10000 = 10 秒)
connectTimeoutMsintin建链超时 (典型 10000 = 10 秒)
运行keepAliveIntervalMsintinKeepAlive 心跳周期 (典型 10000, 0 = 禁用)
autoReconnectbooleanin断线后自动重连
autoPublishOnConnectbooleaninconnect() 时自动启动后台 Publish 线程

例子 — 匿名 + Sign 加密​

try (OpcUaSession ua = new OpcUaSession(
"opc.tcp://server:4840",
Enums.MessageSecurityMode.Sign,
null, null, // 匿名
600_000, 10_000, 10_000, // 超时
10_000, true, true, // KeepAlive / autoReconnect / autoPublish
"C:\\certs\\client.pfx", "123456", // PFX + 密码
null, null)) { // serverCert TOFU + 默认 Basic256Sha256
ua.connect();
}

例子 — 按 GetEndpoints 结果工厂构造​

List<EndpointDescription> endpoints =
OpcUaDiscovery.getEndpoints("opc.tcp://server:4840");

EndpointDescription ep = endpoints.stream()
.filter(e -> e.getSecurityMode() == Enums.MessageSecurityMode.SignAndEncrypt)
.findFirst()
.orElseThrow();

try (OpcUaSession ua = new OpcUaSession(
ep.getEndpointUrl(),
ep.getSecurityMode(),
"operator", "secret",
600_000, 10_000, 10_000,
10_000, true, true,
"C:\\certs\\client.pfx", "123456",
null, // TOFU
ep.getSecurityPolicyUri())) { // 复用 server 公布的 policy URI
ua.connect();
}

异常​

异常原因
IllegalArgumentExceptionendpointUrl 为空
OpcUaException (DarraOutOfMemory)Stack 初始化失败
OpcUaException (BadCertificateInvalid)客户端证书加载失败

资源管理​

OpcUaSession 实现 AutoCloseable, 内部维护进程级引用计数 + native Stack 初始化. 必须用 try-with-resources 或显式 close:

// 推荐: try-with-resources 自动 close
try (OpcUaSession ua = new OpcUaSession("opc.tcp://server:4840")) {
ua.connect();
// ...
}

// 或显式
OpcUaSession ua = new OpcUaSession("opc.tcp://server:4840");
try {
ua.connect();
// ...
} finally {
ua.close();
}

close() 内部自动调用 disconnect(), 一般 try-with-resources 即可.

Stack 引用计数

SDK 进程级共享 native Stack. 第一个 OpcUaSession 创建时 init Stack, 最后一个 close 时 shutdown Stack. 漏 close 会让 Stack 永驻进程, 不影响功能但内存涨.

下一步​