Java OPC-UA客户端Eclipse Milo端点URL更改为localhost

时间:2016-11-11 18:38:57

标签: java localhost opc-ua milo

我正在使用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会被更改?

1 个答案:

答案 0 :(得分:3)

实施UA客户端时,这是一个非常常见的问题。

服务器最终负责您获取的端点的内容,而您正在连接的端点(错误)配置为在端点URL中返回127.0.0.1。显然。

您需要检查从服务器获得的端点,然后根据应用程序的性质,立即使用新复制的EndpointDescription替换它们,其中包含您已修改过的网址或让用户首先要知道并请求他们的许可。

无论哪种方式,您都需要在继续创建EndpointDescription之前创建一组新的OpcUaClient,其中您已经更正了网址。

或者......您可以弄清楚如何正确配置服务器,以便返回包含可公开访问的主机名或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()
    );
}
警告:这在大多数情况下都适用,但是一个值得注意的案例是它不起作用的是远程端点URL包含URL主机名(根据RFC)中不允许的字符,例如下划线(a) ' _'),遗憾的是,例如, Windows计算机的主机名。因此,您可能需要使用其他方法来解析端点URL,而不是依赖URI类来执行此操作。