跳到主要内容

GetEndpoints

前置 / 配套

签名

pub fn Discovery::get_endpoints(
endpoint_url: &str,
timeout_ms: u32,
) -> Result<Vec<EndpointDescription>, OpcUaError>;

通过临时 SecureChannel (None mode) 连服务端, 拉 Endpoint 列表后立即断开. 不需要 Session.

参数说明
endpoint_url目标 endpoint, 如 "opc.tcp://localhost:4840"
timeout_ms超时, 推荐 10_000

EndpointDescription 字段

pub struct EndpointDescription {
pub endpoint_url: String,
pub security_policy_uri: String,
pub security_mode: MessageSecurityMode,
pub server_application_uri: String,
pub server_product_uri: String,
pub server_application_name: String,
pub server_application_type: i32,
pub server_certificate: Vec<u8>, // DER
pub transport_profile_uri: String,
pub security_level: u8,
pub user_tokens: Vec<UserTokenPolicy>,
}
字段说明
endpoint_url实际 endpoint URL
security_modeNone / Sign / SignAndEncrypt
security_policy_uri算法套件 URI
server_certificate服务端证书 (DER)
user_tokens支持的登录方式
transport_profile_uri传输 Profile (通常 UA-TCP)
security_level服务端推荐优先级

UserTokenPolicy 字段

pub struct UserTokenPolicy {
pub policy_id: String,
pub token_type: UserTokenType, // Anonymous / Username / Certificate / Issued
}

用法

use darra_opcua::Discovery;

let endpoints = Discovery::get_endpoints("opc.tcp://server:4840", 10_000)?;

println!("Server has {} endpoints:", endpoints.len());
for ep in &endpoints {
println!("\n URL: {}", ep.endpoint_url);
println!(" Mode: {:?}", ep.security_mode);
println!(" Policy: {}", ep.security_policy_uri);
println!(" Tokens:");
for t in &ep.user_tokens {
println!(" - {:?} (PolicyId={})", t.token_type, t.policy_id);
}
}

典型输出

Server has 4 endpoints:

URL: opc.tcp://server:4840
Mode: None
Policy: http://opcfoundation.org/UA/SecurityPolicy#None
Tokens:
- Anonymous

URL: opc.tcp://server:4840
Mode: Sign
Policy: http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
Tokens:
- Anonymous
- Username

URL: opc.tcp://server:4840
Mode: SignAndEncrypt
Policy: http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
Tokens:
- Username
- Certificate

服务端通常暴露多个组合 (None / Sign / SignAndEncrypt × Anonymous / Username / Certificate), 客户端按需求挑.


用 endpoints 自动选最强加密

use darra_opcua::{Discovery, MessageSecurityMode};

let endpoints = Discovery::get_endpoints(url, 10_000)?;

// 选 SignAndEncrypt + 最高 SecurityLevel
let best = endpoints.iter()
.filter(|e| e.security_mode == MessageSecurityMode::SignAndEncrypt)
.max_by_key(|e| e.security_level)
.ok_or("no encrypted endpoint")?;

println!("Selected: {} ({:?})", best.endpoint_url, best.security_mode);

错误

StatusCode含义
BAD_COMMUNICATION_ERROR网络 / 服务端不可达
BAD_TIMEOUTtimeout_ms 超时
DARRA_INVALID_ARGUMENTendpoint_url 为空 / 含 NUL

下一步