使用rust读取usb设备ACR122U的nfc卡片id

rust及其高效和安全著称,而且支持跨平台,所以就想使用这个rust开发一个桌面端程序,来读取nfc设备的nfc卡片的id信息,下面就做一个最简单的入门教程吧,也是我写的第三个rust应用。

当你电脑上安装好了rust环境之后,先创建一个简单的项目,然后安装依赖,然后写一个简单的代码,然后执行即可。

创建项目

使用rust的包管理创建一个项目:cargo new hello-word

创建之后的目录结构如下

.git:这是一个隐藏文件夹,用于git软件实现版本管理,学习rust期间一般用不着,不用管

src:这是存放代码的地方,以后我们写的rust代码就放在这个文件夹里面

.gitignore:这同样是git使用的,用于忽略哪些类型文件,不进行版本管理,一般同样不用管

注意:git并不是rust的一部分,而是一个所有语言通用的版本控制工具,比如知名的github,便是用的git进行版本管理

Cargo.toml :这个文件就很重要了,cargo作为rust的包管理程序,就是通过这个文件知道你这个项目中需要哪些依赖库的。

使用vs code 打开这个项目,然后看一下内容:

对于你想要用到的库,直接写在[dependencies]项的下面即可,后面我会再对其进行详细介绍

然后来到src这个存放rust代码的目录里面:

安装依赖并写代码

rust 复制代码
[dependencies]
pcsc = "2.8.1"

然后运行命令: cargo build

将main.rs代码改为下面的代码:

rust 复制代码
use pcsc::*;

fn main() -> Result<(), Error> {
    // 创建一个新的上下文
    let ctx = Context::establish(Scope::User)?;

    // 列出可用的读卡器
    let mut readers_buf = [0; 2048];
    let mut readers = ctx.list_readers(&mut readers_buf)?;

    // 打开第一个读卡器
    let reader = readers.next().ok_or(Error::NoReadersAvailable)?;
    println!("Card reader:");

    let card = ctx.connect(reader, ShareMode::Shared, Protocols::ANY)?;

    // 发送 APDU 命令,获取卡片 UID
    let apdu_command = [0xFF, 0xCA, 0x00, 0x00, 0x00];
    let mut apdu_response = [0; 256];
    let response_len = card.transmit(&apdu_command.to_vec(), &mut apdu_response)?;

    // 提取卡片 UID
    // let card_uid = &apdu_response[..response_len - 2];

    // 输出卡片 UID
    println!("Card UID: {:02X?}", response_len);

    Ok(())
}

此时,将ACR122U连上电脑,并放上nfc卡:

运行并编译

然后运行命令:cargo run

就可以看到UID已经打印出来了

然后运行编译命令:cargo build --release

就会编译为可执行文件:

然后运行这个exe也可以读取到卡片信息:

进阶:循环监听

使用循环和异常捕获,实现实时监听功能,代码如下:

rust 复制代码
use pcsc::*;

fn main() {
    println!("Starting...");
    loop {
        // thread::sleep(Duration::from_secs(1));
        // println!("Done!");
        match divide() {
            Ok(_) => (),
            Err(_) => (),
        }
    }
}

fn divide() -> Result<(), Error> {
    // 创建一个新的上下文
    let ctx = Context::establish(Scope::User)?;

    // 列出可用的读卡器
    let mut readers_buf = [0; 2048];
    let mut readers = ctx.list_readers(&mut readers_buf)?;

    // 打开第一个读卡器
    let reader = readers.next().ok_or(Error::NoReadersAvailable)?;
    // println!("Card reader:");

    let card = ctx.connect(reader, ShareMode::Shared, Protocols::ANY)?;

    // 发送 APDU 命令,获取卡片 UID
    let apdu_command = [0xFF, 0xCA, 0x00, 0x00, 0x00];
    let mut apdu_response = [0; 256];
    let response_len = card.transmit(&apdu_command.to_vec(), &mut apdu_response)?;

    // 提取卡片 UID
    // let card_uid = &apdu_response[..response_len - 2];

    // 输出卡片 UID
    println!("Card UID: {:02X?}", response_len);

    Ok(())
}
相关推荐
.select.10 分钟前
c++ 移动赋值/移动构造函数
开发语言·c++
希望永不加班16 分钟前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring
我是鶸20 分钟前
secml-malware python library 源码分析及实践
开发语言·python
散峰而望25 分钟前
【基础算法】从入门到实战:递归型枚举与回溯剪枝,暴力搜索的初级优化指南
数据结构·c++·后端·算法·机器学习·github·剪枝
setmoon21427 分钟前
C++代码规范化工具
开发语言·c++·算法
不想看见40427 分钟前
C++/Qt 代码规范指南
开发语言·qt
li星野44 分钟前
QT模拟题:QT项目实践与架构设计(120分钟)
开发语言·qt
大鹏说大话1 小时前
Java 锁膨胀机制深度解析:从偏向锁到重量级锁的进化之路
开发语言·c#
IT猿手1 小时前
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
开发语言·算法·matlab·无人机·动态路径规划·openclaw
IT猿手1 小时前
基于控制障碍函数(Control Barrier Function, CBF)的无人机编队三维动态避障路径规划,MATLAB代码
开发语言·matlab·无人机·动态路径规划·无人机编队