我想连接到安全策略为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()
代码中,发生超时错误。
我尝试了一切..帮助我。
您的代码中可能没有做任何“错误”的事情。
您将错误消息剪短并提供了文本屏幕截图(tsk tsk),但从我所看到的情况来看,您似乎成功打开了 TCP 连接并发送了请求,但没有得到响应。
Wireshark 捕获可能有助于解决问题。