GetEndpoints
前置 / 配套
- 拉到 Endpoint 后用 构造函数 真正建立 Session.
- 跨服务发现请用 FindServers.
签名
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_mode | None / 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_TIMEOUT | timeout_ms 超时 |
DARRA_INVALID_ARGUMENT | endpoint_url 为空 / 含 NUL |