Crates.io | nfc1-sys |
lib.rs | nfc1-sys |
version | 0.3.9 |
source | src |
created_at | 2021-04-24 13:56:16.099107 |
updated_at | 2024-10-02 13:52:45.19961 |
description | Low-level Rust bindings for libnfc. For high-level safe bindings, see crate nfc1. |
homepage | |
repository | https://github.com/alexrsagen/rs-nfc1-sys |
max_upload_size | |
id | 388980 |
size | 1,293,912 |
This crate provides low-level bindings to libnfc
, generated by bindgen
.
In contrast to nfc-sys
, this crate additionally provides:
nfc/nfc.h
header, compile native code that depends on libnfc
or link to it in Rust code.libnfc
(with build tweaks for x86_64-pc-windows-msvc
), which means you don't have to separately install libnfc
to use this crate. The vendoring is optional and can be disabled by removing the vendored
feature.Feature | Default? | Description |
---|---|---|
vendored | Yes | Use vendored libnfc, instead of installed one on the platform. |
drivers | Yes | Add chip or driver specific symbols from vendored libnfc. |
logging | No | Enables logging when using the vendored libnfc. |
conffiles | No | Enables config files on vendored libnfc. |
envvars | No | Enables environment variables on vendored libnfc. |
Add nfc1-sys
as a dependency in your project's Cargo.toml
file:
[dependencies]
nfc1-sys = "0.3"
Import the nfc1_sys
crate in your project, then you can use all functions starting with nfc_
from libnfc
.
See the libnfc
wiki or libnfc
1.8.0 examples for information on how to use it. The API is the same, as this is just a binding.
Note that there is quite a lot of unsafe code here. This is because this is just a simple binding, not a safe wrapper.
extern crate nfc1_sys;
use std::ffi::CStr;
use std::mem::MaybeUninit;
use nfc1_sys::{nfc_context, nfc_device, nfc_version, nfc_init, nfc_open, nfc_device_get_name, nfc_close, nfc_exit};
fn main() {
let version = unsafe { CStr::from_ptr(nfc_version()) }.to_str().unwrap();
println!("libnfc v{}", version);
let context: *mut nfc_context = unsafe {
let mut ctx = MaybeUninit::uninit();
nfc_init(ctx.as_mut_ptr());
ctx.assume_init()
};
let device: *mut nfc_device = unsafe {
let pnd = nfc_open(context, std::ptr::null_mut());
if pnd.as_ref().is_none() {
nfc_exit(context);
panic!("Error opening NFC reader");
}
pnd
};
let device_name = unsafe { CStr::from_ptr(nfc_device_get_name(device)) }.to_str().unwrap();
println!("NFC reader: {} opened", device_name);
unsafe {
nfc_close(device);
nfc_exit(context);
}
}