Skip to main content

alarm_event_logging/
alarm_event_logging.rs

1use dvrip_rs::{Alarm, Authentication, Connection, DVRIPCam};
2use std::time::Duration;
3
4#[tokio::main]
5async fn main() -> Result<(), Box<dyn std::error::Error>> {
6    let args: Vec<String> = std::env::args().collect();
7    if args.len() < 4 {
8        println!("Usage: {} <IP> <Username> <Password>", args[0]);
9        return Ok(());
10    }
11
12    let ip = &args[1];
13    let user = &args[2];
14    let pass = &args[3];
15
16    let mut cam = DVRIPCam::new(ip);
17
18    println!("Connecting and logging in...");
19    cam.connect(Duration::from_secs(5)).await?;
20
21    if !cam.login(user, pass).await? {
22        println!("Login failed");
23        return Ok(());
24    }
25
26    println!("Starting alarm monitoring...");
27
28    let callback = Box::new(|data: serde_json::Value, count| {
29        let now = chrono::Local::now();
30        println!("\n[{}] EVENT #{}", now.format("%H:%M:%S"), count);
31
32        if let Some(obj) = data.as_object() {
33            for (key, value) in obj {
34                println!("  {}: {}", key, value);
35            }
36        } else {
37            println!("  Raw Data: {}", data);
38        }
39    });
40
41    cam.set_alarm_callback(Some(callback));
42    cam.start_alarm_monitoring().await?;
43
44    println!("Monitoring for 2 minutes. Press Ctrl+C to stop early.");
45    tokio::time::sleep(Duration::from_secs(120)).await;
46
47    println!("Stopping monitoring...");
48    cam.stop_alarm_monitoring().await?;
49    cam.close().await?;
50
51    Ok(())
52}