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

PDComm.OpcUa.Server

클래스

메모리 내 주소 공간을 가진, 호출자가 구동하는 OPC UA 서버입니다.

public sealed class Server : IDisposable

서버는 백그라운드 작업이나 콜백을 만들지 않습니다. 연결을 수락하고 요청을 처리하려면 Server.Poll을 주기적으로 호출해야 합니다. 서버는 Server.AddVariable로 Objects 폴더 아래에 추가한 기본 변수만 노출합니다. 외부 데이터 공급자, 이벤트, 이력, PubSub API는 없습니다. 익명 세션은 지원하지만 사용자 이름 인증과 X.509 사용자 인증은 지원하지 않습니다.

한 서버에 대한 호출은 내부 잠금으로 직렬화됩니다. Server.Close는 연결 수락을 멈추고, 프로토콜 종료 알림 없이 열린 채널을 중단합니다. Server.Dispose는 필요하면 같은 작업을 한 뒤 서버를 해제합니다. 서버가 반환한 버퍼는 그 뒤에도 유효합니다.

API를 처음 사용할 때 네이티브 라이브러리가 OPC UA ABI 0.2를 구현하는지 확인합니다. 구현하지 않으면 호출이 내부 예외가 PlatformNotSupportedException인 TypeInitializationException을 throw합니다.

using var server = Server.Create(bindAddress, new ServerOptions
{
    Endpoint = endpointUrl, CertificateDer = Load(certificatePath), PrivateKeyPem = key,
    TrustedClientDer = Load(clientCertificatePath),
});
server.AddVariable(UaBinary.NodeId(1001), "Value", UaBinary.Int32Variant(42), VariableFlags.Writable | VariableFlags.Public);
using (var address = server.LocalAddress())
    Console.WriteLine($"Listening on {Encoding.UTF8.GetString(address.Copy())}");
while (!stop.IsSet)
{
    server.Poll();
    stop.Wait(1);
}
server.Close();

멤버

AddVariable

메서드

Objects 폴더 아래에 변수를 추가합니다.

public void AddVariable(byte[] nodeId, string name, byte[] variant, VariableFlags flags = VariableFlags.None)

매개변수

이름설명
nodeId네임스페이스 인덱스 2(urn:pdcomm:opcua:nodes)를 사용하는 변수 NodeId의 UA Binary 인코딩입니다. 최대 4096바이트입니다.
name브라우즈 이름이자 표시 이름입니다.
variant형식이 있는 Variant(Null Variant가 아님)로 표현한 초기값의 UA Binary 인코딩입니다. 데이터 형식과 값 순위(value rank)는 이 값에서 추론됩니다. 최대 4MiB입니다.
flags접근 옵션입니다. 기본값은 인증된 세션에 대한 읽기 전용입니다.

참고

  • ObjectDisposedException 예외: 서버가 해제되었습니다.
  • ArgumentNullException 예외: nodeId, name 또는 variant가 null입니다.
  • OpcUaException 예외: 인코딩이 잘못되었거나, NodeId가 다른 네임스페이스에 있거나 이미 존재하거나, 주소 공간 한도(값 64MiB, 부모 아래 참조 8192개)를 초과하게 됩니다.

Close

메서드

연결 수락을 멈추고 열린 채널을 중단합니다.

public void Close()

클라이언트는 프로토콜 종료 알림을 받지 않습니다.

참고

  • ObjectDisposedException 예외: 서버가 해제되었습니다.
  • OpcUaException 예외: 네이티브 호출이 실패했습니다.

Create

메서드

서버를 만들고 수신 소켓을 바인딩합니다.

public static Server Create(string bindAddress, ServerOptions options)

매개변수

이름설명
bindAddress바인딩할 숫자 소켓 주소입니다. 예를 들면 0.0.0.0:4840 또는 127.0.0.1:0입니다. 서버가 알리는 ServerOptions.Endpoint URL과는 별개입니다.
options엔드포인트, ID, 신뢰, 용량 옵션입니다.

반환값

호출자가 소유하며 해제해야 하는 새 서버입니다.

참고

  • ArgumentNullException 예외: bindAddress 또는 options가 null입니다.
  • OpcUaException 예외: 옵션이 잘못되었거나, 소켓을 바인딩할 수 없거나, opcua-server 모듈을 허가하는 유효한 라이선스가 없습니다(OpcUaException.LicenseRequired, 아무것도 바인딩하지 않습니다).
  • TypeInitializationException 예외: 네이티브 라이브러리가 없거나 OPC UA ABI 0.2를 구현하지 않습니다(내부 예외가 어느 쪽인지 알려 줍니다).

Dispose

메서드

서버를 해제합니다. 서버가 아직 실행 중이면 열린 채널을 중단합니다.

public void Dispose()

다른 스레드에서 실행 중인 호출이 있으면 그 호출이 반환될 때까지 네이티브 서버가 유지됩니다. 이 메서드를 여러 번 호출해도 효과가 없습니다.

LocalAddress

메서드

서버가 바인딩된 소켓 주소를 가져옵니다. 예를 들어 포트 0에 대해 선택된 포트를 알아낼 때 사용합니다.

public BinaryBuffer LocalAddress()

반환값

종결자 없는 UTF-8 주소를 담은 새 버퍼입니다. 호출자가 해제해야 합니다.

참고

  • ObjectDisposedException 예외: 서버가 해제되었습니다.
  • OpcUaException 예외: 서버가 닫혔거나 네이티브 호출이 실패했습니다.

Poll

메서드

연결을 수락하고 대기 중인 요청을 처리합니다. 새 데이터를 기다리지 않습니다.

public void Poll()

참고

  • ObjectDisposedException 예외: 서버가 해제되었습니다.
  • OpcUaException 예외: 서버가 닫혔거나 실패했습니다.

ReadValue

메서드

애플리케이션에서 변수의 현재 값을 읽습니다.

public BinaryBuffer ReadValue(byte[] nodeId)

매개변수

이름설명
nodeId변수 NodeId의 UA Binary 인코딩입니다.

반환값

UA Binary DataValue를 담은 새 버퍼입니다. 호출자가 해제해야 합니다. 알 수 없는 노드는 예외 대신 상태가 BadNodeIdUnknown인 DataValue를 반환합니다.

참고

  • ObjectDisposedException 예외: 서버가 해제되었습니다.
  • ArgumentNullException 예외: nodeId가 null입니다.
  • OpcUaException 예외: NodeId 인코딩이 잘못되었거나 네이티브 호출이 실패했습니다.

SetValue

메서드

애플리케이션에서 변수 값을 설정합니다.

public uint SetValue(byte[] nodeId, byte[] variant)

매개변수

이름설명
nodeId변수 NodeId의 UA Binary 인코딩입니다.
variantVariant로 표현한 새 값의 UA Binary 인코딩입니다.

반환값

쓰기의 OPC UA 상태 코드입니다. 예를 들어 0(Good)이거나, 변수를 알 수 없거나 쓸 수 없거나 값의 형식이 잘못되었으면 Bad 코드입니다. 클라이언트 쓰기와 같은 쓰기 가능 여부 검사와 형식 검사가 적용됩니다.

참고

  • ObjectDisposedException 예외: 서버가 해제되었습니다.
  • ArgumentNullException 예외: nodeId 또는 variant가 null입니다.
  • OpcUaException 예외: 인코딩이 잘못되었거나 네이티브 호출이 실패했습니다.