2016-11-11 28 views
3

Java OPC-UAクライアントEclipse Miloを使用しています。サーバーのエンドポイントURLを使用してセッションを作成すると、方法UaTcpStackClient.getEndpoints()はURLをlocalhostに変更します。Java OPC-UAクライアントEclipse Miloエンドポイント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が変更される理由はわかりません。

答えて

2

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

サーバーは最終的に戻ってくるエンドポイントの内容に責任があり、接続先のサーバーはエンドポイントURLに127.0.0.1を返すように設定されています。

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

いずれにしても、EndpointDescriptionの新しいセットを作成して、OpcUaClientを作成する前にURLを修正しておく必要があります。

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

更新:

コードエンドポイントの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には、URLホスト名(RFCによる)に許可されていない文字(アンダースコア( '_')など)が含まれています。 Windowsマシンのホスト名したがって、URIクラスを使用するのではなく、エンドポイントURLを解析する他の方法を使用する必要があります。

+0

お返事ありがとうございます、私はあなたが言うことを理解しています。どのように新しい設定のEndpointDescriptionsを作成することができますか?何らかの方法やセッターメソッドが表示されません。 –

+0

サンプルコードを追加しました。 –

+0

ありがとう@kevin Herron –

関連する問題