Discovery 发现 (C)
C SDK 没有 "静态类" 概念, Discovery 直接是两个独立的 ABI 函数, 不需要先 CreateSession 也不需要 Connect, 直接对 endpoint URL 发临时 SecureChannel + Discovery 请求 + Close.
子页跳转
- 列出某 Server 全部 Endpoint 请参考 GetEndpoints.
- 通过 LDS 列出域内全部 Server 请参考 FindServers.
用法模式
#include <darra_opcua/darra_opcua.h>
DarraUa_Initialize();
/* 1. 先 GetEndpoints 看服务端支持哪些组合 */
DarraUa_GetEndpointsResult* eps = NULL;
DarraUa_Discovery_GetEndpoints("opc.tcp://server:4840", 5000, &eps);
uint32_t n = DarraUa_GetEndpointsResult_GetCount(eps);
for (uint32_t i = 0; i < n; ++i) {
const DarraUa_EndpointDescription* ep =
DarraUa_GetEndpointsResult_GetEndpoint(eps, i);
printf("[%u] mode=%d %s\n", i, ep->security_mode, ep->endpoint_url);
}
/* 2. 挑一个匹配的, 用其 endpoint_url + security_mode + security_policy_uri 建会话 */
DarraUa_SessionConfig cfg;
DarraUa_SessionConfig_Init(&cfg);
const DarraUa_EndpointDescription* chosen =
DarraUa_GetEndpointsResult_GetEndpoint(eps, 0);
cfg.endpoint_url = chosen->endpoint_url;
cfg.security_mode = (DarraUa_MessageSecurityMode)chosen->security_mode;
cfg.security_policy_uri = chosen->security_policy_uri;
/* ... */
DarraUa_GetEndpointsResult_Delete(eps);