我正在使用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会被更改?
答案 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类来执行此操作。