Expand description
Rust wrapper for the open62541 library.
§Examples
§Client: Connect to server
Use AsyncClient
to asynchronously connect to an OPC UA server:
use open62541::AsyncClient;
let client = AsyncClient::new("opc.tcp://opcuademo.sterfive.com:26543")?;
This requires an async runtime such as tokio
.
§Client: Read node’s value attribute
Read a variable node’s value attribute with AsyncClient::read_value()
:
use open62541::ua;
let node_id = ua::NodeId::numeric(0, 2258); // Server/ServerStatus/CurrentTime
let value = client.read_value(&node_id).await?;
println!("Received value: {value:?}");
Use AsyncClient::read_attribute()
and related methods to read other attributes other than
the value.
§Client: Watch node for changes in value attribute
Subscribe to a node’s value by creating a subscription with
AsyncClient::create_subscription()
and adding monitored items to it with
AsyncSubscription::create_monitored_item()
:
// Create subscription that receives the updates.
let subscription = client.create_subscription().await?;
// Create monitored item to receive node updates.
let mut monitored_item = subscription.create_monitored_item(&node_id).await?;
while let Some(value) = monitored_item.next().await {
println!("Received value: {value:?}");
}
§Server: Run server
Create an OPC UA server with Server::new()
. When instantiating a server, you receive a
ServerRunner
along with the Server
. Use it to run the server until interrupted:
use open62541::Server;
let (server, runner) = Server::new();
// Define data nodes on `server`.
runner.run_until_interrupt()?;
By default, ServerRunner::run()
runs on the current thread. Use
thread::spawn()
to run it in a different thread.
§Server: Define object and managed variable nodes
Define nodes with Server::add_object_node()
and related methods:
use open62541::{ObjectNode, ua, VariableNode};
use open62541_sys::{
UA_NS0ID_BASEDATAVARIABLETYPE, UA_NS0ID_FOLDERTYPE, UA_NS0ID_OBJECTSFOLDER,
UA_NS0ID_ORGANIZES, UA_NS0ID_STRING,
};
let object_node_id = server.add_object_node(ObjectNode {
requested_new_node_id: None,
parent_node_id: ua::NodeId::ns0(UA_NS0ID_OBJECTSFOLDER),
reference_type_id: ua::NodeId::ns0(UA_NS0ID_ORGANIZES),
browse_name: ua::QualifiedName::new(1, "SomeFolder"),
type_definition: ua::NodeId::ns0(UA_NS0ID_FOLDERTYPE),
attributes: ua::ObjectAttributes::default(),
})?;
let variable_node_id = server.add_variable_node(VariableNode {
requested_new_node_id: None,
parent_node_id: object_node_id,
reference_type_id: ua::NodeId::ns0(UA_NS0ID_ORGANIZES),
browse_name: ua::QualifiedName::new(1, "SomeVariable"),
type_definition: ua::NodeId::ns0(UA_NS0ID_BASEDATAVARIABLETYPE),
attributes: ua::VariableAttributes::default()
.with_data_type(&ua::NodeId::ns0(UA_NS0ID_STRING)),
})?;
server.write_value(
&variable_node_id,
&ua::Variant::scalar(ua::String::new("Lorem Ipsum")?),
)?;
Nodes may also be added (and removed) while the server is running.
§Server: Define data source variable nodes (callback-driven)
Implement DataSource
for custom types to enable callback-driven read and write access
through OPC UA variables.
Use DataSourceReadContext
and DataSourceWriteContext
to set the value to return to the
client, or access the incoming value received from the client:
use open62541::{DataSource, DataSourceReadContext, DataSourceResult, DataSourceWriteContext};
struct SomeDataSource {
some_value: u32,
}
impl DataSource for SomeDataSource {
fn read(&mut self, ctx: &mut DataSourceReadContext) -> DataSourceResult {
let value = format!("This is #{value}", value = self.some_value);
ctx.set_variant(ua::Variant::scalar(ua::String::new(&value)?));
Ok(())
}
fn write(&mut self, ctx: &mut DataSourceWriteContext) -> DataSourceResult {
println!("Received value: {value:?}", value = ctx.value());
self.some_value += 1;
Ok(())
}
}
let variable_node = VariableNode {
requested_new_node_id: None,
parent_node_id: object_node_id,
reference_type_id: ua::NodeId::ns0(UA_NS0ID_ORGANIZES),
browse_name: ua::QualifiedName::new(1, "SomeVariable"),
type_definition: ua::NodeId::ns0(UA_NS0ID_BASEDATAVARIABLETYPE),
attributes: ua::VariableAttributes::default()
.with_data_type(&ua::NodeId::ns0(UA_NS0ID_STRING))
.with_access_level(
&ua::AccessLevelType::NONE
.with_current_read(true)
.with_current_write(true),
),
};
let variable_node_id = server.add_data_source_variable_node(
variable_node,
SomeDataSource { some_value: 0 },
)?;
Modules§
- ua
- Thin wrappers for
open62541_sys
types.
Structs§
- Async
Client - Connected OPC UA client (with asynchronous API).
- Async
Monitored Item - Monitored item (with asynchronous API).
- Async
Subscription - Subscription (with asynchronous API).
- Callback
Once - Type-erased one-shot callback.
- Callback
Stream - Type-erased stream sender.
- Client
- Connected OPC UA client.
- Client
Builder - Builder for
Client
. - Data
Source Read Context - Context when
DataSource
is being read from. - Data
Source Write Context - Context when
DataSource
is being written to. - Data
Value - Typed variant of
ua::DataValue
. - Default
Access Control - Default server access control.
- Default
Access Control With Login Callback - Default server access control with login callback.
- Method
Callback Context - Context when
MethodCallback
is being called. - Method
Node - Monitored
Item Builder - Monitored
Item Value - Value emitted from monitored item notification.
- Node
- Object
Node - Server
- OPC UA server.
- Server
Builder - Builder for
Server
. - Server
Runner - Subscription
Builder - Userdata
- Type-erased user data.
- Userdata
Sentinel - Sentinel for type-erased user data.
- Variable
Node
Enums§
- Data
Source Error - Error
- Error type used in this crate.
- Method
Callback Error - Scalar
Value - Scalar value.
- Value
Type - Variant
Value - Value of
ua::Variant
.
Constants§
- DEFAULT_
PORT_ NUMBER - IANA-assigned OPC UA port number.
Traits§
- Access
Control - Server access control.
- Attribute
- Node attribute.
- Attributes
- Server node attributes.
- Custom
Certificate Verification - Custom certificate verification.
- Data
Source - Data source with callbacks.
- Data
Type - Transparent wrapper for OPC UA data type.
- Data
Type Ext - Extended values.
- Filter
Operand - Filter operand.
- Method
Callback - Method callback.
- Monitored
Item Attribute - Attribute for
MonitoredItemBuilder::attribute()
. - Monitored
Item Kind - Sealed typestate used in
MonitoredItemBuilder
. - Monitoring
Filter - Monitoring filter.
- Service
Request - A generic service request.
- Service
Response - A generic service response.
Type Aliases§
- Browse
Result - Result type for browsing.
- Data
Source Result - Result from
DataSource
operations. - Method
Callback Result - Result from
MethodCallback
operations. - Result
- Result type used in this crate.