6

Java OPC-UA クライアントEclipse Miloを使用しています。サーバーのエンドポイント URL を使用してセッションを作成するたびに、メソッドUaTcpStackClient.getEndpoints()は URL を に変更しますlocalhost

String endpointUrl = "opc.tcp://10.8.0.104:48809";

EndpointDescription[] endpoints = UaTcpStackClient.getEndpoints(endpointUrl).get();

EndpointDescription endpoint = Arrays.stream(endpoints)
            .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri()))
            .findFirst().orElseThrow(() -> new Exception("no desired endpoints returned"));

ただし、接続に失敗した結果の値がendpoint.getEndpointUrl()返されます。opc.tcp://127.0.0.1:4880/

OPC URL が変更される理由がわかりません。

4

1 に答える 1

4

これは、UA クライアントを実装する際によくある問題です。

サーバーは、返されたエンドポイントの内容に対して最終的に責任を負います。接続先のサーバーは、エンドポイント URL で 127.0.0.1 を返すように (誤って) 構成されているようです。

サーバーから取得したエンドポイントを確認し、アプリケーションの性質に応じて、変更した URL を含む新しいコピーされた にすぐに置き換えるかEndpointDescription、ユーザーに知らせて最初に許可を求める必要があります。

どちらの場合でもEndpointDescriptionOpcUaClient.

または...サーバーを適切に構成して、公的に到達可能なホスト名またはIPアドレスを含むエンドポイントを返す方法を理解することもできます。

更新 2:

v0.2.2 以降EndpointUtil.updateUrl、 を変更するために使用できるものがありEndpointDescriptionました。

アップデート:

エンドポイント URL を置き換えるコードは、次のバリエーションの可能性があります。

private static EndpointDescription updateEndpointUrl(
    EndpointDescription original, String hostname) throws URISyntaxException {

    URI uri = new URI(original.getEndpointUrl()).parseServerAuthority();

    String endpointUrl = String.format(
        "%s://%s:%s%s",
        uri.getScheme(),
        hostname,
        uri.getPort(),
        uri.getPath()
    );

    return new EndpointDescription(
        endpointUrl,
        original.getServer(),
        original.getServerCertificate(),
        original.getSecurityMode(),
        original.getSecurityPolicyUri(),
        original.getUserIdentityTokens(),
        original.getTransportProfileUri(),
        original.getSecurityLevel()
    );
}

警告: これはほとんどの場合に機能しますが、機能しない注目すべきケースの 1 つは、リモート エンドポイントの URL に (RFC に従って) URL ホスト名で許可されていない文字 (アンダースコア (「_」) など) が含まれている場合です。残念ながら、これは Windows マシンのホスト名などで許可されています。そのため、URI クラスに依存するのではなく、エンドポイント URL を解析する他の方法を使用する必要がある場合があります。

于 2016-11-11T19:53:32.107 に答える