跳到主要内容

Darra OPC UA Client — Rust SDK

Darra OPC UA Client Rust 绑定. 跨语言对齐的高级 API, 你在这里学到的概念可以直接迁移到 C# / Java / Python / C++ / C.

章节导航

安装

cargo add darra-opcua

或在 Cargo.toml 添加:

[dependencies]
darra-opcua = "0.6"

系统要求

要求
Rust1.70+ (Edition 2021)
OSWindows 10/11, Linux (Ubuntu 20.04+)
平台x64
协议OPC UA TCP (opc.tcp://)

引入

use darra_opcua::{
Session, Subscription, Variant, DataValue,
AttributeId, NodeClass, MessageSecurityMode, StatusCode,
well_known_nodes,
};

主要类型:

类型用途
SessionClient 主类 (一个 OPC UA 会话)
Subscription数据订阅容器
EventSubscription事件订阅 (Alarms & Conditions)
NodeCollection / NodeLazy Load 节点访问
Variant / DataValue数据封装
Discovery (静态)get_endpoints / find_servers
well_known_nodes (mod)OPC Foundation 标准节点常量
OpcUaError携带 StatusCode 的错误
StatusCodenewtype + 关联常量 (is_good() / is_bad())

一分钟快速开始

use darra_opcua::{Session, Variant};

fn main() -> Result<(), Box<dyn std::error::Error>> {
darra_opcua::initialize()?;

let mut s = Session::new("opc.tcp://localhost:4840")?;
s.connect()?;

// 读
let dv = s.read("ns=2;s=Temperature")?;
println!("Temperature = {} °C", dv.variant().try_get_f64().unwrap_or(0.0));

// 写
let mut v = Variant::new();
v.set_f64(42.0);
s.write("ns=2;s=Setpoint", &v)?;

// 订阅
let sub = s.create_subscription(500.0)?;
sub.add_node("ns=2;s=Counter", |args| {
println!("{:?} = {:?}", args.node_id, args.value_string);
})?;

Ok(()) // s / sub Drop 时自动释放 native 资源
}

高级 API 概览

功能入口 API说明
连接 / 加密Session::new(...) + connect()None / Sign / SignAndEncrypt + Username / Anonymous / Certificate
单点读写s.read / write单节点单 Attribute
批量读s.read_many(nodes, attr)一次 RPC, N 节点
浏览树s.browse / browse_many / browse_with_paging / browse_next完整分页支持
路径解析s.resolve / translate_browse_paths浏览路径 → NodeId
注册节点s.register_nodes / unregister_nodes高频访问加速 30-50%
数据订阅s.create_subscription + sub.add_node / add_manypublishing / sampling 双层
事件订阅s.subscribe_events报警 & 条件
调方法s.call(obj_id, mtd_id, &[...])OPC UA Method 节点
历史读s.read_history / read_history_*Raw / Modified / AtTime / Processed / Events
历史写s.update_history / delete_history_rangeInsert / Replace / Update / Delete
心跳s.set_keep_alive_interval_ms(ms)后台周期探测
自动重连(内置)检测断线 → Republish 订阅
统一事件s.events.lock().unwrap().on_*会话 / 订阅 / 数据 / 通讯异常
服务发现Discovery::get_endpoints / find_servers不需要 Session

Result 错误处理

所有可能失败的 API 返回 Result<T, OpcUaError>, 用 ? 操作符传播:

fn quick(s: &Session) -> Result<f64, darra_opcua::OpcUaError> {
let dv = s.read("ns=2;s=Temperature")?; // 失败立即返回
Ok(dv.variant().try_get_f64().unwrap_or(0.0)) // None 兜底
}

OpcUaError 字段:

pub struct OpcUaError {
pub status: StatusCode, // 业务级状态码
pub message: String, // 简短文本描述
}

Drop 自动释放

Session / Subscription / Variant / DataValue 都实现 Drop — 离开作用域时自动调用底层 *_Close / *_Delete, 不需要手动释放:

{
let mut s = Session::new("opc.tcp://localhost:4840")?;
s.connect()?;
let dv = s.read("i=2258")?;
// ... 用 dv 干活 ...
} // <- 此处 dv / s Drop, 自动释放 native 内存 + Disconnect

跨语言对齐

Rust SDK 的 API 命名遵循 snake_case 惯例, 但语义与 C# DarraOpcUa 一致 (ua.Read ↔ Rust s.read). 选 C# / Rust 任一作为入门, 后续切其他语言时只需查 跨语言映射.

按左侧侧边栏顺序读完即可掌握全部 SDK API.