# R701 🕰️ [![Rust](https://img.shields.io/badge/Rust-f74c00?logo=rust)](https://www.rust-lang.org) [![Claude Code](https://img.shields.io/badge/Claude%20Code-grey?logo=claude&logoColor=d97757)](https://claude.com/product/claude-code) [![GNU AGPLv3.0 License](https://img.shields.io/badge/License-GNU%20AGPLv3.0-dark_green?logo=gnu)](https://choosealicense.com/licenses/agpl-3.0) [![Buymeacoffee](https://img.shields.io/badge/Buymeacoffee-gray?logo=buymeacoffee)](https://buymeacoffee.com/nicolabelluti)
[![CI Badge](https://git.nicolabelluti.me/nicolabelluti/r701/actions/workflows/check-format-and-test.yaml/badge.svg)](https://git.nicolabelluti.me/nicolabelluti/r701/actions/?workflow=check-format-and-test.yaml)

> A reverse-engineered library to communicate with the > [R701](https://ipsattendant.it/rilevatore-presenze-r701/) by [I.P.S. > Informatica](https://ipsinformatica.info/), written in Rust If you want to read about this reverse engineering attempt, check out . ## Library Usage 1. Add the library to you project: ```shell cargo add r701 --git https://git.nicolabelluti.me/nicolabelluti/r701.git ``` 2. Use the library in you project: This library is async and built on [tokio](https://tokio.rs); add it to your own `[dependencies]` (e.g. `tokio = { version = "1", features = ["rt-multi-thread", "macros"] }`) to run the example below. ```rust use r701::R701; use tokio_stream::StreamExt; #[tokio::main] async fn main() { let r701 = R701::connect("127.0.0.1:5005").await.unwrap(); let mut record_stream = r701.into_record_iter().await.unwrap(); let mut id = 0; println!("No\tMchn\tEnNo\t\tName\t\tMode\tIOMd\tDateTime\t"); while let Some(record) = record_stream.next().await { let record = record.unwrap(); let name = match r701.get_name(record.employee_id).await.unwrap() { Some(Ok(name)) => name, Some(Err(error)) => String::from_utf8_lossy(error.as_bytes()).into_owned(), None => format!("user #{}", record.employee_id), }; println!( "{:0>6}\t{}\t{:0>9}\t{: <10}\t{}\t{}\t{}", id + 1, 1, record.employee_id, name, 35, record.clock as u8, record.datetime.format("%Y/%m/%d %H:%M:%S"), ); id += 1; } } ```