use opcua::{DarraOpcUa, BrowseCrawler, NodeClass, WellKnownNodes};
use tokio_util::sync::CancellationToken;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let ua = DarraOpcUa::new("opc.tcp://localhost:4840")?;
ua.connect()?;
let crawler = BrowseCrawler::new(&ua, 8, 50_000, NodeClass::Unspecified);
let result = crawler.crawl(
WellKnownNodes::OBJECTS_FOLDER,
|count, nid| print!("\r已抓 {} 个, 当前 {}", count, nid),
CancellationToken::new(),
).await?;
println!("\n共 {} 节点, 耗时 {:.1}s",
result.all_nodes.len(), result.elapsed.as_secs_f64());
let c2 = BrowseCrawler::new(&ua, 10, 100_000, NodeClass::Variable);
let r2 = c2.crawl("ns=2;s=Boilers", |_, _| {}, CancellationToken::new()).await?;
for n in &r2.all_nodes {
println!(" {} ({})", n.browse_name, n.node_id);
}
let cancel = CancellationToken::new();
let cancel_clone = cancel.clone();
tokio::spawn(async move {
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
cancel_clone.cancel();
});
let r3 = crawler.crawl("i=85", |_, _| {}, cancel).await?;
println!("取消时已抓 {} 个", r3.all_nodes.len());
Ok(())
}