无法连接到opc-ua服务器超时错误

问题描述 投票:0回答:1

我想连接到安全策略为Basic256Sha256的OPC服务器。
我使用 eclipse/milo 代码。

这是我的

createClient
代码

public OpcUaClient createClient ( final String connectionUrl,
                              final String ip,
                              final int connectionTimeout ) throws Exception
{
    final File securityTempDir = new File ( BaseConsts.CACHE_INFO_FULL_PATH + "driver" + BaseConsts.FILE_SEPER + Props.AGENT_ID,
                    "security" );
    if ( !securityTempDir.exists () && !securityTempDir.mkdirs () )
    {
        throw new Exception ( "unable to create security dir: " + securityTempDir );
    }

    SecurityPolicy tempSecurityPolicy = null;

    if ( Props.SECURITY_POLICY.equals ( Consts.SECURITY_POLICY_0 ) )
    {
        tempSecurityPolicy = SecurityPolicy.None;
    } else if ( Props.SECURITY_POLICY.equals ( Consts.SECURITY_POLICY_1 ) )
    {
        tempSecurityPolicy = SecurityPolicy.Basic256;
    } else if ( Props.SECURITY_POLICY.equals ( Consts.SECURITY_POLICY_2 ) )
    {
        tempSecurityPolicy = SecurityPolicy.Basic256Sha256;
    } else if ( Props.SECURITY_POLICY.equals ( Consts.SECURITY_POLICY_3 ) )
    {
        tempSecurityPolicy = SecurityPolicy.Basic256Sha256;
    }

    final SecurityPolicy securityPolicy = tempSecurityPolicy;

    // final EndpointDescription [] endpoints = UaTcpStackClient.getEndpoints ( connectionUrl ).get ();

    List<EndpointDescription> endpoints;

    try
    {
        endpoints = DiscoveryClient.getEndpoints ( connectionUrl ).get ();

    } catch ( final Throwable ex )
    {
        // try the explicit discovery endpoint as well
        String discoveryUrl = connectionUrl;

        if ( !discoveryUrl.endsWith ( "/" ) )
        {
            discoveryUrl += "/";
        }
        discoveryUrl += "discovery";

        LOGGER.info ( "Trying explicit discovery URL: {}", discoveryUrl );

        endpoints = DiscoveryClient.getEndpoints ( discoveryUrl ).get ();
    }

    EndpointDescription endpoint = endpoints.stream ()
                    .filter ( e -> e.getSecurityPolicyUri ().equals ( securityPolicy.getUri () ) )
                    .filter ( e -> true )
                    .findFirst ()
                    .orElseThrow ( () -> new Exception ( "no desired endpoints returned" ) );

    // EndpointDescription endpoint = Arrays.stream ( endpoints )
    // .filter ( e -> e.getSecurityPolicyUri ().equals ( securityPolicy.getSecurityPolicyUri () ) )
    // .findFirst ().orElseThrow ( () -> new Exception ( "no desired endpoints returned" ) );

    final URI uri = new URI ( endpoint.getEndpointUrl () ).parseServerAuthority ();

    final String endpointUrl = String.format (
                    "%s://%s:%s%s",
                    uri.getScheme (),
                    ip,
                    uri.getPort (),
                    uri.getPath () );

    endpoint = new EndpointDescription (
                    endpointUrl,
                    endpoint.getServer (),
                    endpoint.getServerCertificate (),
                    endpoint.getSecurityMode (),
                    endpoint.getSecurityPolicyUri (),
                    endpoint.getUserIdentityTokens (),
                    endpoint.getTransportProfileUri (),
                    endpoint.getSecurityLevel () );
    

    LOGGER.info ( LogMsgUtil.infoFormat ( "Using endpoint: {} [{}]" ), endpoint.getEndpointUrl (), endpoint.getSecurityMode () );

    final UInteger timeout = UInteger.valueOf ( connectionTimeout );

    this.loader.load ( securityTempDir );

    final MessageLimits messageLimits = new MessageLimits ( DEFAULT_MAX_CHUNK_SIZE, DEFAULT_MAX_CHUNK_COUNT,
                    DEFAULT_MAX_MESSAGE_SIZE );

    // final EncodingLimits encodingLimits = new EncodingLimits ( DEFAULT_MAX_ARRAY_LENGTH,
    // DEFAULT_MAX_STRING_LENGTH,
    // DEFAULT_MAX_RECURSION_DEPTH );

    OpcUaClientConfig config = null;


        config = OpcUaClientConfig.builder ()
                        .setApplicationName ( LocalizedText.english ( BaseProps.SYSTEM_SERVICE_NAME + " OPC-UA Client" ) )
                        .setApplicationUri ( "urn:opcua:" + BaseProps.SYSTEM_SERVICE_NAME + " OPC-UA Client" )
                        .setCertificate ( this.loader.getClientCertificate () )
                        .setKeyPair ( this.loader.getClientKeyPair () )
                        .setEndpoint ( endpoint )
                        .setIdentityProvider ( new AnonymousProvider () )
                        .setRequestTimeout ( timeout )
                        .setMessageLimits ( messageLimits )
                        .build ();



    this.opcUAClient = OpcUaClient.create ( config );
    
    return this.opcUAClient;
}

这是我连接到服务器的代码。

this.opcUaClient = this.opcClient.createClient ( connectionUrl, this.devicePriIp, connectionTimeout );
                    this.opcUaClient.connect ().get ();

this.opcUaClient.connect().get()
代码中,发生超时错误。

这是日志 enter image description here

我尝试了一切..帮助我。

c# opc-ua milo
1个回答
0
投票

您的代码中可能没有做任何“错误”的事情。

您将错误消息剪短并提供了文本屏幕截图(tsk tsk),但从我所看到的情况来看,您似乎成功打开了 TCP 连接并发送了请求,但没有得到响应。

Wireshark 捕获可能有助于解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.