OPC UA Client
Since Camel 2.19
Both producer and consumer are supported
The Milo Client component provides access to OPC UA servers using the 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:
<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>
The OPC UA Client component supports 25 options, which are listed below.
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 |
autowiredEnabled (advanced) |
Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc. |
true |
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 |
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 |
|
miloClientConnectionManager (client) |
Autowired Instance for managing client connections |
MiloClientConnectionManager |
|
overrideHost (client) |
Override the server reported endpoint host with the host from the endpoint URI. |
false |
boolean |
productUri (client) |
The product URI |
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 |
URI format
The URI syntax of the endpoint is:
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.
The OPC UA Client endpoint is configured using URI syntax:
milo-client:endpointUri
with the following path and query parameters:
Path Parameters (1 parameters):
Name | Description | Default | Type |
---|---|---|---|
endpointUri |
Required The OPC UA server endpoint |
String |
Query Parameters (32 parameters):
Name | Description | Default | Type |
---|---|---|---|
clientId (common) |
A virtual client id to force the creation of a new connection instance |
String |
|
dataChangeFilterDeadbandType (common) |
Deadband type for MonitorFilterType DataChangeFilter. |
0 |
UInteger |
dataChangeFilterDeadbandValue (common) |
Deadband value for MonitorFilterType DataChangeFilter. |
0.0 |
Double |
dataChangeFilterTrigger (common) |
Daata change trigger for data change monitor filter type. There are 3 enums and the value can be one of: Status, StatusValue, StatusValueTimestamp |
DataChangeTrigger |
|
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 |
|
monitorFilterType (common) |
Monitor Filter Type for MonitoredItems. There are 1 enums and the value can be one of: dataChangeFilter |
MonitorFilterType |
|
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. There are 3 enums and 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 |
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 |
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 |
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 |
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:
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 aVariant[]
array -
Otherwise the body will be converted into a
Variant
and wrapped in an array ofVariant[]
Read Values from Nodes
The component provide a producer to read values from multiple opc-ua nodes. The Node-IDs will be defined in the header CamelMiloNodeIds
as list of strings. (see Node-ID for the ID format).
Example:
from("direct:start")
.setHeader("CamelMiloNodeIds", constant(Arrays.asList("nsu=urn:org:apache:camel;s=myitem1")))
.setHeader("await", constant(true)) // await: parameter "defaultAwaitWrites"
.enrich("milo-client:opc.tcp://localhost:4334", new AggregationStrategy() {
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
return newExchange;
}
}).to("mock:test1");
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: SecurityPolicy.java
Note: In any case security policies are considered case sensitive.
Spring Boot Auto-Configuration
When using milo with Spring Boot make sure to use the following Maven dependency to have support for auto configuration:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-milo-starter</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
The component supports 47 options, which are listed below.
Name | Description | Default | Type |
---|---|---|---|
camel.component.milo-client.allowed-security-policies |
A set of allowed security policy URIs. Default is to accept all and use the highest. |
String |
|
camel.component.milo-client.application-name |
The application name |
Apache Camel adapter for Eclipse Milo |
String |
camel.component.milo-client.application-uri |
The application URI |
String |
|
camel.component.milo-client.autowired-enabled |
Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc. |
true |
Boolean |
camel.component.milo-client.bridge-error-handler |
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 |
camel.component.milo-client.channel-lifetime |
Channel lifetime in milliseconds |
Long |
|
camel.component.milo-client.client-id |
A virtual client id to force the creation of a new connection instance |
String |
|
camel.component.milo-client.configuration |
All default options for client configurations. The option is a org.apache.camel.component.milo.client.MiloClientConfiguration type. |
MiloClientConfiguration |
|
camel.component.milo-client.discovery-endpoint-suffix |
A suffix for endpoint URI when discovering |
String |
|
camel.component.milo-client.discovery-endpoint-uri |
An alternative discovery URI |
String |
|
camel.component.milo-client.enabled |
Whether to enable auto configuration of the milo-client component. This is enabled by default. |
Boolean |
|
camel.component.milo-client.key-alias |
The name of the key in the keystore file |
String |
|
camel.component.milo-client.key-password |
The key password |
String |
|
camel.component.milo-client.key-store-password |
The keystore password |
String |
|
camel.component.milo-client.key-store-type |
The key store type |
String |
|
camel.component.milo-client.key-store-url |
The URL where the key should be loaded from |
String |
|
camel.component.milo-client.lazy-start-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 |
camel.component.milo-client.max-pending-publish-requests |
The maximum number of pending publish requests |
Long |
|
camel.component.milo-client.max-response-message-size |
The maximum number of bytes a response message may have |
Long |
|
camel.component.milo-client.milo-client-connection-manager |
Instance for managing client connections. The option is a org.apache.camel.component.milo.client.MiloClientConnectionManager type. |
MiloClientConnectionManager |
|
camel.component.milo-client.override-host |
Override the server reported endpoint host with the host from the endpoint URI. |
false |
Boolean |
camel.component.milo-client.product-uri |
The product URI |
String |
|
camel.component.milo-client.request-timeout |
Request timeout in milliseconds |
Long |
|
camel.component.milo-client.requested-publishing-interval |
The requested publishing interval in milliseconds |
Double |
|
camel.component.milo-client.session-name |
Session name |
String |
|
camel.component.milo-client.session-timeout |
Session timeout in milliseconds |
Long |
|
camel.component.milo-server.application-name |
The application name |
String |
|
camel.component.milo-server.application-uri |
The application URI |
String |
|
camel.component.milo-server.autowired-enabled |
Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc. |
true |
Boolean |
camel.component.milo-server.bind-addresses |
Set the addresses of the local addresses the server should bind to |
String |
|
camel.component.milo-server.bridge-error-handler |
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 |
camel.component.milo-server.build-info |
Server build info. The option is a org.eclipse.milo.opcua.stack.core.types.structured.BuildInfo type. |
BuildInfo |
|
camel.component.milo-server.certificate |
Server certificate. The option is a java.security.cert.X509Certificate type. |
X509Certificate |
|
camel.component.milo-server.certificate-manager |
Server certificate manager. The option is a org.eclipse.milo.opcua.stack.core.security.CertificateManager type. |
CertificateManager |
|
camel.component.milo-server.certificate-validator |
Validator for client certificates. The option is a org.eclipse.milo.opcua.stack.core.security.CertificateValidator type. |
CertificateValidator |
|
camel.component.milo-server.default-certificate-validator |
Validator for client certificates using default file based approach |
String |
|
camel.component.milo-server.enable-anonymous-authentication |
Enable anonymous authentication, disabled by default |
false |
Boolean |
camel.component.milo-server.enabled |
Whether to enable auto configuration of the milo-server component. This is enabled by default. |
Boolean |
|
camel.component.milo-server.lazy-start-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 |
camel.component.milo-server.namespace-uri |
The URI of the namespace, defaults to urn:org:apache:camel |
urn:org:apache:camel |
String |
camel.component.milo-server.path |
The path to be appended to the end of the endpoint url. (doesn’t need to start with '/') |
String |
|
camel.component.milo-server.port |
The TCP port the server binds to |
Integer |
|
camel.component.milo-server.product-uri |
The product URI |
String |
|
camel.component.milo-server.security-policies |
Security policies |
Set |
|
camel.component.milo-server.security-policies-by-id |
Security policies by URI or name. Multiple policies can be separated by comma. |
String |
|
camel.component.milo-server.user-authentication-credentials |
Set user password combinations in the form of user1:pwd1,user2:pwd2 Usernames and passwords will be URL decoded |
String |
|
camel.component.milo-server.username-security-policy-uri |
Set the UserTokenPolicy used when |
SecurityPolicy |