GetEndpoints
前置 / 配套
- 拉到 Endpoint 后用 构造函数 真正建立 Session.
- 跨服务发现请用 FindServers.
签名
namespace darra::opcua {
class Discovery {
public:
static std::vector<EndpointDescription> GetEndpoints(std::string const& server_url);
};
}
通过临时 SecureChannel (None mode) 连服务端, 拉 Endpoint 列表后立即断开. 不需要 Session.
EndpointDescription 字段
struct EndpointDescription {
std::string endpoint_url;
MessageSecurityMode security_mode;
std::string security_policy_uri;
std::vector<uint8_t> server_certificate; // DER
std::vector<UserTokenPolicy> user_identity_tokens;
std::string transport_profile_uri;
uint8_t security_level = 0;
};
| 字段 | 类型 | 说明 |
|---|---|---|
endpoint_url | std::string | 实际 endpoint URL |
security_mode | MessageSecurityMode | None / Sign / SignAndEncrypt |
security_policy_uri | std::string | 算法套件 URI |
server_certificate | std::vector<uint8_t> | 服务端证书 (DER) |
user_identity_tokens | std::vector<UserTokenPolicy> | 支持的登录方式 |
transport_profile_uri | std::string | 传输 Profile (通常 UA-TCP) |
security_level | uint8_t | 服务端推荐优先级 |
UserTokenPolicy 字段
struct UserTokenPolicy {
std::string policy_id;
UserTokenType token_type;
std::string issued_token_type; // (Issued 才有)
std::string issuer_endpoint_url; // (Issued 才有)
std::string security_policy_uri;
};
用法
auto endpoints = Discovery::GetEndpoints("opc.tcp://server:4840");
std::cout << "Server has " << endpoints.size() << " endpoints:\n";
for (auto const& ep : endpoints) {
std::cout << "\n URL: " << ep.endpoint_url
<< "\n Mode: " << static_cast<int>(ep.security_mode)
<< "\n Policy: " << ep.security_policy_uri
<< "\n Tokens:\n";
for (auto const& t : ep.user_identity_tokens) {
std::cout << " - type=" << static_cast<int>(t.token_type)
<< " policy_id=" << t.policy_id << "\n";
}
}
典型输出
Server has 4 endpoints:
URL: opc.tcp://server:4840
Mode: 1 (None)
Policy: http://opcfoundation.org/UA/SecurityPolicy#None
Tokens:
- type=0 (Anonymous) policy_id=anonymous
URL: opc.tcp://server:4840
Mode: 2 (Sign)
Policy: http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
Tokens:
- type=0 (Anonymous)
- type=1 (Username)
URL: opc.tcp://server:4840
Mode: 3 (SignAndEncrypt)
Policy: http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
Tokens:
- type=1 (Username)
- type=2 (Certificate)
服务端通常暴露多个组合 (None / Sign / SignAndEncrypt × Anonymous / Username / Certificate), 客户端按需求挑.
异常
| 异常 | 含义 |
|---|---|
Exception("GetEndpoints failed", BadCommunicationError) | 网络 / 服务端不可达 |
Exception(..., BadServiceUnsupported) | 服务端不支持 Discovery (罕见) |