PDComm.OpcUa.Client
클래스
호출자가 구동하는 OPC UA 클라이언트 세션입니다. UA Binary 서비스 요청을 보내고 응답을 폴링합니다.
public sealed class Client : IDisposable클라이언트는 백그라운드 작업이나 콜백을 만들지 않습니다. Client.Connect가 보안 채널(secure channel)을 열고 세션을 만듭니다. 세션은 Client.ActivateAnonymous 또는 Client.ActivateUserName으로 활성화합니다. 그런 다음 Client.Begin으로 요청을 보내고, 요청이 대기 중인 동안 Client.Poll을 주기적으로 호출하고, Client.Take로 각 응답을 수집합니다. 연결, 검색, 활성화, Client.Close는 네트워크 교환마다 구성된 타임아웃까지 차단될 수 있습니다.
한 클라이언트에 대한 호출은 내부 잠금으로 직렬화됩니다. 정상적으로 종료하려면 요청이 완료된 뒤 Client.Close를 호출한 다음 Client.Dispose를 호출합니다. 닫지 않고 해제하면 연결이 중단됩니다. 응답과 버퍼는 클라이언트를 닫거나 해제한 뒤에도 유효합니다.
API를 처음 사용할 때 네이티브 라이브러리가 OPC UA ABI 0.2를 구현하는지 확인합니다. 구현하지 않으면 호출이 내부 예외가 PlatformNotSupportedException인 TypeInitializationException을 throw하고, 이 프로세스에서 바인딩을 계속 사용할 수 없습니다.
using (var endpoints = Client.Discover(endpoint, 5000))
Console.WriteLine($"{endpoints.Copy().Length} bytes of GetEndpointsResponse");
using var client = Client.Connect(endpoint, new ClientOptions
{
Policy = policy, Mode = mode, AllowNone = policy == SecurityPolicy.None, TimeoutMs = 5000,
CertificateDer = Load(certificatePath), PrivateKeyPem = key, TrustedServerDer = Load(serverCertificatePath),
});
client.ActivateAnonymous();
uint id = client.Begin(readRequest); // a UA Binary ReadRequest with its encoding NodeId
var clock = Stopwatch.StartNew();
while (clock.Elapsed < TimeSpan.FromSeconds(5))
{
client.Poll();
using var response = client.Take(id);
if (response is not null) { Console.WriteLine($"0x{response.Info.ServiceStatus:x8}"); break; }
Thread.Sleep(1);
}
client.Close();멤버
ActivateAnonymous
메서드
익명 ID로 세션을 활성화합니다.
public void ActivateAnonymous()참고
ObjectDisposedException예외: 클라이언트가 해제되었습니다.OpcUaException예외: 서버가 활성화를 거부했거나, 교환이 실패했거나 시간이 초과되었습니다.
ActivateUserName
메서드
사용자 이름과 암호 ID로 세션을 활성화합니다.
public void ActivateUserName(string name, byte[] secret)매개변수
| 이름 | 설명 |
|---|---|
name | 사용자 이름입니다. |
secret | 암호 바이트이며 최대 16KiB입니다. 서버용으로 암호화되며 로그에 기록되지 않습니다. 배열은 호출자가 소유하므로 호출 후에 지우는 것이 좋습니다. |
참고
ObjectDisposedException예외: 클라이언트가 해제되었습니다.ArgumentNullException예외:name또는secret이null입니다.OpcUaException예외: 서버가 ID를 거부했거나, 교환이 실패했거나 시간이 초과되었습니다.
Begin
메서드
서비스 요청을 보냅니다.
public uint Begin(byte[] request)매개변수
| 이름 | 설명 |
|---|---|
request | 인코딩 NodeId로 시작하는 완전한 UA Binary 요청이며 최대 4MiB입니다. 클라이언트가 요청 헤더의 authenticationToken, timestamp, requestHandle을 교체합니다. 세션과 채널 수명 주기 요청은 거부되므로 전용 메서드를 사용합니다. |
반환값
Client.Take에 전달할 클라이언트 로컬 요청 ID입니다.
참고
ObjectDisposedException예외: 클라이언트가 해제되었습니다.ArgumentNullException예외:request가null입니다.OpcUaException예외: 요청 형식이 잘못되었거나 지원되지 않거나, 이미 64개의 요청이 처리 대기 중이거나, 세션을 사용할 수 없습니다.
Close
메서드
세션과 보안 채널을 정상 절차로 닫습니다.
public void Close()참고
ObjectDisposedException예외: 클라이언트가 해제되었습니다.OpcUaException예외: 닫기 교환이 실패했거나 시간이 초과되었습니다.
Connect
메서드
서버에 보안 채널을 열고 세션을 만듭니다.
public static Client Connect(string endpoint, ClientOptions options)매개변수
| 이름 | 설명 |
|---|---|
endpoint | 서버 URL입니다. 예를 들면 opc.tcp://localhost:4840/pdcomm입니다. |
options | 보안 정책, 모드, ID, 신뢰, 타임아웃입니다. |
반환값
호출자가 소유하며 해제해야 하는 새 클라이언트입니다. 요청을 보내기 전에 세션을 활성화해야 합니다.
참고
ArgumentNullException예외:endpoint또는options가null입니다.OpcUaException예외: 옵션이 잘못되었거나, 서버를 신뢰할 수 없거나, 요청한 보안과 일치하는 엔드포인트가 없거나, 연결이 실패했거나 시간이 초과되었거나,opcua-client모듈을 허가하는 유효한 라이선스가 없습니다(OpcUaException.LicenseRequired).TypeInitializationException예외: 네이티브 라이브러리가 없거나 OPC UA ABI 0.2를 구현하지 않습니다(내부 예외가 어느 쪽인지 알려 줍니다).
Discover
메서드
세션을 만들지 않고 서버의 엔드포인트를 요청합니다.
public static BinaryBuffer Discover(string endpoint, uint timeoutMs = 10000)검색(discovery)은 인증되지 않습니다. 서버 인증서를 검증하기 전에는 결과를 신뢰하지 마십시오.
매개변수
| 이름 | 설명 |
|---|---|
endpoint | 서버 URL입니다. 예를 들면 opc.tcp://localhost:4840/pdcomm입니다. |
timeoutMs | 각 네트워크 교환의 타임아웃(밀리초)입니다. |
반환값
인코딩 NodeId 접두사가 붙은 UA Binary GetEndpointsResponse를 담은 새 버퍼입니다. 호출자가 해제해야 합니다.
참고
ArgumentNullException예외:endpoint가null입니다.OpcUaException예외: URL이 잘못되었거나, 검색이 실패했거나 시간이 초과되었거나,opcua-client모듈을 허가하는 유효한 라이선스가 없습니다(OpcUaException.LicenseRequired).TypeInitializationException예외: 네이티브 라이브러리가 없거나 OPC UA ABI 0.2를 구현하지 않습니다(내부 예외가 어느 쪽인지 알려 줍니다).
Dispose
메서드
클라이언트를 해제합니다. 열린 연결은 프로토콜 닫기 절차 없이 중단됩니다.
public void Dispose()다른 스레드에서 실행 중인 호출이 있으면 그 호출이 반환될 때까지 네이티브 클라이언트가 유지됩니다. 이 메서드를 여러 번 호출해도 효과가 없습니다.
Poll
메서드
큐에 쌓인 요청 데이터를 보내고 도착한 응답을 읽습니다. 새 데이터를 기다리지 않습니다.
public void Poll()참고
ObjectDisposedException예외: 클라이언트가 해제되었습니다.OpcUaException예외: 연결이 실패했거나 대기 중인 요청이ClientOptions.TimeoutMs를 초과했습니다. 이런 실패가 발생하면 클라이언트가 닫히고 대기 중인 요청이 버려집니다. 이후 호출은 상태 10(닫힘)으로 실패합니다.
Take
메서드
요청에 대한 응답이 도착했으면 가져옵니다.
public Response? Take(uint request)매개변수
| 이름 | 설명 |
|---|---|
request | Client.Begin이 반환한 요청 ID입니다. |
반환값
호출자가 소유하며 해제해야 하는 검증된 응답이거나, 아직 도착하지 않았으면 null입니다. ServiceFault나 Bad 서비스 결과도 응답으로 반환됩니다.
참고
ObjectDisposedException예외: 클라이언트가 해제되었습니다.OpcUaException예외: 요청 ID를 알 수 없거나, 응답이 검증에 실패했거나, 클라이언트의 버퍼 레지스트리가 가득 찼습니다(버퍼를 해제한 다음 다음 폴링 전에 다시 시도합니다).
AbiVersion
속성
네이티브 라이브러리가 보고하는 ABI 버전을 가져옵니다. 상위 16비트는 주 버전, 하위 16비트는 부 버전입니다.
public static uint AbiVersion { get; }참고
TypeInitializationException예외: 네이티브 라이브러리가 없거나 OPC UA ABI 0.2를 구현하지 않습니다(내부 예외가 어느 쪽인지 알려 줍니다).