콘텐츠로 이동
무료 평가 시작

pdcomm::opcua::client

클래스

보안 채널(secure channel) 하나를 사용하는 OPC UA 클라이언트 세션(session)입니다.

class client : public owned

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

connect()는 엔드포인트(endpoint)를 탐색하고, 보안 채널을 열고, 세션을 만듭니다. 서비스 요청을 보내기 전에 세션을 활성화합니다. begin()은 완전한 UA Binary 요청을 큐에 넣고, poll()은 소켓에서 바이트를 주고받으며, take()는 도착한 응답을 반환합니다. close()는 세션을 순서에 맞게 종료합니다. 열린 클라이언트를 소멸시키면 대신 소켓을 중단합니다.

examples/opcua/opcua_client.cpp에서 발췌:

static std::vector<uint8_t> exchange(ua::client& client, const uint8_t* request, size_t size,
                                     std::chrono::milliseconds timeout) {
  const auto id = client.begin(std::vector<uint8_t>(request, request + size));
  const auto deadline = std::chrono::steady_clock::now() + timeout;
  while (std::chrono::steady_clock::now() < deadline) {
    client.poll();
    if (auto response = client.take(id)) return response->copy();
    std::this_thread::sleep_for(std::chrono::milliseconds(1));
  }
  throw ua::error(PDCOMM_OPCUA_RUNTIME_ERROR, "Response timed out");
}
// ...
auto config = ua::options();
const auto certificate = load(argv[2]);
auto key = load(argv[3]);
const auto trust = load(argv[4]);
config.policy = policy;
config.mode = mode;
config.timeout_ms = 5000;
config.certificate_der = ua::bytes(certificate);
config.private_key_pem = ua::bytes(key);
config.trusted_server_der = ua::bytes(trust);
auto client = ua::client::connect(argv[1], config);
std::fill(key.begin(), key.end(), static_cast<unsigned char>(0));  // The SDK copied the identity.
client.activate_anonymous();
// ...
const auto size = ua_encode_read(request, sizeof(request), 2, node);
const auto body = exchange(client, request, size, std::chrono::seconds(5));
// ...
client.close();

참고

  • 클라이언트 하나는 한 번에 한 스레드에서만 사용합니다. 동시에 호출하면 #PDCOMM_OPCUA_BUSY와 함께 error를 던집니다. connect(), discover(), 활성화와 close()는 블로킹합니다. begin(), poll(), take()는 네트워크를 기다리지 않습니다. 처리 중인 요청이 있는 동안 poll()을 주기적으로 호출해야 합니다. 그렇지 않으면 timeout_ms 후 연결이 실패합니다.

멤버

activate_anonymous

메서드

세션을 익명으로 활성화합니다(ActivateSession).

void activate_anonymous()

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

참고

  • 예외 error: 서버가 토큰을 거부하거나, 처리 중인 요청이 있거나, 클라이언트가 닫혔으면 던집니다.

activate_user_name

메서드

사용자 이름과 암호로 세션을 활성화합니다(ActivateSession).

void activate_user_name(const std::string& name, const std::vector<uint8_t>& secret)

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

토큰 형식은 pdcomm_opcua_client_activate_user_name()을 참고합니다.

매개변수

이름설명
nameUTF-8 사용자 이름입니다. 1~1024바이트입니다.
secretUTF-8 암호입니다. 최대 16 KiB입니다. 호출자가 소유하며 호출 후 지워야 합니다.

참고

  • 예외 error: 채널이 SecurityPolicy None을 사용하거나, 서버가 사용자를 거부하거나, 처리 중인 요청이 있거나, 클라이언트가 닫혔으면 던집니다.

begin

메서드

UA Binary 서비스 요청 하나를 큐에 넣습니다.

uint32_t begin(const std::vector<uint8_t>& request)

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

지원하는 서비스와 라이브러리가 대체하는 RequestHeader 필드는 pdcomm_opcua_client_begin()을 참고합니다.

매개변수

이름설명
request인코딩 NodeId부터 시작하는 완전히 인코딩된 요청입니다. 호출 중에 복사됩니다.

반환값

take()에 전달할 요청 ID입니다.

참고

  • 예외 error: 지원하지 않거나 잘못된 요청이면 #PDCOMM_OPCUA_INVALID_INPUT, 처리 중인 요청이 64개이면 #PDCOMM_OPCUA_LIMIT, 클라이언트가 사용 중이거나 닫혔으면 다른 상태와 함께 던집니다.

close

메서드

세션과 보안 채널을 순서에 맞게 닫습니다.

void close()

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

먼저 처리 중인 응답을 모두 가져옵니다. 이 호출이 예외를 던져도 #PDCOMM_OPCUA_BUSY인 경우를 제외하면 클라이언트는 이후 닫힌 상태가 됩니다.

참고

  • 예외 error: 처리 중인 요청이 있으면 #PDCOMM_OPCUA_BUSY와 함께, 교환이 실패하거나 클라이언트가 닫혔으면 다른 상태와 함께 던집니다.

connect

메서드

서버에 연결하고 세션을 만듭니다.

static client connect(const std::string& url, const pdcomm_opcua_client_options& config)

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

pdcomm_opcua_client_connect()를 참고합니다. config의 개인 키는 호출 중에 복사됩니다. 호출 후 호출자의 사본을 지웁니다.

매개변수

이름설명
urlopc.tcp:// 엔드포인트 URL입니다.
configoptions()로 만들고 ID와 신뢰 설정을 채운 옵션입니다.

반환값

아직 활성화되지 않은 세션을 가진, 연결된 클라이언트입니다.

참고

  • 예외 error: ABI 버전이 다르거나, 옵션이 잘못되었거나, 엔드포인트가 공지되지 않았거나, 인증서가 거부되었거나, 네트워크가 실패하면 던집니다.

discover

메서드

인증 없이 서버의 엔드포인트를 읽습니다.

static buffer discover(const std::string& url, uint32_t timeout_ms = 10000)

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

pdcomm_opcua_discover()를 참고합니다.

매개변수

이름설명
urlopc.tcp:// 엔드포인트 URL입니다.
timeout_ms각 네트워크 교환의 타임아웃입니다. 1~300000 ms입니다.

반환값

UA Binary GetEndpointsResponse를 담은 버퍼입니다.

참고

  • 예외 error: ABI 버전이 다르거나, URL이 잘못되었거나, 네트워크가 실패하면 던집니다.

poll

메서드

블로킹 없이 큐에 있는 바이트를 보내고 도착한 응답을 받습니다.

void poll()

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

참고

  • 예외 error: 연결이 실패하면 던집니다. timeout_ms보다 오래된 처리 중인 요청도 포함합니다. 이후 클라이언트는 닫힙니다.

take

메서드

요청의 응답이 도착했으면 가져옵니다.

std::optional<response> take(uint32_t request)

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.hpp>

매개변수

이름설명
requestbegin()이 반환한 ID입니다.

반환값

검증된 응답입니다. 아직 도착하지 않았으면 std::nullopt입니다. ServiceFault도 응답으로 반환합니다.

참고

  • 예외 error: 알 수 없는 요청 ID(#PDCOMM_OPCUA_INVALID_INPUT), 잘못된 응답이나 서버가 중단한 응답(#PDCOMM_OPCUA_RUNTIME_ERROR), 가득 찬 핸들 레지스트리(#PDCOMM_OPCUA_LIMIT) 또는 닫힌 클라이언트에 대해 던집니다.