Java OPC-UA 客户端 Eclipse Milo 端点 URL 更改为本地主机
Java OPC-UA Client Eclipse Milo endpoint URL changes to localhost
我正在使用 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()
returns opc.tcp://127.0.0.1:4880/
的值导致连接失败。
我不知道为什么我的 OPC URL 被改变了?
这是实现 UA 客户端时很常见的问题。
服务器最终负责您返回的端点的内容,而您连接的端点在端点 URL 中(错误)配置为 return 127.0.0.1 s,显然。
您需要检查从服务器获得的端点,然后根据您的应用程序的性质,要么立即将它们替换为包含您的 URL 的新复制 EndpointDescription
s已经修改或让用户知道并先征得他们的同意。
无论哪种方式,您都需要创建一组新的 EndpointDescription
,在您继续创建 OpcUaClient
.[=16 之前,您已更正其中的 URL =]
或者...您可以弄清楚如何正确配置您的服务器,使其 returns 端点包含可公开访问的主机名或 IP 地址。
更新 2:
从v0.2.2开始有EndpointUtil.updateUrl
可以用来修改EndpointDescription
s.
更新:
替换端点 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),例如下划线(一个'_'),不幸的是,它在例如Windows 机器的主机名。因此,您可能需要使用其他一些方法来解析端点 URL 而不是依赖 URI class 来完成。
我正在使用 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()
returns opc.tcp://127.0.0.1:4880/
的值导致连接失败。
我不知道为什么我的 OPC URL 被改变了?
这是实现 UA 客户端时很常见的问题。
服务器最终负责您返回的端点的内容,而您连接的端点在端点 URL 中(错误)配置为 return 127.0.0.1 s,显然。
您需要检查从服务器获得的端点,然后根据您的应用程序的性质,要么立即将它们替换为包含您的 URL 的新复制 EndpointDescription
s已经修改或让用户知道并先征得他们的同意。
无论哪种方式,您都需要创建一组新的 EndpointDescription
,在您继续创建 OpcUaClient
.[=16 之前,您已更正其中的 URL =]
或者...您可以弄清楚如何正确配置您的服务器,使其 returns 端点包含可公开访问的主机名或 IP 地址。
更新 2:
从v0.2.2开始有EndpointUtil.updateUrl
可以用来修改EndpointDescription
s.
更新:
替换端点 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),例如下划线(一个'_'),不幸的是,它在例如Windows 机器的主机名。因此,您可能需要使用其他一些方法来解析端点 URL 而不是依赖 URI class 来完成。