OPC Client for milo fails to connect to local OPC discovery service












0














I am new to OPC UA and I am using milo OPC Subscriber client to connect to local discovery service. I have Prosys simulation server which is connected to my local discovery service.



Note: If I connect directly to prosys endpoint it works fine. It fails only through discovery service.



I get the following exception when I run my code



<pre>12:38:35.916 [main] INFO org.eclipse.milo.opcua.stack.core.Stack -
Successfully removed cryptography restrictions. 12:38:36.167 [main]
INFO com.company.OpcuaClientRunner - security temp dir:
C:UsersZ003Z2YPAppDataLocalTempsecurity 12:38:36.173 [main] INFO
com.company.KeyStoreLoader - Loading KeyStore at
C:UsersZ003Z2YPAppDataLocalTempsecurityexample-client.pfx
12:38:37.594 [main] INFO com.company.OpcuaClientRunner - Using
endpoint: opc.tcp://<hostname>:4840 [None] 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Stack version: 0.2.3 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Client SDK version: 0.2.3 12:38:37.809 [NonceUtilSecureRandom] INFO
org.eclipse.milo.opcua.stack.core.util.NonceUtil - SecureRandom seeded
in 0ms. 12:38:37.815 [ua-netty-event-loop-1] ERROR
org.eclipse.milo.opcua.stack.client.handlers.UaTcpClientMessageHandler
- [remote=<hostname>/<IP>:4840] errorMessage=ErrorMessage{error=StatusCode{name=Bad_ServiceUnsupported,
value=0x800B0000, quality=bad}, reason=null} 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running client example:
UaException: status=Bad_Timeout, message=request timed out after
16000ms java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748) 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running example: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748)</pre>


Code to create client in ClientRunner.





private OpcUaClient createClient() throws Exception {
File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
throw new Exception("unable to create security dir: " + securityTempDir);
}
LoggerFactory.getLogger(getClass())
.info("security temp dir: {}", securityTempDir.getAbsolutePath());

KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
loader.load();

SecurityPolicy securityPolicy = client.getSecurityPolicy();
EndpointDescription endpoints;

try {
endpoints = UaTcpStackClient
.getEndpoints(client.getEndpointUrl())
.get();
} catch (Throwable ex) {
ex.printStackTrace();
// try the explicit discovery endpoint as well
String discoveryUrl = client.getEndpointUrl();
logger.info("Trying explicit discovery URL: {}", discoveryUrl);
endpoints = UaTcpStackClient
.getEndpoints(discoveryUrl)
.get();
}

EndpointDescription endpoint = Arrays.stream(endpoints)
.filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri()))
.findFirst().orElseThrow(() -> new Exception("no desired endpoints returned"));
logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

OpcUaClientConfig config = OpcUaClientConfig.builder()
.setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
.setApplicationUri("urn:eclipse:milo:examples:client")
.setCertificate(loader.getClientCertificate())
.setKeyPair(loader.getClientKeyPair())
.setEndpoint(endpoint)
.setIdentityProvider(client.getIdentityProvider())
.setRequestTimeout(uint(5000))
.build();

return new OpcUaClient(config);


Client interface class



public interface OpcuaClientInterface {

public static final String USERNAME = "demo";
public static final String PASSWORD = "demo";

default String getEndpointUrl() {
return "opc.tcp://localhost:4840/UADiscovery";
}

default SecurityPolicy getSecurityPolicy() {
return SecurityPolicy.None;
}


default IdentityProvider getIdentityProvider() {
// return new UsernameProvider(USERNAME,PASSWORD);
return new AnonymousProvider();
}

void run (OpcUaClient client, CompletableFuture future) throws Exception;

}


subscriber run implementation





@Override
public void run(OpcUaClient client, CompletableFuture future) throws Exception {
// synchronous connect
client.connect().get();

// create a subscription @ 1000ms
UaSubscription subscription = client.getSubscriptionManager().createSubscription(1000.0).get();

List nodeIds = Arrays.asList("SuctionPressure", "DischargePressure", "Flow", "BearingTemperature", "Vibration", "Power");
// List nodeIds = Arrays.asList("DS", "PV");

List MICRs = nodeIds.stream().map(id -> {
ReadValueId readValueId = new ReadValueId(new NodeId(3, id), AttributeId.Value.uid(), null,
QualifiedName.NULL_VALUE);

// important: client handle must be unique per item
UInteger clientHandle = uint(clientHandles.getAndIncrement());

MonitoringParameters parameters = new MonitoringParameters(clientHandle, 1000.0, // sampling interval
null, // filter, null means use default
uint(10), // queue size
true // discard oldest
);

MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting,
parameters);
return request;
}).collect(Collectors.toList());

// when creating items in MonitoringMode.Reporting this callback is where each
// item needs to have its
// value/event consumer hooked up. The alternative is to create the item in
// sampling mode, hook up the
// consumer after the creation call completes, and then change the mode for all
// items to reporting.
BiConsumer onItemCreated = (item, id) -> item
.setValueConsumer(this::onSubscriptionValue);

List items = subscription.createMonitoredItems(TimestampsToReturn.Both, MICRs, onItemCreated)
.get();

for (UaMonitoredItem item : items) {
if (item.getStatusCode().isGood()) {
logger.info("item created for nodeId={}", item.getReadValueId().getNodeId());
} else {
logger.warn("failed to create item for nodeId={} (status={})", item.getReadValueId().getNodeId(),
item.getStatusCode());
}
}

// let the example run for 5 seconds then terminate
// Thread.sleep(1000 * 60 * 1);
// future.complete(client);
}










share|improve this question
























  • I think you need to provide some example code. Maybe you're not specifying a hostname when connecting.
    – Kevin Herron
    Nov 23 '18 at 14:58










  • @KevinHerron updated the post with the code snippets. I am passing the hostname/IP of the discovery service while creating client. I am reusing the example codes from the Milo codebase.
    – Bob
    Nov 23 '18 at 16:14
















0














I am new to OPC UA and I am using milo OPC Subscriber client to connect to local discovery service. I have Prosys simulation server which is connected to my local discovery service.



Note: If I connect directly to prosys endpoint it works fine. It fails only through discovery service.



I get the following exception when I run my code



<pre>12:38:35.916 [main] INFO org.eclipse.milo.opcua.stack.core.Stack -
Successfully removed cryptography restrictions. 12:38:36.167 [main]
INFO com.company.OpcuaClientRunner - security temp dir:
C:UsersZ003Z2YPAppDataLocalTempsecurity 12:38:36.173 [main] INFO
com.company.KeyStoreLoader - Loading KeyStore at
C:UsersZ003Z2YPAppDataLocalTempsecurityexample-client.pfx
12:38:37.594 [main] INFO com.company.OpcuaClientRunner - Using
endpoint: opc.tcp://<hostname>:4840 [None] 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Stack version: 0.2.3 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Client SDK version: 0.2.3 12:38:37.809 [NonceUtilSecureRandom] INFO
org.eclipse.milo.opcua.stack.core.util.NonceUtil - SecureRandom seeded
in 0ms. 12:38:37.815 [ua-netty-event-loop-1] ERROR
org.eclipse.milo.opcua.stack.client.handlers.UaTcpClientMessageHandler
- [remote=<hostname>/<IP>:4840] errorMessage=ErrorMessage{error=StatusCode{name=Bad_ServiceUnsupported,
value=0x800B0000, quality=bad}, reason=null} 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running client example:
UaException: status=Bad_Timeout, message=request timed out after
16000ms java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748) 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running example: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748)</pre>


Code to create client in ClientRunner.





private OpcUaClient createClient() throws Exception {
File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
throw new Exception("unable to create security dir: " + securityTempDir);
}
LoggerFactory.getLogger(getClass())
.info("security temp dir: {}", securityTempDir.getAbsolutePath());

KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
loader.load();

SecurityPolicy securityPolicy = client.getSecurityPolicy();
EndpointDescription endpoints;

try {
endpoints = UaTcpStackClient
.getEndpoints(client.getEndpointUrl())
.get();
} catch (Throwable ex) {
ex.printStackTrace();
// try the explicit discovery endpoint as well
String discoveryUrl = client.getEndpointUrl();
logger.info("Trying explicit discovery URL: {}", discoveryUrl);
endpoints = UaTcpStackClient
.getEndpoints(discoveryUrl)
.get();
}

EndpointDescription endpoint = Arrays.stream(endpoints)
.filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri()))
.findFirst().orElseThrow(() -> new Exception("no desired endpoints returned"));
logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

OpcUaClientConfig config = OpcUaClientConfig.builder()
.setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
.setApplicationUri("urn:eclipse:milo:examples:client")
.setCertificate(loader.getClientCertificate())
.setKeyPair(loader.getClientKeyPair())
.setEndpoint(endpoint)
.setIdentityProvider(client.getIdentityProvider())
.setRequestTimeout(uint(5000))
.build();

return new OpcUaClient(config);


Client interface class



public interface OpcuaClientInterface {

public static final String USERNAME = "demo";
public static final String PASSWORD = "demo";

default String getEndpointUrl() {
return "opc.tcp://localhost:4840/UADiscovery";
}

default SecurityPolicy getSecurityPolicy() {
return SecurityPolicy.None;
}


default IdentityProvider getIdentityProvider() {
// return new UsernameProvider(USERNAME,PASSWORD);
return new AnonymousProvider();
}

void run (OpcUaClient client, CompletableFuture future) throws Exception;

}


subscriber run implementation





@Override
public void run(OpcUaClient client, CompletableFuture future) throws Exception {
// synchronous connect
client.connect().get();

// create a subscription @ 1000ms
UaSubscription subscription = client.getSubscriptionManager().createSubscription(1000.0).get();

List nodeIds = Arrays.asList("SuctionPressure", "DischargePressure", "Flow", "BearingTemperature", "Vibration", "Power");
// List nodeIds = Arrays.asList("DS", "PV");

List MICRs = nodeIds.stream().map(id -> {
ReadValueId readValueId = new ReadValueId(new NodeId(3, id), AttributeId.Value.uid(), null,
QualifiedName.NULL_VALUE);

// important: client handle must be unique per item
UInteger clientHandle = uint(clientHandles.getAndIncrement());

MonitoringParameters parameters = new MonitoringParameters(clientHandle, 1000.0, // sampling interval
null, // filter, null means use default
uint(10), // queue size
true // discard oldest
);

MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting,
parameters);
return request;
}).collect(Collectors.toList());

// when creating items in MonitoringMode.Reporting this callback is where each
// item needs to have its
// value/event consumer hooked up. The alternative is to create the item in
// sampling mode, hook up the
// consumer after the creation call completes, and then change the mode for all
// items to reporting.
BiConsumer onItemCreated = (item, id) -> item
.setValueConsumer(this::onSubscriptionValue);

List items = subscription.createMonitoredItems(TimestampsToReturn.Both, MICRs, onItemCreated)
.get();

for (UaMonitoredItem item : items) {
if (item.getStatusCode().isGood()) {
logger.info("item created for nodeId={}", item.getReadValueId().getNodeId());
} else {
logger.warn("failed to create item for nodeId={} (status={})", item.getReadValueId().getNodeId(),
item.getStatusCode());
}
}

// let the example run for 5 seconds then terminate
// Thread.sleep(1000 * 60 * 1);
// future.complete(client);
}










share|improve this question
























  • I think you need to provide some example code. Maybe you're not specifying a hostname when connecting.
    – Kevin Herron
    Nov 23 '18 at 14:58










  • @KevinHerron updated the post with the code snippets. I am passing the hostname/IP of the discovery service while creating client. I am reusing the example codes from the Milo codebase.
    – Bob
    Nov 23 '18 at 16:14














0












0








0







I am new to OPC UA and I am using milo OPC Subscriber client to connect to local discovery service. I have Prosys simulation server which is connected to my local discovery service.



Note: If I connect directly to prosys endpoint it works fine. It fails only through discovery service.



I get the following exception when I run my code



<pre>12:38:35.916 [main] INFO org.eclipse.milo.opcua.stack.core.Stack -
Successfully removed cryptography restrictions. 12:38:36.167 [main]
INFO com.company.OpcuaClientRunner - security temp dir:
C:UsersZ003Z2YPAppDataLocalTempsecurity 12:38:36.173 [main] INFO
com.company.KeyStoreLoader - Loading KeyStore at
C:UsersZ003Z2YPAppDataLocalTempsecurityexample-client.pfx
12:38:37.594 [main] INFO com.company.OpcuaClientRunner - Using
endpoint: opc.tcp://<hostname>:4840 [None] 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Stack version: 0.2.3 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Client SDK version: 0.2.3 12:38:37.809 [NonceUtilSecureRandom] INFO
org.eclipse.milo.opcua.stack.core.util.NonceUtil - SecureRandom seeded
in 0ms. 12:38:37.815 [ua-netty-event-loop-1] ERROR
org.eclipse.milo.opcua.stack.client.handlers.UaTcpClientMessageHandler
- [remote=<hostname>/<IP>:4840] errorMessage=ErrorMessage{error=StatusCode{name=Bad_ServiceUnsupported,
value=0x800B0000, quality=bad}, reason=null} 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running client example:
UaException: status=Bad_Timeout, message=request timed out after
16000ms java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748) 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running example: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748)</pre>


Code to create client in ClientRunner.





private OpcUaClient createClient() throws Exception {
File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
throw new Exception("unable to create security dir: " + securityTempDir);
}
LoggerFactory.getLogger(getClass())
.info("security temp dir: {}", securityTempDir.getAbsolutePath());

KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
loader.load();

SecurityPolicy securityPolicy = client.getSecurityPolicy();
EndpointDescription endpoints;

try {
endpoints = UaTcpStackClient
.getEndpoints(client.getEndpointUrl())
.get();
} catch (Throwable ex) {
ex.printStackTrace();
// try the explicit discovery endpoint as well
String discoveryUrl = client.getEndpointUrl();
logger.info("Trying explicit discovery URL: {}", discoveryUrl);
endpoints = UaTcpStackClient
.getEndpoints(discoveryUrl)
.get();
}

EndpointDescription endpoint = Arrays.stream(endpoints)
.filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri()))
.findFirst().orElseThrow(() -> new Exception("no desired endpoints returned"));
logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

OpcUaClientConfig config = OpcUaClientConfig.builder()
.setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
.setApplicationUri("urn:eclipse:milo:examples:client")
.setCertificate(loader.getClientCertificate())
.setKeyPair(loader.getClientKeyPair())
.setEndpoint(endpoint)
.setIdentityProvider(client.getIdentityProvider())
.setRequestTimeout(uint(5000))
.build();

return new OpcUaClient(config);


Client interface class



public interface OpcuaClientInterface {

public static final String USERNAME = "demo";
public static final String PASSWORD = "demo";

default String getEndpointUrl() {
return "opc.tcp://localhost:4840/UADiscovery";
}

default SecurityPolicy getSecurityPolicy() {
return SecurityPolicy.None;
}


default IdentityProvider getIdentityProvider() {
// return new UsernameProvider(USERNAME,PASSWORD);
return new AnonymousProvider();
}

void run (OpcUaClient client, CompletableFuture future) throws Exception;

}


subscriber run implementation





@Override
public void run(OpcUaClient client, CompletableFuture future) throws Exception {
// synchronous connect
client.connect().get();

// create a subscription @ 1000ms
UaSubscription subscription = client.getSubscriptionManager().createSubscription(1000.0).get();

List nodeIds = Arrays.asList("SuctionPressure", "DischargePressure", "Flow", "BearingTemperature", "Vibration", "Power");
// List nodeIds = Arrays.asList("DS", "PV");

List MICRs = nodeIds.stream().map(id -> {
ReadValueId readValueId = new ReadValueId(new NodeId(3, id), AttributeId.Value.uid(), null,
QualifiedName.NULL_VALUE);

// important: client handle must be unique per item
UInteger clientHandle = uint(clientHandles.getAndIncrement());

MonitoringParameters parameters = new MonitoringParameters(clientHandle, 1000.0, // sampling interval
null, // filter, null means use default
uint(10), // queue size
true // discard oldest
);

MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting,
parameters);
return request;
}).collect(Collectors.toList());

// when creating items in MonitoringMode.Reporting this callback is where each
// item needs to have its
// value/event consumer hooked up. The alternative is to create the item in
// sampling mode, hook up the
// consumer after the creation call completes, and then change the mode for all
// items to reporting.
BiConsumer onItemCreated = (item, id) -> item
.setValueConsumer(this::onSubscriptionValue);

List items = subscription.createMonitoredItems(TimestampsToReturn.Both, MICRs, onItemCreated)
.get();

for (UaMonitoredItem item : items) {
if (item.getStatusCode().isGood()) {
logger.info("item created for nodeId={}", item.getReadValueId().getNodeId());
} else {
logger.warn("failed to create item for nodeId={} (status={})", item.getReadValueId().getNodeId(),
item.getStatusCode());
}
}

// let the example run for 5 seconds then terminate
// Thread.sleep(1000 * 60 * 1);
// future.complete(client);
}










share|improve this question















I am new to OPC UA and I am using milo OPC Subscriber client to connect to local discovery service. I have Prosys simulation server which is connected to my local discovery service.



Note: If I connect directly to prosys endpoint it works fine. It fails only through discovery service.



I get the following exception when I run my code



<pre>12:38:35.916 [main] INFO org.eclipse.milo.opcua.stack.core.Stack -
Successfully removed cryptography restrictions. 12:38:36.167 [main]
INFO com.company.OpcuaClientRunner - security temp dir:
C:UsersZ003Z2YPAppDataLocalTempsecurity 12:38:36.173 [main] INFO
com.company.KeyStoreLoader - Loading KeyStore at
C:UsersZ003Z2YPAppDataLocalTempsecurityexample-client.pfx
12:38:37.594 [main] INFO com.company.OpcuaClientRunner - Using
endpoint: opc.tcp://<hostname>:4840 [None] 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Stack version: 0.2.3 12:38:37.600 [main] INFO
org.eclipse.milo.opcua.sdk.client.OpcUaClient - Eclipse Milo OPC UA
Client SDK version: 0.2.3 12:38:37.809 [NonceUtilSecureRandom] INFO
org.eclipse.milo.opcua.stack.core.util.NonceUtil - SecureRandom seeded
in 0ms. 12:38:37.815 [ua-netty-event-loop-1] ERROR
org.eclipse.milo.opcua.stack.client.handlers.UaTcpClientMessageHandler
- [remote=<hostname>/<IP>:4840] errorMessage=ErrorMessage{error=StatusCode{name=Bad_ServiceUnsupported,
value=0x800B0000, quality=bad}, reason=null} 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running client example:
UaException: status=Bad_Timeout, message=request timed out after
16000ms java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748) 12:38:53.828 [main] ERROR
com.company.OpcuaClientRunner - Error running example: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
java.util.concurrent.ExecutionException: UaException:
status=Bad_Timeout, message=request timed out after 16000ms
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.company.OpcuaSubscriber.run(OpcuaSubscriber.java:49)
at com.company.OpcuaClientRunner.run(OpcuaClientRunner.java:122)
at com.company.OpcuaSubscriber.main(OpcuaSubscriber.java:120) Caused by:
org.eclipse.milo.opcua.stack.core.UaException: request timed out after
16000ms
at org.eclipse.milo.opcua.stack.client.UaTcpStackClient.lambda$scheduleRequestTimeout$13(UaTcpStackClient.java:326)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at java.lang.Thread.run(Thread.java:748)</pre>


Code to create client in ClientRunner.





private OpcUaClient createClient() throws Exception {
File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
throw new Exception("unable to create security dir: " + securityTempDir);
}
LoggerFactory.getLogger(getClass())
.info("security temp dir: {}", securityTempDir.getAbsolutePath());

KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
loader.load();

SecurityPolicy securityPolicy = client.getSecurityPolicy();
EndpointDescription endpoints;

try {
endpoints = UaTcpStackClient
.getEndpoints(client.getEndpointUrl())
.get();
} catch (Throwable ex) {
ex.printStackTrace();
// try the explicit discovery endpoint as well
String discoveryUrl = client.getEndpointUrl();
logger.info("Trying explicit discovery URL: {}", discoveryUrl);
endpoints = UaTcpStackClient
.getEndpoints(discoveryUrl)
.get();
}

EndpointDescription endpoint = Arrays.stream(endpoints)
.filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri()))
.findFirst().orElseThrow(() -> new Exception("no desired endpoints returned"));
logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

OpcUaClientConfig config = OpcUaClientConfig.builder()
.setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
.setApplicationUri("urn:eclipse:milo:examples:client")
.setCertificate(loader.getClientCertificate())
.setKeyPair(loader.getClientKeyPair())
.setEndpoint(endpoint)
.setIdentityProvider(client.getIdentityProvider())
.setRequestTimeout(uint(5000))
.build();

return new OpcUaClient(config);


Client interface class



public interface OpcuaClientInterface {

public static final String USERNAME = "demo";
public static final String PASSWORD = "demo";

default String getEndpointUrl() {
return "opc.tcp://localhost:4840/UADiscovery";
}

default SecurityPolicy getSecurityPolicy() {
return SecurityPolicy.None;
}


default IdentityProvider getIdentityProvider() {
// return new UsernameProvider(USERNAME,PASSWORD);
return new AnonymousProvider();
}

void run (OpcUaClient client, CompletableFuture future) throws Exception;

}


subscriber run implementation





@Override
public void run(OpcUaClient client, CompletableFuture future) throws Exception {
// synchronous connect
client.connect().get();

// create a subscription @ 1000ms
UaSubscription subscription = client.getSubscriptionManager().createSubscription(1000.0).get();

List nodeIds = Arrays.asList("SuctionPressure", "DischargePressure", "Flow", "BearingTemperature", "Vibration", "Power");
// List nodeIds = Arrays.asList("DS", "PV");

List MICRs = nodeIds.stream().map(id -> {
ReadValueId readValueId = new ReadValueId(new NodeId(3, id), AttributeId.Value.uid(), null,
QualifiedName.NULL_VALUE);

// important: client handle must be unique per item
UInteger clientHandle = uint(clientHandles.getAndIncrement());

MonitoringParameters parameters = new MonitoringParameters(clientHandle, 1000.0, // sampling interval
null, // filter, null means use default
uint(10), // queue size
true // discard oldest
);

MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting,
parameters);
return request;
}).collect(Collectors.toList());

// when creating items in MonitoringMode.Reporting this callback is where each
// item needs to have its
// value/event consumer hooked up. The alternative is to create the item in
// sampling mode, hook up the
// consumer after the creation call completes, and then change the mode for all
// items to reporting.
BiConsumer onItemCreated = (item, id) -> item
.setValueConsumer(this::onSubscriptionValue);

List items = subscription.createMonitoredItems(TimestampsToReturn.Both, MICRs, onItemCreated)
.get();

for (UaMonitoredItem item : items) {
if (item.getStatusCode().isGood()) {
logger.info("item created for nodeId={}", item.getReadValueId().getNodeId());
} else {
logger.warn("failed to create item for nodeId={} (status={})", item.getReadValueId().getNodeId(),
item.getStatusCode());
}
}

// let the example run for 5 seconds then terminate
// Thread.sleep(1000 * 60 * 1);
// future.complete(client);
}







java opc-ua milo






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 23 '18 at 16:18

























asked Nov 23 '18 at 4:52









Bob

12




12












  • I think you need to provide some example code. Maybe you're not specifying a hostname when connecting.
    – Kevin Herron
    Nov 23 '18 at 14:58










  • @KevinHerron updated the post with the code snippets. I am passing the hostname/IP of the discovery service while creating client. I am reusing the example codes from the Milo codebase.
    – Bob
    Nov 23 '18 at 16:14


















  • I think you need to provide some example code. Maybe you're not specifying a hostname when connecting.
    – Kevin Herron
    Nov 23 '18 at 14:58










  • @KevinHerron updated the post with the code snippets. I am passing the hostname/IP of the discovery service while creating client. I am reusing the example codes from the Milo codebase.
    – Bob
    Nov 23 '18 at 16:14
















I think you need to provide some example code. Maybe you're not specifying a hostname when connecting.
– Kevin Herron
Nov 23 '18 at 14:58




I think you need to provide some example code. Maybe you're not specifying a hostname when connecting.
– Kevin Herron
Nov 23 '18 at 14:58












@KevinHerron updated the post with the code snippets. I am passing the hostname/IP of the discovery service while creating client. I am reusing the example codes from the Milo codebase.
– Bob
Nov 23 '18 at 16:14




@KevinHerron updated the post with the code snippets. I am passing the hostname/IP of the discovery service while creating client. I am reusing the example codes from the Milo codebase.
– Bob
Nov 23 '18 at 16:14












2 Answers
2






active

oldest

votes


















0














I think you may be confused about what a Discovery Server does.



You don't connect "through" a Discovery Server to another server. It's more like a registry where other servers can register themselves and then clients can go and see what servers are available.



The client queries the discovery server for a list of servers, selects one, and then connects directly to that server using the information obtained from the discovery server.






share|improve this answer





















  • I got the concept that I will need to connect to discovery server to get the endpoints of the OPC servers registered on it. I also tried to use Find Servers example available @ github.com/eclipse/milo/blob/feature/lds/milo-examples/…. I get following error UaException: status=Bad_ServerNotConnected, message=The operation could not complete because the client is not connected to the server. Can you point to me any document reference or example I can test for getting endpoint from the discovery server.
    – Bob
    Nov 26 '18 at 2:05












  • I also tried to connect UaExpert OPC client to the discovery server. It connects successfully to OPC Server. I thinks its just the way I am using the Milo client examples is not correct.
    – Bob
    Nov 26 '18 at 2:16










  • That FindServersClient is out of date, it looks like something just needs to call connect() on the client instance before using it. Didn't remember that example existed.
    – Kevin Herron
    Nov 26 '18 at 3:19



















0














I got it working with the milo OPC Subscriber client.



following is the changes I did in the classes.



Client Interface



public interface OpcuaClientInterface {

public static final String USERNAME = "demo";
public static final String PASSWORD = "demo";
public static final String UaServerName = "SimulationServer";

default String getEndpointUrl() {
return "opc.tcp://localhost:4840";
}

default SecurityPolicy getSecurityPolicy() {
return SecurityPolicy.None;
}

default String getUaServerName () {
return UaServerName;
}


default IdentityProvider getIdentityProvider() {
return new UsernameProvider(USERNAME,PASSWORD);
}

void run (OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception;


}



client runner class



public class OpcuaClientRunner {

static {
CryptoRestrictions.remove();
Security.addProvider(new BouncyCastleProvider());
}
private final AtomicLong requestHandle = new AtomicLong(1L);

private final Logger logger = LoggerFactory.getLogger(getClass());
private final CompletableFuture<OpcUaClient> future = new CompletableFuture<>();

private final OpcuaClientInterface client;

public OpcuaClientRunner(OpcuaClientInterface client) throws Exception {
this.client = client;
}

private KeyStoreLoader createKeyStore() {
KeyStoreLoader loader = null;
try {
File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
throw new Exception("unable to create security dir: " + securityTempDir);
}
LoggerFactory.getLogger(getClass()).info("security temp dir: {}", securityTempDir.getAbsolutePath());
loader = new KeyStoreLoader().load(securityTempDir);
loader.load();
} catch (Exception e) {
logger.error("Could not load keys {}", e);
return null;
}
return loader;
}

private CompletableFuture<ServerOnNetwork> findServersOnNetwork(String discoveryEndpointUrl)
throws InterruptedException, ExecutionException {
UaStackClient c = createDiscoveryClient(client.getEndpointUrl()).connect().get();
RequestHeader header = new RequestHeader(NodeId.NULL_VALUE, DateTime.now(),
uint(requestHandle.getAndIncrement()), uint(0), null, uint(60), null);

FindServersOnNetworkRequest request = new FindServersOnNetworkRequest(header, null, null, null);

return c.<FindServersOnNetworkResponse>sendRequest(request).thenCompose(result -> {
StatusCode statusCode = result.getResponseHeader().getServiceResult();

if (statusCode.isGood()) {
return CompletableFuture.completedFuture(result.getServers());
} else {
CompletableFuture<ServerOnNetwork> f = new CompletableFuture<>();
f.completeExceptionally(new UaException(statusCode));
return f;
}
});
}

private UaTcpStackClient createDiscoveryClient(String endpointUrl) {
KeyStoreLoader loader = createKeyStore();
if (loader == null) {
return null;
}
UaTcpStackClientConfig config = UaTcpStackClientConfig.builder()
.setApplicationName(LocalizedText.english("Stack Example Client"))
.setApplicationUri(String.format("urn:example-client:%s", UUID.randomUUID()))
.setCertificate(loader.getClientCertificate()).setKeyPair(loader.getClientKeyPair())
.setEndpointUrl(endpointUrl).build();

return new UaTcpStackClient(config);
}

private OpcUaClient createUaClient() throws Exception {

KeyStoreLoader loader = createKeyStore();
if (loader == null) {
return null;
}

SecurityPolicy securityPolicy = client.getSecurityPolicy();
EndpointDescription endpoints = null;

try {
ServerOnNetwork servers = findServersOnNetwork(client.getEndpointUrl()).get();
ServerOnNetwork server = Arrays.stream(servers)
.filter(e -> e.getServerName().equals(client.getUaServerName())).findFirst()
.orElseThrow(() -> new Exception("no desired UA Server returned."));
endpoints = UaTcpStackClient.getEndpoints(server.getDiscoveryUrl()).get();
} catch (Throwable ex) {
ex.printStackTrace();
}

EndpointDescription endpoint = Arrays.stream(endpoints)
.filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri())).findFirst()
.orElseThrow(() -> new Exception("no desired endpoints returned"));
logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

OpcUaClientConfig config = OpcUaClientConfig.builder()
.setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
.setApplicationUri("urn:eclipse:milo:examples:client").setCertificate(loader.getClientCertificate())
.setKeyPair(loader.getClientKeyPair()).setEndpoint(endpoint)
.setIdentityProvider(client.getIdentityProvider()).setRequestTimeout(uint(5000)).build();

return new OpcUaClient(config);
}

public void run() {
try {
OpcUaClient uaClient = createUaClient();
future.whenComplete((c, ex) -> {
if (ex != null) {
logger.error("Error running example: {}", ex.getMessage(), ex);
}

try {
uaClient.disconnect().get();
Stack.releaseSharedResources();
} catch (InterruptedException | ExecutionException e) {
logger.error("Error disconnecting:", e.getMessage(), e);
}

try {
Thread.sleep(1000);
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
});

try {
client.run(uaClient, future);
future.get(15, TimeUnit.SECONDS);
} catch (Throwable t) {
logger.error("Error running client example: {}", t.getMessage(), t);
future.completeExceptionally(t);
}

} catch (Throwable t) {
logger.error("Error getting client: {}", t.getMessage(), t);

future.completeExceptionally(t);

try {
Thread.sleep(1000);
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

/*
* try { Thread.sleep(999999999); } catch (InterruptedException e) {
* e.printStackTrace(); }
*/
}


}






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53440813%2fopc-client-for-milo-fails-to-connect-to-local-opc-discovery-service%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    I think you may be confused about what a Discovery Server does.



    You don't connect "through" a Discovery Server to another server. It's more like a registry where other servers can register themselves and then clients can go and see what servers are available.



    The client queries the discovery server for a list of servers, selects one, and then connects directly to that server using the information obtained from the discovery server.






    share|improve this answer





















    • I got the concept that I will need to connect to discovery server to get the endpoints of the OPC servers registered on it. I also tried to use Find Servers example available @ github.com/eclipse/milo/blob/feature/lds/milo-examples/…. I get following error UaException: status=Bad_ServerNotConnected, message=The operation could not complete because the client is not connected to the server. Can you point to me any document reference or example I can test for getting endpoint from the discovery server.
      – Bob
      Nov 26 '18 at 2:05












    • I also tried to connect UaExpert OPC client to the discovery server. It connects successfully to OPC Server. I thinks its just the way I am using the Milo client examples is not correct.
      – Bob
      Nov 26 '18 at 2:16










    • That FindServersClient is out of date, it looks like something just needs to call connect() on the client instance before using it. Didn't remember that example existed.
      – Kevin Herron
      Nov 26 '18 at 3:19
















    0














    I think you may be confused about what a Discovery Server does.



    You don't connect "through" a Discovery Server to another server. It's more like a registry where other servers can register themselves and then clients can go and see what servers are available.



    The client queries the discovery server for a list of servers, selects one, and then connects directly to that server using the information obtained from the discovery server.






    share|improve this answer





















    • I got the concept that I will need to connect to discovery server to get the endpoints of the OPC servers registered on it. I also tried to use Find Servers example available @ github.com/eclipse/milo/blob/feature/lds/milo-examples/…. I get following error UaException: status=Bad_ServerNotConnected, message=The operation could not complete because the client is not connected to the server. Can you point to me any document reference or example I can test for getting endpoint from the discovery server.
      – Bob
      Nov 26 '18 at 2:05












    • I also tried to connect UaExpert OPC client to the discovery server. It connects successfully to OPC Server. I thinks its just the way I am using the Milo client examples is not correct.
      – Bob
      Nov 26 '18 at 2:16










    • That FindServersClient is out of date, it looks like something just needs to call connect() on the client instance before using it. Didn't remember that example existed.
      – Kevin Herron
      Nov 26 '18 at 3:19














    0












    0








    0






    I think you may be confused about what a Discovery Server does.



    You don't connect "through" a Discovery Server to another server. It's more like a registry where other servers can register themselves and then clients can go and see what servers are available.



    The client queries the discovery server for a list of servers, selects one, and then connects directly to that server using the information obtained from the discovery server.






    share|improve this answer












    I think you may be confused about what a Discovery Server does.



    You don't connect "through" a Discovery Server to another server. It's more like a registry where other servers can register themselves and then clients can go and see what servers are available.



    The client queries the discovery server for a list of servers, selects one, and then connects directly to that server using the information obtained from the discovery server.







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 24 '18 at 20:50









    Kevin Herron

    2,77321723




    2,77321723












    • I got the concept that I will need to connect to discovery server to get the endpoints of the OPC servers registered on it. I also tried to use Find Servers example available @ github.com/eclipse/milo/blob/feature/lds/milo-examples/…. I get following error UaException: status=Bad_ServerNotConnected, message=The operation could not complete because the client is not connected to the server. Can you point to me any document reference or example I can test for getting endpoint from the discovery server.
      – Bob
      Nov 26 '18 at 2:05












    • I also tried to connect UaExpert OPC client to the discovery server. It connects successfully to OPC Server. I thinks its just the way I am using the Milo client examples is not correct.
      – Bob
      Nov 26 '18 at 2:16










    • That FindServersClient is out of date, it looks like something just needs to call connect() on the client instance before using it. Didn't remember that example existed.
      – Kevin Herron
      Nov 26 '18 at 3:19


















    • I got the concept that I will need to connect to discovery server to get the endpoints of the OPC servers registered on it. I also tried to use Find Servers example available @ github.com/eclipse/milo/blob/feature/lds/milo-examples/…. I get following error UaException: status=Bad_ServerNotConnected, message=The operation could not complete because the client is not connected to the server. Can you point to me any document reference or example I can test for getting endpoint from the discovery server.
      – Bob
      Nov 26 '18 at 2:05












    • I also tried to connect UaExpert OPC client to the discovery server. It connects successfully to OPC Server. I thinks its just the way I am using the Milo client examples is not correct.
      – Bob
      Nov 26 '18 at 2:16










    • That FindServersClient is out of date, it looks like something just needs to call connect() on the client instance before using it. Didn't remember that example existed.
      – Kevin Herron
      Nov 26 '18 at 3:19
















    I got the concept that I will need to connect to discovery server to get the endpoints of the OPC servers registered on it. I also tried to use Find Servers example available @ github.com/eclipse/milo/blob/feature/lds/milo-examples/…. I get following error UaException: status=Bad_ServerNotConnected, message=The operation could not complete because the client is not connected to the server. Can you point to me any document reference or example I can test for getting endpoint from the discovery server.
    – Bob
    Nov 26 '18 at 2:05






    I got the concept that I will need to connect to discovery server to get the endpoints of the OPC servers registered on it. I also tried to use Find Servers example available @ github.com/eclipse/milo/blob/feature/lds/milo-examples/…. I get following error UaException: status=Bad_ServerNotConnected, message=The operation could not complete because the client is not connected to the server. Can you point to me any document reference or example I can test for getting endpoint from the discovery server.
    – Bob
    Nov 26 '18 at 2:05














    I also tried to connect UaExpert OPC client to the discovery server. It connects successfully to OPC Server. I thinks its just the way I am using the Milo client examples is not correct.
    – Bob
    Nov 26 '18 at 2:16




    I also tried to connect UaExpert OPC client to the discovery server. It connects successfully to OPC Server. I thinks its just the way I am using the Milo client examples is not correct.
    – Bob
    Nov 26 '18 at 2:16












    That FindServersClient is out of date, it looks like something just needs to call connect() on the client instance before using it. Didn't remember that example existed.
    – Kevin Herron
    Nov 26 '18 at 3:19




    That FindServersClient is out of date, it looks like something just needs to call connect() on the client instance before using it. Didn't remember that example existed.
    – Kevin Herron
    Nov 26 '18 at 3:19













    0














    I got it working with the milo OPC Subscriber client.



    following is the changes I did in the classes.



    Client Interface



    public interface OpcuaClientInterface {

    public static final String USERNAME = "demo";
    public static final String PASSWORD = "demo";
    public static final String UaServerName = "SimulationServer";

    default String getEndpointUrl() {
    return "opc.tcp://localhost:4840";
    }

    default SecurityPolicy getSecurityPolicy() {
    return SecurityPolicy.None;
    }

    default String getUaServerName () {
    return UaServerName;
    }


    default IdentityProvider getIdentityProvider() {
    return new UsernameProvider(USERNAME,PASSWORD);
    }

    void run (OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception;


    }



    client runner class



    public class OpcuaClientRunner {

    static {
    CryptoRestrictions.remove();
    Security.addProvider(new BouncyCastleProvider());
    }
    private final AtomicLong requestHandle = new AtomicLong(1L);

    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final CompletableFuture<OpcUaClient> future = new CompletableFuture<>();

    private final OpcuaClientInterface client;

    public OpcuaClientRunner(OpcuaClientInterface client) throws Exception {
    this.client = client;
    }

    private KeyStoreLoader createKeyStore() {
    KeyStoreLoader loader = null;
    try {
    File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
    if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
    throw new Exception("unable to create security dir: " + securityTempDir);
    }
    LoggerFactory.getLogger(getClass()).info("security temp dir: {}", securityTempDir.getAbsolutePath());
    loader = new KeyStoreLoader().load(securityTempDir);
    loader.load();
    } catch (Exception e) {
    logger.error("Could not load keys {}", e);
    return null;
    }
    return loader;
    }

    private CompletableFuture<ServerOnNetwork> findServersOnNetwork(String discoveryEndpointUrl)
    throws InterruptedException, ExecutionException {
    UaStackClient c = createDiscoveryClient(client.getEndpointUrl()).connect().get();
    RequestHeader header = new RequestHeader(NodeId.NULL_VALUE, DateTime.now(),
    uint(requestHandle.getAndIncrement()), uint(0), null, uint(60), null);

    FindServersOnNetworkRequest request = new FindServersOnNetworkRequest(header, null, null, null);

    return c.<FindServersOnNetworkResponse>sendRequest(request).thenCompose(result -> {
    StatusCode statusCode = result.getResponseHeader().getServiceResult();

    if (statusCode.isGood()) {
    return CompletableFuture.completedFuture(result.getServers());
    } else {
    CompletableFuture<ServerOnNetwork> f = new CompletableFuture<>();
    f.completeExceptionally(new UaException(statusCode));
    return f;
    }
    });
    }

    private UaTcpStackClient createDiscoveryClient(String endpointUrl) {
    KeyStoreLoader loader = createKeyStore();
    if (loader == null) {
    return null;
    }
    UaTcpStackClientConfig config = UaTcpStackClientConfig.builder()
    .setApplicationName(LocalizedText.english("Stack Example Client"))
    .setApplicationUri(String.format("urn:example-client:%s", UUID.randomUUID()))
    .setCertificate(loader.getClientCertificate()).setKeyPair(loader.getClientKeyPair())
    .setEndpointUrl(endpointUrl).build();

    return new UaTcpStackClient(config);
    }

    private OpcUaClient createUaClient() throws Exception {

    KeyStoreLoader loader = createKeyStore();
    if (loader == null) {
    return null;
    }

    SecurityPolicy securityPolicy = client.getSecurityPolicy();
    EndpointDescription endpoints = null;

    try {
    ServerOnNetwork servers = findServersOnNetwork(client.getEndpointUrl()).get();
    ServerOnNetwork server = Arrays.stream(servers)
    .filter(e -> e.getServerName().equals(client.getUaServerName())).findFirst()
    .orElseThrow(() -> new Exception("no desired UA Server returned."));
    endpoints = UaTcpStackClient.getEndpoints(server.getDiscoveryUrl()).get();
    } catch (Throwable ex) {
    ex.printStackTrace();
    }

    EndpointDescription endpoint = Arrays.stream(endpoints)
    .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri())).findFirst()
    .orElseThrow(() -> new Exception("no desired endpoints returned"));
    logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

    OpcUaClientConfig config = OpcUaClientConfig.builder()
    .setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
    .setApplicationUri("urn:eclipse:milo:examples:client").setCertificate(loader.getClientCertificate())
    .setKeyPair(loader.getClientKeyPair()).setEndpoint(endpoint)
    .setIdentityProvider(client.getIdentityProvider()).setRequestTimeout(uint(5000)).build();

    return new OpcUaClient(config);
    }

    public void run() {
    try {
    OpcUaClient uaClient = createUaClient();
    future.whenComplete((c, ex) -> {
    if (ex != null) {
    logger.error("Error running example: {}", ex.getMessage(), ex);
    }

    try {
    uaClient.disconnect().get();
    Stack.releaseSharedResources();
    } catch (InterruptedException | ExecutionException e) {
    logger.error("Error disconnecting:", e.getMessage(), e);
    }

    try {
    Thread.sleep(1000);
    System.exit(0);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    });

    try {
    client.run(uaClient, future);
    future.get(15, TimeUnit.SECONDS);
    } catch (Throwable t) {
    logger.error("Error running client example: {}", t.getMessage(), t);
    future.completeExceptionally(t);
    }

    } catch (Throwable t) {
    logger.error("Error getting client: {}", t.getMessage(), t);

    future.completeExceptionally(t);

    try {
    Thread.sleep(1000);
    System.exit(0);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }

    /*
    * try { Thread.sleep(999999999); } catch (InterruptedException e) {
    * e.printStackTrace(); }
    */
    }


    }






    share|improve this answer


























      0














      I got it working with the milo OPC Subscriber client.



      following is the changes I did in the classes.



      Client Interface



      public interface OpcuaClientInterface {

      public static final String USERNAME = "demo";
      public static final String PASSWORD = "demo";
      public static final String UaServerName = "SimulationServer";

      default String getEndpointUrl() {
      return "opc.tcp://localhost:4840";
      }

      default SecurityPolicy getSecurityPolicy() {
      return SecurityPolicy.None;
      }

      default String getUaServerName () {
      return UaServerName;
      }


      default IdentityProvider getIdentityProvider() {
      return new UsernameProvider(USERNAME,PASSWORD);
      }

      void run (OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception;


      }



      client runner class



      public class OpcuaClientRunner {

      static {
      CryptoRestrictions.remove();
      Security.addProvider(new BouncyCastleProvider());
      }
      private final AtomicLong requestHandle = new AtomicLong(1L);

      private final Logger logger = LoggerFactory.getLogger(getClass());
      private final CompletableFuture<OpcUaClient> future = new CompletableFuture<>();

      private final OpcuaClientInterface client;

      public OpcuaClientRunner(OpcuaClientInterface client) throws Exception {
      this.client = client;
      }

      private KeyStoreLoader createKeyStore() {
      KeyStoreLoader loader = null;
      try {
      File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
      if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
      throw new Exception("unable to create security dir: " + securityTempDir);
      }
      LoggerFactory.getLogger(getClass()).info("security temp dir: {}", securityTempDir.getAbsolutePath());
      loader = new KeyStoreLoader().load(securityTempDir);
      loader.load();
      } catch (Exception e) {
      logger.error("Could not load keys {}", e);
      return null;
      }
      return loader;
      }

      private CompletableFuture<ServerOnNetwork> findServersOnNetwork(String discoveryEndpointUrl)
      throws InterruptedException, ExecutionException {
      UaStackClient c = createDiscoveryClient(client.getEndpointUrl()).connect().get();
      RequestHeader header = new RequestHeader(NodeId.NULL_VALUE, DateTime.now(),
      uint(requestHandle.getAndIncrement()), uint(0), null, uint(60), null);

      FindServersOnNetworkRequest request = new FindServersOnNetworkRequest(header, null, null, null);

      return c.<FindServersOnNetworkResponse>sendRequest(request).thenCompose(result -> {
      StatusCode statusCode = result.getResponseHeader().getServiceResult();

      if (statusCode.isGood()) {
      return CompletableFuture.completedFuture(result.getServers());
      } else {
      CompletableFuture<ServerOnNetwork> f = new CompletableFuture<>();
      f.completeExceptionally(new UaException(statusCode));
      return f;
      }
      });
      }

      private UaTcpStackClient createDiscoveryClient(String endpointUrl) {
      KeyStoreLoader loader = createKeyStore();
      if (loader == null) {
      return null;
      }
      UaTcpStackClientConfig config = UaTcpStackClientConfig.builder()
      .setApplicationName(LocalizedText.english("Stack Example Client"))
      .setApplicationUri(String.format("urn:example-client:%s", UUID.randomUUID()))
      .setCertificate(loader.getClientCertificate()).setKeyPair(loader.getClientKeyPair())
      .setEndpointUrl(endpointUrl).build();

      return new UaTcpStackClient(config);
      }

      private OpcUaClient createUaClient() throws Exception {

      KeyStoreLoader loader = createKeyStore();
      if (loader == null) {
      return null;
      }

      SecurityPolicy securityPolicy = client.getSecurityPolicy();
      EndpointDescription endpoints = null;

      try {
      ServerOnNetwork servers = findServersOnNetwork(client.getEndpointUrl()).get();
      ServerOnNetwork server = Arrays.stream(servers)
      .filter(e -> e.getServerName().equals(client.getUaServerName())).findFirst()
      .orElseThrow(() -> new Exception("no desired UA Server returned."));
      endpoints = UaTcpStackClient.getEndpoints(server.getDiscoveryUrl()).get();
      } catch (Throwable ex) {
      ex.printStackTrace();
      }

      EndpointDescription endpoint = Arrays.stream(endpoints)
      .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri())).findFirst()
      .orElseThrow(() -> new Exception("no desired endpoints returned"));
      logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

      OpcUaClientConfig config = OpcUaClientConfig.builder()
      .setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
      .setApplicationUri("urn:eclipse:milo:examples:client").setCertificate(loader.getClientCertificate())
      .setKeyPair(loader.getClientKeyPair()).setEndpoint(endpoint)
      .setIdentityProvider(client.getIdentityProvider()).setRequestTimeout(uint(5000)).build();

      return new OpcUaClient(config);
      }

      public void run() {
      try {
      OpcUaClient uaClient = createUaClient();
      future.whenComplete((c, ex) -> {
      if (ex != null) {
      logger.error("Error running example: {}", ex.getMessage(), ex);
      }

      try {
      uaClient.disconnect().get();
      Stack.releaseSharedResources();
      } catch (InterruptedException | ExecutionException e) {
      logger.error("Error disconnecting:", e.getMessage(), e);
      }

      try {
      Thread.sleep(1000);
      System.exit(0);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      });

      try {
      client.run(uaClient, future);
      future.get(15, TimeUnit.SECONDS);
      } catch (Throwable t) {
      logger.error("Error running client example: {}", t.getMessage(), t);
      future.completeExceptionally(t);
      }

      } catch (Throwable t) {
      logger.error("Error getting client: {}", t.getMessage(), t);

      future.completeExceptionally(t);

      try {
      Thread.sleep(1000);
      System.exit(0);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      }

      /*
      * try { Thread.sleep(999999999); } catch (InterruptedException e) {
      * e.printStackTrace(); }
      */
      }


      }






      share|improve this answer
























        0












        0








        0






        I got it working with the milo OPC Subscriber client.



        following is the changes I did in the classes.



        Client Interface



        public interface OpcuaClientInterface {

        public static final String USERNAME = "demo";
        public static final String PASSWORD = "demo";
        public static final String UaServerName = "SimulationServer";

        default String getEndpointUrl() {
        return "opc.tcp://localhost:4840";
        }

        default SecurityPolicy getSecurityPolicy() {
        return SecurityPolicy.None;
        }

        default String getUaServerName () {
        return UaServerName;
        }


        default IdentityProvider getIdentityProvider() {
        return new UsernameProvider(USERNAME,PASSWORD);
        }

        void run (OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception;


        }



        client runner class



        public class OpcuaClientRunner {

        static {
        CryptoRestrictions.remove();
        Security.addProvider(new BouncyCastleProvider());
        }
        private final AtomicLong requestHandle = new AtomicLong(1L);

        private final Logger logger = LoggerFactory.getLogger(getClass());
        private final CompletableFuture<OpcUaClient> future = new CompletableFuture<>();

        private final OpcuaClientInterface client;

        public OpcuaClientRunner(OpcuaClientInterface client) throws Exception {
        this.client = client;
        }

        private KeyStoreLoader createKeyStore() {
        KeyStoreLoader loader = null;
        try {
        File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
        if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
        throw new Exception("unable to create security dir: " + securityTempDir);
        }
        LoggerFactory.getLogger(getClass()).info("security temp dir: {}", securityTempDir.getAbsolutePath());
        loader = new KeyStoreLoader().load(securityTempDir);
        loader.load();
        } catch (Exception e) {
        logger.error("Could not load keys {}", e);
        return null;
        }
        return loader;
        }

        private CompletableFuture<ServerOnNetwork> findServersOnNetwork(String discoveryEndpointUrl)
        throws InterruptedException, ExecutionException {
        UaStackClient c = createDiscoveryClient(client.getEndpointUrl()).connect().get();
        RequestHeader header = new RequestHeader(NodeId.NULL_VALUE, DateTime.now(),
        uint(requestHandle.getAndIncrement()), uint(0), null, uint(60), null);

        FindServersOnNetworkRequest request = new FindServersOnNetworkRequest(header, null, null, null);

        return c.<FindServersOnNetworkResponse>sendRequest(request).thenCompose(result -> {
        StatusCode statusCode = result.getResponseHeader().getServiceResult();

        if (statusCode.isGood()) {
        return CompletableFuture.completedFuture(result.getServers());
        } else {
        CompletableFuture<ServerOnNetwork> f = new CompletableFuture<>();
        f.completeExceptionally(new UaException(statusCode));
        return f;
        }
        });
        }

        private UaTcpStackClient createDiscoveryClient(String endpointUrl) {
        KeyStoreLoader loader = createKeyStore();
        if (loader == null) {
        return null;
        }
        UaTcpStackClientConfig config = UaTcpStackClientConfig.builder()
        .setApplicationName(LocalizedText.english("Stack Example Client"))
        .setApplicationUri(String.format("urn:example-client:%s", UUID.randomUUID()))
        .setCertificate(loader.getClientCertificate()).setKeyPair(loader.getClientKeyPair())
        .setEndpointUrl(endpointUrl).build();

        return new UaTcpStackClient(config);
        }

        private OpcUaClient createUaClient() throws Exception {

        KeyStoreLoader loader = createKeyStore();
        if (loader == null) {
        return null;
        }

        SecurityPolicy securityPolicy = client.getSecurityPolicy();
        EndpointDescription endpoints = null;

        try {
        ServerOnNetwork servers = findServersOnNetwork(client.getEndpointUrl()).get();
        ServerOnNetwork server = Arrays.stream(servers)
        .filter(e -> e.getServerName().equals(client.getUaServerName())).findFirst()
        .orElseThrow(() -> new Exception("no desired UA Server returned."));
        endpoints = UaTcpStackClient.getEndpoints(server.getDiscoveryUrl()).get();
        } catch (Throwable ex) {
        ex.printStackTrace();
        }

        EndpointDescription endpoint = Arrays.stream(endpoints)
        .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri())).findFirst()
        .orElseThrow(() -> new Exception("no desired endpoints returned"));
        logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

        OpcUaClientConfig config = OpcUaClientConfig.builder()
        .setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
        .setApplicationUri("urn:eclipse:milo:examples:client").setCertificate(loader.getClientCertificate())
        .setKeyPair(loader.getClientKeyPair()).setEndpoint(endpoint)
        .setIdentityProvider(client.getIdentityProvider()).setRequestTimeout(uint(5000)).build();

        return new OpcUaClient(config);
        }

        public void run() {
        try {
        OpcUaClient uaClient = createUaClient();
        future.whenComplete((c, ex) -> {
        if (ex != null) {
        logger.error("Error running example: {}", ex.getMessage(), ex);
        }

        try {
        uaClient.disconnect().get();
        Stack.releaseSharedResources();
        } catch (InterruptedException | ExecutionException e) {
        logger.error("Error disconnecting:", e.getMessage(), e);
        }

        try {
        Thread.sleep(1000);
        System.exit(0);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        });

        try {
        client.run(uaClient, future);
        future.get(15, TimeUnit.SECONDS);
        } catch (Throwable t) {
        logger.error("Error running client example: {}", t.getMessage(), t);
        future.completeExceptionally(t);
        }

        } catch (Throwable t) {
        logger.error("Error getting client: {}", t.getMessage(), t);

        future.completeExceptionally(t);

        try {
        Thread.sleep(1000);
        System.exit(0);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        }

        /*
        * try { Thread.sleep(999999999); } catch (InterruptedException e) {
        * e.printStackTrace(); }
        */
        }


        }






        share|improve this answer












        I got it working with the milo OPC Subscriber client.



        following is the changes I did in the classes.



        Client Interface



        public interface OpcuaClientInterface {

        public static final String USERNAME = "demo";
        public static final String PASSWORD = "demo";
        public static final String UaServerName = "SimulationServer";

        default String getEndpointUrl() {
        return "opc.tcp://localhost:4840";
        }

        default SecurityPolicy getSecurityPolicy() {
        return SecurityPolicy.None;
        }

        default String getUaServerName () {
        return UaServerName;
        }


        default IdentityProvider getIdentityProvider() {
        return new UsernameProvider(USERNAME,PASSWORD);
        }

        void run (OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception;


        }



        client runner class



        public class OpcuaClientRunner {

        static {
        CryptoRestrictions.remove();
        Security.addProvider(new BouncyCastleProvider());
        }
        private final AtomicLong requestHandle = new AtomicLong(1L);

        private final Logger logger = LoggerFactory.getLogger(getClass());
        private final CompletableFuture<OpcUaClient> future = new CompletableFuture<>();

        private final OpcuaClientInterface client;

        public OpcuaClientRunner(OpcuaClientInterface client) throws Exception {
        this.client = client;
        }

        private KeyStoreLoader createKeyStore() {
        KeyStoreLoader loader = null;
        try {
        File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
        if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
        throw new Exception("unable to create security dir: " + securityTempDir);
        }
        LoggerFactory.getLogger(getClass()).info("security temp dir: {}", securityTempDir.getAbsolutePath());
        loader = new KeyStoreLoader().load(securityTempDir);
        loader.load();
        } catch (Exception e) {
        logger.error("Could not load keys {}", e);
        return null;
        }
        return loader;
        }

        private CompletableFuture<ServerOnNetwork> findServersOnNetwork(String discoveryEndpointUrl)
        throws InterruptedException, ExecutionException {
        UaStackClient c = createDiscoveryClient(client.getEndpointUrl()).connect().get();
        RequestHeader header = new RequestHeader(NodeId.NULL_VALUE, DateTime.now(),
        uint(requestHandle.getAndIncrement()), uint(0), null, uint(60), null);

        FindServersOnNetworkRequest request = new FindServersOnNetworkRequest(header, null, null, null);

        return c.<FindServersOnNetworkResponse>sendRequest(request).thenCompose(result -> {
        StatusCode statusCode = result.getResponseHeader().getServiceResult();

        if (statusCode.isGood()) {
        return CompletableFuture.completedFuture(result.getServers());
        } else {
        CompletableFuture<ServerOnNetwork> f = new CompletableFuture<>();
        f.completeExceptionally(new UaException(statusCode));
        return f;
        }
        });
        }

        private UaTcpStackClient createDiscoveryClient(String endpointUrl) {
        KeyStoreLoader loader = createKeyStore();
        if (loader == null) {
        return null;
        }
        UaTcpStackClientConfig config = UaTcpStackClientConfig.builder()
        .setApplicationName(LocalizedText.english("Stack Example Client"))
        .setApplicationUri(String.format("urn:example-client:%s", UUID.randomUUID()))
        .setCertificate(loader.getClientCertificate()).setKeyPair(loader.getClientKeyPair())
        .setEndpointUrl(endpointUrl).build();

        return new UaTcpStackClient(config);
        }

        private OpcUaClient createUaClient() throws Exception {

        KeyStoreLoader loader = createKeyStore();
        if (loader == null) {
        return null;
        }

        SecurityPolicy securityPolicy = client.getSecurityPolicy();
        EndpointDescription endpoints = null;

        try {
        ServerOnNetwork servers = findServersOnNetwork(client.getEndpointUrl()).get();
        ServerOnNetwork server = Arrays.stream(servers)
        .filter(e -> e.getServerName().equals(client.getUaServerName())).findFirst()
        .orElseThrow(() -> new Exception("no desired UA Server returned."));
        endpoints = UaTcpStackClient.getEndpoints(server.getDiscoveryUrl()).get();
        } catch (Throwable ex) {
        ex.printStackTrace();
        }

        EndpointDescription endpoint = Arrays.stream(endpoints)
        .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri())).findFirst()
        .orElseThrow(() -> new Exception("no desired endpoints returned"));
        logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), securityPolicy);

        OpcUaClientConfig config = OpcUaClientConfig.builder()
        .setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
        .setApplicationUri("urn:eclipse:milo:examples:client").setCertificate(loader.getClientCertificate())
        .setKeyPair(loader.getClientKeyPair()).setEndpoint(endpoint)
        .setIdentityProvider(client.getIdentityProvider()).setRequestTimeout(uint(5000)).build();

        return new OpcUaClient(config);
        }

        public void run() {
        try {
        OpcUaClient uaClient = createUaClient();
        future.whenComplete((c, ex) -> {
        if (ex != null) {
        logger.error("Error running example: {}", ex.getMessage(), ex);
        }

        try {
        uaClient.disconnect().get();
        Stack.releaseSharedResources();
        } catch (InterruptedException | ExecutionException e) {
        logger.error("Error disconnecting:", e.getMessage(), e);
        }

        try {
        Thread.sleep(1000);
        System.exit(0);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        });

        try {
        client.run(uaClient, future);
        future.get(15, TimeUnit.SECONDS);
        } catch (Throwable t) {
        logger.error("Error running client example: {}", t.getMessage(), t);
        future.completeExceptionally(t);
        }

        } catch (Throwable t) {
        logger.error("Error getting client: {}", t.getMessage(), t);

        future.completeExceptionally(t);

        try {
        Thread.sleep(1000);
        System.exit(0);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        }

        /*
        * try { Thread.sleep(999999999); } catch (InterruptedException e) {
        * e.printStackTrace(); }
        */
        }


        }







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 26 '18 at 4:07









        Bob

        12




        12






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53440813%2fopc-client-for-milo-fails-to-connect-to-local-opc-discovery-service%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            What visual should I use to simply compare current year value vs last year in Power BI desktop

            How to ignore python UserWarning in pytest?

            Alexandru Averescu