Search in sources :

Example 1 with OpcUaClientConfigBuilder

use of org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder in project milo by eclipse.

the class OpcUaClient method create.

/**
 * Create and configure an {@link OpcUaClient} by selecting an {@link EndpointDescription} from a list of endpoints
 * retrieved via the GetEndpoints service from the server at {@code endpointUrl} and building an
 * {@link OpcUaClientConfig} using that endpoint.
 *
 * @param endpointUrl    the endpoint URL of the server to connect to and retrieve endpoints from.
 * @param selectEndpoint a function that selects the {@link EndpointDescription} to connect to from the list of
 *                       endpoints from the server.
 * @param buildConfig    a function that configures an {@link OpcUaClientConfigBuilder} and then builds and returns
 *                       an {@link OpcUaClientConfig}.
 * @return a configured {@link OpcUaClient}.
 * @throws UaException if the endpoints could not be retrieved or the client could not be created.
 */
public static OpcUaClient create(String endpointUrl, Function<List<EndpointDescription>, Optional<EndpointDescription>> selectEndpoint, Function<OpcUaClientConfigBuilder, OpcUaClientConfig> buildConfig) throws UaException {
    try {
        List<EndpointDescription> endpoints = DiscoveryClient.getEndpoints(endpointUrl).get();
        EndpointDescription endpoint = selectEndpoint.apply(endpoints).orElseThrow(() -> new UaException(StatusCodes.Bad_ConfigurationError, "no endpoint selected"));
        OpcUaClientConfigBuilder builder = OpcUaClientConfig.builder().setEndpoint(endpoint);
        return create(buildConfig.apply(builder));
    } catch (InterruptedException | ExecutionException e) {
        if (!endpointUrl.endsWith("/discovery")) {
            StringBuilder discoveryUrl = new StringBuilder(endpointUrl);
            if (!endpointUrl.endsWith("/")) {
                discoveryUrl.append("/");
            }
            discoveryUrl.append("discovery");
            return create(discoveryUrl.toString(), selectEndpoint, buildConfig);
        } else {
            throw UaException.extract(e).orElseGet(() -> new UaException(e));
        }
    }
}
Also used : OpcUaClientConfigBuilder(org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder) UaException(org.eclipse.milo.opcua.stack.core.UaException) EndpointDescription(org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription) ExecutionException(java.util.concurrent.ExecutionException)

Example 2 with OpcUaClientConfigBuilder

use of org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder in project OpenMUC by isc-konstanz.

the class OpcConnection method connect.

@Connect
public void connect() throws ConnectionException {
    try {
        Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security");
        Files.createDirectories(securityTempDir);
        if (!Files.exists(securityTempDir)) {
            throw new ConnectionException("Unable to create security dir: " + securityTempDir);
        }
        logger.debug("Security temp dir: {}", securityTempDir.toAbsolutePath());
        KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
        if (!address.contains("opc.tcp://")) {
            host = address.split(":")[0];
            port = Integer.parseInt(address.split(":")[1]);
            address = "opc.tcp://" + address;
        } else {
            host = address.split("//|:")[1];
            port = Integer.parseInt(address.split("//|:")[2]);
        }
        List<EndpointDescription> endpoints = DiscoveryClient.getEndpoints(address).get();
        EndpointDescription endpoint = endpoints.stream().filter(e -> true).findFirst().orElseThrow(() -> new UaException(StatusCodes.Bad_ConfigurationError, "No endpoint selected"));
        logger.info("OPC Client connecting to {}.", address);
        endpoint = EndpointUtil.updateUrl(endpoints.get(0), host, port);
        OpcUaClientConfigBuilder clientBuilder = new OpcUaClientConfigBuilder().setEndpoint(endpoint).setApplicationName(LocalizedText.english("OpenMUC OPC UA Client")).setApplicationUri("urn:openmuc:client").setCertificate(loader.getClientCertificate()).setKeyPair(loader.getClientKeyPair()).setIdentityProvider(new AnonymousProvider()).setRequestTimeout(uint(5000));
        client = OpcUaClient.create(clientBuilder.build());
        client.connect().get();
        // Get a typed reference to the Server object: ServerNode
        ServerTypeNode serverNode = client.getAddressSpace().getObjectNode(Identifiers.Server, ServerTypeNode.class).get();
        if (namespaceUri != null && !namespaceUri.isEmpty()) {
            try {
                namespaceIndex = Integer.parseInt(namespaceUri);
            } catch (NumberFormatException e) {
                namespaceIndex = Arrays.asList(serverNode.getNamespaceArray().get()).indexOf(namespaceUri);
            }
        }
    } catch (Exception e) {
        logger.error("OPC connection to server failed {}", e);
    }
}
Also used : Path(java.nio.file.Path) OpcUaClientConfigBuilder(org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder) ServerTypeNode(org.eclipse.milo.opcua.sdk.client.model.nodes.objects.ServerTypeNode) UaException(org.eclipse.milo.opcua.stack.core.UaException) AnonymousProvider(org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider) EndpointDescription(org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription) ConnectionException(org.openmuc.framework.driver.spi.ConnectionException) ConnectionException(org.openmuc.framework.driver.spi.ConnectionException) ExecutionException(java.util.concurrent.ExecutionException) UaException(org.eclipse.milo.opcua.stack.core.UaException) Connect(org.openmuc.framework.driver.annotation.Connect)

Aggregations

ExecutionException (java.util.concurrent.ExecutionException)2 OpcUaClientConfigBuilder (org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder)2 UaException (org.eclipse.milo.opcua.stack.core.UaException)2 EndpointDescription (org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription)2 Path (java.nio.file.Path)1 AnonymousProvider (org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider)1 ServerTypeNode (org.eclipse.milo.opcua.sdk.client.model.nodes.objects.ServerTypeNode)1 Connect (org.openmuc.framework.driver.annotation.Connect)1 ConnectionException (org.openmuc.framework.driver.spi.ConnectionException)1