跳到主要内容

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);

下一步