nilesh1212
nilesh1212

Reputation: 1655

Working OPC UA Simulator example using OPCFoundation/UA-Java project

Anyone having simulator example of OPC UA, I am using OPC UA project https://github.com/OPCFoundation/UA-Java .

I have tried all the server mentioned on this git hub page, but none of them are working for me https://github.com/node-opcua/node-opcua/wiki/publicly-available-OPCUA-servers.

I am using org.opcfoundation.ua.examples.SampleClient utility to check connection and sample values, but not able to do so. If any one having working exampe w.r.t this please share along with code. Once this working I need to configure this setting in apache Nifi to make data pipeline.

code:

public class SampleClient {


    public static final Locale ENGLISH = Locale.ENGLISH;
    public static final Locale ENGLISH_FINLAND = new Locale("en", "FI");
    public static final Locale ENGLISH_US = new Locale("en", "US");

    public static final Locale FINNISH = new Locale("fi");
    public static final Locale FINNISH_FINLAND = new Locale("fi", "FI");

    public static final Locale GERMAN = Locale.GERMAN;
    public static final Locale GERMAN_GERMANY = new Locale("de", "DE");

    public static void main(String[] args) 
    throws Exception {
//      if (args.length==0) {
//          System.out.println("Usage: SampleClient [server uri]");
//          return;
//      }
        //String url = /*args[0]*/"opc.tcp://uademo.prosysopc.com:53530/OPCUA/SimulationServer";
        //String url = /*args[0]*/"opc.tcp://uademo.prosysopc.com:53530";
        //String url = /*args[0]*/"opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
        String url="opc.tcp://mfactorengineering.com:4840";
        //String url="opc.tcp://commsvr.com:51234/UA/CAS_UA_Server";
        //String url="opc.tcp://uademo.prosysopc.com:53530/OPCUA/SimulationServer";
        //String url="opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
        //String url="opc.tcp://opcua.demo-this.com:51211/UA/SampleServer";
        //String url="opc.tcp://opcua.demo-this.com:51212/UA/SampleServer";
        //String url="opc.tcp://demo.ascolab.com:4841";
        //String url="opc.tcp://alamscada.dynu.com:4096";

        System.out.print("SampleClient: Connecting to "+url+" .. ");

        //////////////  CLIENT  //////////////
        // Create Client
        Application myApplication = new Application();
        Client myClient = new Client(myApplication);
        myApplication.addLocale( ENGLISH );
        myApplication.setApplicationName( new LocalizedText("Java Sample Client", Locale.ENGLISH) );
        myApplication.setProductUri( "urn:JavaSampleClient" );

        CertificateUtils.setKeySize(1024); // default = 1024
        KeyPair pair = ExampleKeys.getCert("SampleClient");
        myApplication.addApplicationInstanceCertificate( pair );        

        // The HTTPS SecurityPolicies are defined separate from the endpoint securities
        myApplication.getHttpsSettings().setHttpsSecurityPolicies(HttpsSecurityPolicy.ALL);

        // Peer verifier
        myApplication.getHttpsSettings().setHostnameVerifier( SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER );
        myApplication.getHttpsSettings().setCertificateValidator( CertificateValidator.ALLOW_ALL );

        // The certificate to use for HTTPS
        KeyPair myHttpsCertificate = ExampleKeys.getHttpsCert("SampleClient"); 
        myApplication.getHttpsSettings().setKeyPair( myHttpsCertificate );

        // Connect to the given uri
        SessionChannel mySession = myClient.createSessionChannel(url);
//      mySession.activate("username", "123");
        mySession.activate();
        //////////////////////////////////////      

        /////////////  EXECUTE  //////////////      
        // Browse Root
        BrowseDescription browse = new BrowseDescription();
        browse.setNodeId( Identifiers.RootFolder );
        browse.setBrowseDirection( BrowseDirection.Forward );
        browse.setIncludeSubtypes( true );
        browse.setNodeClassMask( NodeClass.Object, NodeClass.Variable );
        browse.setResultMask( BrowseResultMask.All );
        BrowseResponse res3 = mySession.Browse( null, null, null, browse );             
        System.out.println(res3);

        // Read Namespace Array
        ReadResponse res5 = mySession.Read(
            null, 
            null, 
            TimestampsToReturn.Neither,                 
            new ReadValueId(Identifiers.Server_NamespaceArray, Attributes.Value, null, null ) 
        );
        String[] namespaceArray = (String[]) res5.getResults()[0].getValue().getValue();
        System.out.println(Arrays.toString(namespaceArray));

        // Read a variable
        ReadResponse res4 = mySession.Read(
            null, 
            500.0, 
            TimestampsToReturn.Source, 
            new ReadValueId(new NodeId(6, 1710), Attributes.Value, null, null ) 
        );      
        System.out.println(res4);

        res4 = mySession.Read(
            null, 
            500.0, 
            TimestampsToReturn.Source, 
            new ReadValueId(new NodeId(6, 1710), Attributes.DataType, null, null ) 
        );      
        System.out.println(res4);


        /////////////  SHUTDOWN  /////////////
        mySession.close();
        mySession.closeAsync();
        //////////////////////////////////////  

    }

}

exception:

SampleClient: Connecting to opc.tcp://mfactorengineering.com:4840 .. 2017-07-20 11:24:34,909 [main] INFO  CryptoUtil  - SecurityProvider initialized from org.bouncycastle.jce.provider.BouncyCastleProvider
2017-07-20 11:24:34,909 [main] INFO  CryptoUtil  - Using SecurityProvider BC
2017-07-20 11:24:35,549 [main] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Connecting
2017-07-20 11:24:36,142 [main] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Connected
2017-07-20 11:24:36,753 [main] INFO  SecureChannelTcp  - 1804305022 Closed
2017-07-20 11:24:36,768 [TcpConnection/Read] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Closed (expected)
2017-07-20 11:24:36,768 [main] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Closed
2017-07-20 11:24:36,768 [main] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Connecting
2017-07-20 11:24:37,408 [main] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Connect failed
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:209)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.net.SocketInputStream.read(SocketInputStream.java:223)
    at org.opcfoundation.ua.utils.bytebuffer.InputStreamReadable._get(InputStreamReadable.java:53)
    at org.opcfoundation.ua.utils.bytebuffer.InputStreamReadable.getInt(InputStreamReadable.java:144)
    at org.opcfoundation.ua.transport.tcp.io.TcpConnection.open(TcpConnection.java:500)
    at org.opcfoundation.ua.transport.tcp.io.SecureChannelTcp.open(SecureChannelTcp.java:565)
    at org.opcfoundation.ua.application.Client.createSecureChannel(Client.java:641)
    at org.opcfoundation.ua.application.Client.createSecureChannel(Client.java:555)
    at org.opcfoundation.ua.application.Client.createSessionChannel(Client.java:370)
    at org.opcfoundation.ua.application.Client.createSessionChannel(Client.java:345)
    at org.opcfoundation.ua.examples.SampleClient.main(SampleClient.java:120)
2017-07-20 11:24:37,464 [main] WARN  SecureChannelTcp  - Connection failed: Bad_CommunicationError (code=0x80050000, description="2147811328, Connection reset")
2017-07-20 11:24:37,464 [main] WARN  SecureChannelTcp  - Bad_CommunicationError: Retrying
2017-07-20 11:24:37,464 [main] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Connecting
2017-07-20 11:24:38,056 [main] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Connected
2017-07-20 11:24:38,368 [TcpConnection/Read] WARN  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Error
org.opcfoundation.ua.common.ServiceResultException: Bad_SecurityChecksFailed (code=0x80130000, description="An error occurred verifying security")
    at org.opcfoundation.ua.transport.tcp.io.TcpConnection$ReadThread.run(TcpConnection.java:782)
2017-07-20 11:24:38,368 [TcpConnection/Read] INFO  TcpConnection  - mfactorengineering.com/184.173.118.46:4840 Closed
Exception in thread "main" org.opcfoundation.ua.common.ServiceResultException: Bad_SecurityChecksFailed (code=0x80130000, description="An error occurred verifying security")
    at org.opcfoundation.ua.transport.tcp.io.TcpConnection$ReadThread.run(TcpConnection.java:782)

Upvotes: 0

Views: 3131

Answers (1)

Jouni Aro
Jouni Aro

Reputation: 2139

The example is written such that it always selects the most secure connection, which on the other hand requires that the server accepts the Application Instance Certificate of the client application, before it enables the connection. Bad_SecurityChecksFailed is the standard error code from the server, when it does not accept the client connection.

Since you cannot control these publicly available servers to make them trust your client application, your only alternative is to try to connect without security, if the server allows that.

For this, you need to change the code so that it picks an insecure endpoint.

Replace

SessionChannel mySession = myClient.createSessionChannel(url);

with

EndpointDescription[] endpoints = myClient.discoverEndpoints(url);
// Filter out all but opc.tcp protocol endpoints
endpoints = selectByProtocol(endpoints, "opc.tcp");
// Filter out all but Signed & Encrypted endpoints
endpoints = selectByMessageSecurityMode(endpoints, MessageSecurityMode.None);

// Choose one endpoint
if (endpoints.length == 0)
  throw new Exception("The server does not support insecure connections");
EndpointDescription endpoint = endpoints[0];
//////////////////////////////////////
SessionChannel mySession = myClient.createSessionChannel(endpoint);

(according to the lines of ClientExample1)

Upvotes: 2

Related Questions