[[milo-client-component]]
= OPC UA Client Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-milo/src/main/docs/milo-client-component.adoc
:docTitle: OPC UA Client
:artifactId: camel-milo
:description: Connect to OPC UA servers using the binary protocol for acquiring telemetry data.
:since: 2.19
:supportLevel: Stable
:component-header: Both producer and consumer are supported

*Since Camel {since}*

*{component-header}*

The Milo Client component provides access to OPC UA servers using the
http://eclipse.org/milo[Eclipse Milo™] implementation.

*Java 9+*: This component requires Java 9+ at runtime.

Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-milo</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------



// component options: START
The OPC UA Client component supports 24 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *clientId* (common) | A virtual client id to force the creation of a new connection instance |  | String
| *configuration* (common) | All default options for client configurations |  | MiloClientConfiguration
| *discoveryEndpointSuffix* (common) | A suffix for endpoint URI when discovering |  | String
| *discoveryEndpointUri* (common) | An alternative discovery URI |  | String
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *allowedSecurityPolicies* (client) | A set of allowed security policy URIs. Default is to accept all and use the highest. |  | String
| *applicationName* (client) | The application name | Apache Camel adapter for Eclipse Milo | String
| *applicationUri* (client) | The application URI | http://camel.apache.org/EclipseMilo/Client | String
| *channelLifetime* (client) | Channel lifetime in milliseconds |  | Long
| *keyAlias* (client) | The name of the key in the keystore file |  | String
| *keyPassword* (client) | The key password |  | String
| *keyStorePassword* (client) | The keystore password |  | String
| *keyStoreType* (client) | The key store type |  | String
| *keyStoreUrl* (client) | The URL where the key should be loaded from |  | String
| *maxPendingPublishRequests* (client) | The maximum number of pending publish requests |  | Long
| *maxResponseMessageSize* (client) | The maximum number of bytes a response message may have |  | Long
| *overrideHost* (client) | Override the server reported endpoint host with the host from the endpoint URI. | false | boolean
| *productUri* (client) | The product URI | http://camel.apache.org/EclipseMilo | String
| *requestedPublishingInterval* (client) | The requested publishing interval in milliseconds | 1_000.0 | Double
| *requestTimeout* (client) | Request timeout in milliseconds |  | Long
| *sessionName* (client) | Session name |  | String
| *sessionTimeout* (client) | Session timeout in milliseconds |  | Long
|===
// component options: END



== URI format

The URI syntax of the endpoint is: 

[source]
------------------------
milo-client:opc.tcp://[user:password@]host:port/path/to/service?node=RAW(nsu=urn:foo:bar;s=item-1)
------------------------

If the server does not use a path, then it is possible to simply omit it:

------------------------
milo-client:opc.tcp://[user:password@]host:port?node=RAW(nsu=urn:foo:bar;s=item-1)
------------------------

If no user credentials are provided the client will switch to anonymous mode.

== URI options

All configuration options in the group +client+ are applicable to the shared client instance. Endpoints
will share client instances for each endpoint URI. So the first time a request for that endpoint URI is
made, the options of the +client+ group are applied. All further instances will be ignored.

If you need alternate options for the same endpoint URI it is possible though to set the +clientId+ option
which will by added internally to the endpoint URI in order to select a different shared connection instance.
In other words, shared connections located by the combination of endpoint URI and client id.












// endpoint options: START
The OPC UA Client endpoint is configured using URI syntax:

----
milo-client:endpointUri
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *endpointUri* | *Required* The OPC UA server endpoint |  | String
|===


=== Query Parameters (30 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *clientId* (common) | A virtual client id to force the creation of a new connection instance |  | String
| *defaultAwaitWrites* (common) | Default await setting for writes | false | boolean
| *discoveryEndpointSuffix* (common) | A suffix for endpoint URI when discovering |  | String
| *discoveryEndpointUri* (common) | An alternative discovery URI |  | String
| *method* (common) | The method definition (see Method ID) |  | String
| *node* (common) | The node definition (see Node ID) |  | String
| *samplingInterval* (common) | The sampling interval in milliseconds | 0.0 | Double
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *allowedSecurityPolicies* (client) | A set of allowed security policy URIs. Default is to accept all and use the highest. |  | String
| *applicationName* (client) | The application name | Apache Camel adapter for Eclipse Milo | String
| *applicationUri* (client) | The application URI | http://camel.apache.org/EclipseMilo/Client | String
| *channelLifetime* (client) | Channel lifetime in milliseconds |  | Long
| *keyAlias* (client) | The name of the key in the keystore file |  | String
| *keyPassword* (client) | The key password |  | String
| *keyStorePassword* (client) | The keystore password |  | String
| *keyStoreType* (client) | The key store type |  | String
| *keyStoreUrl* (client) | The URL where the key should be loaded from |  | String
| *maxPendingPublishRequests* (client) | The maximum number of pending publish requests |  | Long
| *maxResponseMessageSize* (client) | The maximum number of bytes a response message may have |  | Long
| *overrideHost* (client) | Override the server reported endpoint host with the host from the endpoint URI. | false | boolean
| *productUri* (client) | The product URI | http://camel.apache.org/EclipseMilo | String
| *requestedPublishingInterval* (client) | The requested publishing interval in milliseconds | 1_000.0 | Double
| *requestTimeout* (client) | Request timeout in milliseconds |  | Long
| *sessionName* (client) | Session name |  | String
| *sessionTimeout* (client) | Session timeout in milliseconds |  | Long
|===
// endpoint options: END





=== Discovery

If the server uses a dedicated discovery endpoint (e.g. `/discovery`), which may support different (less secure) security policies,
then you can make use of this via the parameter `discoveryEndpointSuffix`, which will be appended to the `endpointUri`. Or by using
an explicit `discoveryEndpointUri`.

=== Overriding the host name

The client uses the host information from the endpoint information, queried from the server. However in some situations this endpoint URI
might be different, and wrong from the point of view of the connecting client (e.g. an internal hostname).

In this case it is possible to set the parameter `overrideHost` to `true`, which will take the discovered endpoint information,
but override the host information with the value of the original URI.

=== Node ID


In order to define a target node a namespace and node id is required. In previous versions this was possible by
specifying `nodeId` and either `namespaceUri` or `namespaceIndex`. However this only allowed for using
string based node IDs. And while this configuration is still possible, the newer one is preferred.

The new approach is to specify a full namespace+node ID in the format `ns=1;i=1` which also allows to use the other
node ID formats (like numeric, GUID/UUID or opaque). If the `node` parameter is used the older ones must not be used.
The syntax of this node format is a set of `key=value` pairs delimited by a semi-colon (`;`). 

Exactly one namespace and one node id key must be used. See the following table for possible keys:

[width="100%",cols="2,2,5",options="header"]
|===
| Key | Type | Description
| *ns*  | namespace | Numeric namespace index
| *nsu* | namespace | Namespace URI
| *s*   | node | String node ID
| *i*   | node | Numeric node ID
| *g*   | node | GUID/UUID node ID
| *b*   | node | Base64 encoded string for opaque node ID
|===

As the values generated by the syntax cannot be transparently encoded into a URI parameter value, it is necessary to escape them.
However Camel allows to wrap the actual value inside `RAW(…)`, which makes escaping unnecessary. For example:

------------------------
milo-client:opc.tcp://user:password@localhost:12345?node=RAW(nsu=http://foo.bar;s=foo/bar)
------------------------

=== Method ID

It is possible to perform methods calls on OPC UA nodes. If the parameter `method` is set to the Node ID of a method call (the node ID must be set to the parent object in this case),
then a method call will be performed instead of a write operation.

Input parameters are taken from the body:

* If the body is null, then an empty `Variant[]` will be used
* If the body is a `Variant[]`, then it will be used as is
* If the body is a `Variant`, then it will be wrapped in a `Variant[]` array
* Otherwise the body will be converted into a `Variant` and wrapped in an array of `Variant[]`

=== Security policies

When setting the allowing security policies is it possible to use the well known OPC UA URIs (e.g. `\http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15`)
or to use the Milo enum literals (e.g. `None`). Specifying an unknown security policy URI or enum is an error.

The known security policy URIs and enum literals are can be seen here: https://github.com/eclipse/milo/blob/master/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/security/SecurityPolicy.java[SecurityPolicy.java] 

**Note:** In any case security policies are considered case sensitive.


include::camel-spring-boot::page$milo-starter.adoc[]
