nfc1 0.7.1

High-level safe Rust bindings for libnfc.
Documentation
use std::thread::sleep;
use std::time::Duration;

const MAX_FRAME_LEN: usize = 264;
const UNLOCK_1: [u8; 1] = [0x40];
const UNLOCK_2: [u8; 1] = [0x40];

fn main() -> nfc1::Result<()> {
	let mut context = nfc1::Context::new()?;
	let mut device = context.open()?;
	print!("NFC reader: {} opened\n\n", device.name());
	device.initiator_init()?;

	// Configure the CRC
	device.set_property_bool(nfc1::Property::HandleCrc, false)?;
	// Use raw send/receive methods
	device.set_property_bool(nfc1::Property::EasyFraming, false)?;
	// Disable 14443-4 autoswitching
	device.set_property_bool(nfc1::Property::AutoIso144434, false)?;

	loop {
		println!("Looking for targets...\n");
		match device.initiator_select_passive_target(&nfc1::Modulation{
			modulation_type: nfc1::ModulationType::Iso14443a,
			baud_rate: nfc1::BaudRate::Baud106,
		}) {
			Ok(target) => {
				print!("Target found: {}", target.to_string(false)?);
				match device.initiator_transceive_bits(&UNLOCK_1, 7, MAX_FRAME_LEN) {
					Ok(rx) => print!("Received bits: {:02X?}\n", rx),
					Err(err) => {
						print!("This is NOT a backdoored rewritable UID chinese card ({:?})\n", err);
						sleep(Duration::from_secs(5));
						print!("Looking for targets...\n");
						continue;
					},
				};

				match device.initiator_transceive_bytes(&UNLOCK_2, MAX_FRAME_LEN, nfc1::Timeout::Default){
					Ok(rx) => {
						print!("Received bytes: {:02X?}\n", rx);
						print!("This is a backdoored rewritable UID chinese card\n")
					},
					Err(err) => print!("This is NOT a backdoored rewritable UID chinese card ({:?})\n", err),
				};
			},
			Err(_) => { continue; }
		}
		sleep(Duration::from_secs(5));
	}
}