#nfc #bindings #low-level #safe-bindings #libnfc #high-level #nfc1

sys nfc1-sys

libnfc 的低级 Rust 绑定。对于高级安全绑定,请参阅 crate nfc1。

10 个版本

0.3.5 2023 年 5 月 23 日
0.3.4 2023 年 3 月 11 日
0.3.1 2023 年 1 月 13 日
0.3.0 2022 年 12 月 7 日
0.1.4 2021 年 4 月 27 日

1275硬件支持

Download history 44/week @ 2024-03-11 4/week @ 2024-03-25 52/week @ 2024-04-01 13/week @ 2024-04-08 8/week @ 2024-04-29 15/week @ 2024-05-06 4/week @ 2024-05-13 46/week @ 2024-05-20 23/week @ 2024-05-27 33/week @ 2024-06-03 12/week @ 2024-06-10 42/week @ 2024-06-17 15/week @ 2024-06-24

103 每月下载量
4 个 crate 中使用(通过 nfc1

MIT 许可证

1MB
20K SLoC

C 19K SLoC // 0.2% comments Automake 430 SLoC // 0.0% comments Rust 373 SLoC // 0.0% comments M4 340 SLoC // 0.1% comments Shell 207 SLoC // 0.3% comments Batch 95 SLoC Bitbake 33 SLoC

包含 (模糊的 autoconf 代码, 7KB) vendor/nfc/configure.ac, (模糊的 autoconf 代码, 3KB) vendor/usb-compat-0.1/configure.ac

nfc1-sys

Crates.io

此 crate 为 libnfc 提供 low-level 绑定,由 bindgen 生成。

nfc-sys 相比,此 crate 还提供

  • 元数据,允许依赖的 crate 找到 nfc/nfc.h 头文件,编译依赖于 libnfc 的本地代码或将其链接到 Rust 代码中。
  • 带有针对 x86_64-pc-windows-msvc 的构建调整的 libnfc 的供应商子模块副本(这意味着您不需要单独安装 libnfc 就可以使用此 crate。供应商是可选的,可以通过删除 vendored 功能来禁用它。

功能

功能 默认? 描述
vendored 使用供应商 libnfc,而不是平台上的已安装版本。
drivers 添加来自供应商 libnfc 的芯片或驱动程序特定符号。
logging 启用使用供应商 libnfc 时的日志记录。
conffiles 启用供应商 libnfc 上的配置文件。
envvars 启用供应商 libnfc 上的环境变量。

用法

nfc1-sys 添加到项目 Cargo.toml 文件中的依赖项

[dependencies]
nfc1-sys = "0.3"

在项目中导入 nfc1_sys crate,然后您可以使用来自 libnfc 的所有以 nfc_ 开头的函数。

请参阅libnfc 维基libnfc 1.8.0 示例,了解如何使用它。由于这是一个绑定,API 是相同的。

使用示例

请注意,这里有很多不安全的代码。这是因为这只是一个简单的绑定,而不是安全的包装。

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);
	}
}

依赖关系

~0–2.3MB
~46K SLoC