Nodes 节点
s.nodes() 是 Lazy Load 节点访问器, 让你像操作本地对象一样访问远程节点; 同时
Session 上一组 browse_* 方法直接走 NodeId 字符串.
子页跳转
- 节点容器入口请参考 NodeCollection.
- 单节点包装请参考 Node.
- 单层浏览请参考 Browse.
- 续翻分页请参考 BrowseNext.
- 含 ContinuationPoint 的浏览请参考 BrowseWithPaging.
- 路径批量解析请参考 TranslateBrowsePaths.
- 高频访问加速请参考 RegisterNodes.
四种访问节点的方式
use darra_opcua::{NodeClass, well_known_nodes};
// 方式 1: NodeId 字符串直接访问 (最直白, 最省 RPC)
let dv = s.read("ns=2;s=Temperature")?;
// 方式 2: Lazy Load Node 包装 (像本地对象, 探索式)
let node = s.nodes().get("ns=2;s=Temperature");
let dv = node.value()?;
let time = s.nodes().server()
.child("ServerStatus").and_then(|n| n.child("CurrentTime"));
// 方式 3: 路径解析
if let Some(node) = s.resolve("/Objects/Server/ServerStatus/CurrentTime")? {
let dv = node.value()?;
}
// 方式 4: 标准节点常量
let dv = s.read(well_known_nodes::SERVER_SERVER_STATUS_CURRENT_TIME)?;
四种方式底层都走相同 RPC, 选你觉得最自然的就行.
选择指南
| 场景 | 推荐 |
|---|---|
| 已知精确 NodeId (生产代码) | 方式 1 字符串 |
| 标准 ns=0 节点 | 方式 4 + WellKnownNodes |
| 浏览树 / 一次性脚本 | 方式 2 Node 链 |
| 100+ 路径批量初始化 | translate_browse_paths |
| 长期运行高频访问 | register_nodes 加速 |
Node 是 Clone 的
Node 内部 Arc<SessionInner> + String node_id, 是轻量值对象, 任意 clone:
let temp = s.nodes().get("ns=2;s=Temperature");
let temp_copy = temp.clone(); // 廉价 clone
std::thread::spawn(move || {
let _ = temp_copy.value(); // 跨线程读
});