Darra OPC UA Client — Rust SDK
Darra OPC UA Client Rust 绑定. 跨语言对齐的高级 API, 你在这里学到的概念可以直接迁移到 C# / Java / Python / C++ / C.
章节导航
- 入门 → Session 会话 (构造 / 连接 / read / write / KeepAlive)
- 浏览 → Nodes 节点 (browse / 路径解析 / register_nodes)
- 实时 → Subscription 订阅 (create_subscription / MonitoredItem / DataChange)
- 历史 → History 历史 (Raw / Modified / AtTime / Processed / Events / Update / Delete)
- 调用 → Method 方法 (call)
- 发现 → Discovery 发现 (get_endpoints / find_servers)
- 数据 → Data Types (Variant / DataValue / well_known_nodes)
- 安全 → Security (证书 / 加密)
安装
cargo add darra-opcua
或在 Cargo.toml 添加:
[dependencies]
darra-opcua = "0.6"
系统要求
| 项 | 要求 |
|---|---|
| Rust | 1.70+ (Edition 2021) |
| OS | Windows 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,
};
主要类型:
| 类型 | 用途 |
|---|---|
Session | Client 主类 (一个 OPC UA 会话) |
Subscription | 数据订阅容器 |
EventSubscription | 事件订阅 (Alarms & Conditions) |
NodeCollection / Node | Lazy Load 节点访问 |
Variant / DataValue | 数据封装 |
Discovery (静态) | get_endpoints / find_servers |
well_known_nodes (mod) | OPC Foundation 标准节点常量 |
OpcUaError | 携带 StatusCode 的错误 |
StatusCode | newtype + 关联常量 (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_many | publishing / 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_range | Insert / 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.