跳到主要内容

GetEndpoints

前置 / 配套

签名

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_urlstd::string实际 endpoint URL
security_modeMessageSecurityModeNone / Sign / SignAndEncrypt
security_policy_uristd::string算法套件 URI
server_certificatestd::vector<uint8_t>服务端证书 (DER)
user_identity_tokensstd::vector<UserTokenPolicy>支持的登录方式
transport_profile_uristd::string传输 Profile (通常 UA-TCP)
security_leveluint8_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 (罕见)

下一步