zkteco 1.0.0

A pure-Rust client for ZKTeco biometric attendance / access-control terminals (TCP/UDP protocol). A faithful port of the Python `pyzk` library.
Documentation
//! Print basic device information.
//!
//! Run with: `cargo run --example device_info -- 192.168.1.201 [port]`

use std::time::Duration;
use zkteco::Zk;

fn main() -> zkteco::ZkResult<()> {
    let (ip, port) = parse_args();

    let mut zk = Zk::builder(ip)
        .port(port)
        .timeout(Duration::from_secs(10))
        // Many devices live on networks that block ICMP; skip the ping probe.
        .omit_ping(true)
        .build();

    zk.connect()?;
    println!("connected: {zk}");

    println!("firmware:    {}", zk.get_firmware_version()?);
    println!("serial:      {}", zk.get_serialnumber()?);
    println!("platform:    {}", zk.get_platform()?);
    println!("device name: {}", zk.get_device_name()?);
    println!("mac:         {}", zk.get_mac().unwrap_or_default());
    println!("time:        {}", zk.get_time()?);

    let sizes = zk.read_sizes()?;
    println!("sizes:       {sizes:?}");

    zk.disconnect()?;
    Ok(())
}

/// Read `ip` (required) and optional `port` from the command line.
fn parse_args() -> (String, u16) {
    let mut args = std::env::args().skip(1);
    let ip = args.next().unwrap_or_else(|| {
        eprintln!("usage: device_info <ip> [port]");
        std::process::exit(2);
    });
    let port = args.next().and_then(|p| p.parse().ok()).unwrap_or(4370);
    (ip, port)
}