This crate provides low-level bindings to libnfc
, generated by bindgen
.
In contrast to nfc-sys
, this crate additionally provides:
- Metadata which allows dependent crates to find the
nfc/nfc.h
header, compile native code that depends onlibnfc
or link to it in Rust code. - Vendored submodule copy of
libnfc
(with build tweaks forx86_64-pc-windows-msvc
), which means you don't have to separately installlibnfc
to use this crate. The vendoring is optional and can be disabled by removing thevendored
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);
}
}