菜菜鳕鱼堡 2024-05-21 16:54 采纳率: 0%
浏览 246
已结题

使用Java milo连接Kepserver服务端报错?

自己本地用java写了一个客户端,然后创建opcua客户端的方法如下

    public static OpcUaClient createClientNewEndpoint(String endPointUrl, String username, String password) {
        System.out.println(endPointUrl);
        IdentityProvider identityProvider = new AnonymousProvider();
        if (!StringUtils.isEmpty(username) || !StringUtils.isEmpty(password)) {
            identityProvider = new UsernameProvider(username, password);
        }
        try {
            Function<List<EndpointDescription>, Optional<EndpointDescription>> selectEndpoint = endpoints -> {
                final Optional<EndpointDescription> endpoint = endpoints
                        .stream()
                        .filter(e -> e.getSecurityPolicyUri().equals(SecurityPolicy.None.getUri()))
                        .findFirst();
                EndpointDescription newEndpoint = new EndpointDescription(endPointUrl, endpoint.get().getServer(), endpoint.get().getServerCertificate(),
                        endpoint.get().getSecurityMode(), endpoint.get().getSecurityPolicyUri(), endpoint.get().getUserIdentityTokens(),
                        endpoint.get().getTransportProfileUri(), endpoint.get().getSecurityLevel());
                return Optional.of(newEndpoint);
            };
            IdentityProvider finalIdentityProvider = identityProvider;
            OpcUaClient opcClient = OpcUaClient.create(endPointUrl,
                    selectEndpoint,
                    configBuilder -> configBuilder
                            .setApplicationName(LocalizedText.english("plc"))
                            .setApplicationUri("urn:eclipse:milo:examples:client")
                            //访问方式
                            .setIdentityProvider(finalIdentityProvider)
                            .setRequestTimeout(UInteger.valueOf(5000))
                            .build()
            );
            opcClient.connect().get();
            System.out.println("连接成功:success");
            return opcClient;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("======== opc connection fail ========");
        }
        return null;
    }

其中服务端是在另一个电脑上,kepserver的配置如下

img

我传入的endPointUrl是opc.tcp://192.168.53.124:49320。两个电脑在一个局域网下,测试过可以ping通。然后kepserver这边应该也是正常的(刚入门不是太会使用)

img

但是在我启动主程序试图连接后,报了如下的错误:
UaException: status=Bad_Timeout, message=io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.53.124:49320
我搜索其它文章,有博主说是因为原来是使用url去服务器端点列表查找符合条件的第一个端点,返回的地址使用的是内网地址,因此不能使用。需要重新构造EndpointDescription对象即可,以上代码是我根据该文章修改过后的:

但依旧会报上述的错误?请问我该怎么解决。我在kepserver中opcua的配置里的受信任的客户端似乎也没找到有新的需要我去信任。

以及,我之前使用的服务端是一个叫做Prosys OPC Simulation Server的软件,和我的程序在同一台电脑上,只修改了一个端点url就可以正常获取点位的值,不知道Kepserver为什么不行。

  • 写回答

9条回答 默认 最新

  • 阿里嘎多学长 2024-05-21 16:54
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题:您遇到的问题是在尝试使用Java Milo库连接Kepserver服务端时,程序抛出了UaException: status=Bad_Timeout, message=io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.53.124:49320的异常,导致无法成功建立连接。

    图片内容

    1. 第一张图片是Kepserver的OPC UA Configuration Manager界面截图,显示了服务器端点、安全性设置、TCP连接配置等信息。
    2. 第二张图片是OPC Quick Client界面截图,显示了数据项、数据类型、值、时间戳和质量等信息。

    问题出现原因

    • 根据错误信息,问题可能是由于连接超时导致的。这可能是由于网络问题、服务端配置错误或者客户端连接参数设置不当等原因造成。
    • 从您提供的代码和图片来看,您已经根据网络上的建议修改了代码,尝试重新构造EndpointDescription对象,但问题依旧存在。

    问题解决方案

    1. 检查网络连接:确保两台计算机确实在同一个局域网内,并且可以互相ping通。
    2. 检查Kepserver配置:确认Kepserver的OPC UA服务已经启动,并且端口号与您在代码中使用的端口号一致(49320)。
    3. 检查防火墙设置:确保没有防火墙规则阻止了您的Java客户端与Kepserver之间的通信。
    4. 检查客户端代码:确认客户端代码中的endpoint URL是否正确,并且没有拼写错误。同时,确认身份验证方式是否与Kepserver配置匹配。
    5. 增加日志和错误处理:在代码中增加更多的日志输出,以便于跟踪问题所在。同时,增强错误处理逻辑,以便更准确地定位问题。

    提供代码: 由于我无法直接修改图片中的代码,我建议您根据以下步骤检查和调整代码:

    • 确保endPointUrl是正确的,并且与Kepserver配置的URL相匹配。
    • 如果Kepserver配置了安全策略,请确保客户端代码中的身份验证方式与之匹配。
    • 检查selectEndpoint函数是否正确地选择了服务端的endpoint。

    代码运行方式

    • 确保您的Java开发环境已经设置好,包括所有必要的依赖库。
    • 将修改后的代码放入您的Java项目中,并确保所有依赖都已正确配置。
    • 运行您的Java程序,并观察控制台输出,检查是否有错误信息。

    代码预期运行结果: 如果一切配置正确,您应该能够看到控制台输出“连接成功:success”,而不会遇到连接超时的错误。

    推荐相关链接

    请注意,这些链接可能需要您根据具体情况进行进一步的搜索和筛选以找到最相关的解决方案。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月21日
  • 修改了问题 5月21日
  • 创建了问题 5月21日