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

news2024/12/24 5:59:03

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代码的目录里面:

安装依赖并写代码

[dependencies]
pcsc = "2.8.1"

然后运行命令:  cargo build

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

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也可以读取到卡片信息:

进阶:循环监听

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1343747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android笔记(二十二):Paging3分页加载库结合Compose的实现网络单一数据源访问

Paging3 组件是谷歌公司推出的分页加载库。个人认为Paging3库是非常强大&#xff0c;但是学习难点比较大的一个库。Paging3组件可用于加载和显示来自本地存储或网络中更大的数据集中的数据页面。此方法可让移动应用更高效地利用网络带宽和系统资源。在具体实现上&#xff0c;Pa…

详解Keras3.0 Layer API: Dropout layer

Dropout layer 图1 标准的神经网络 图2 加了Dropout临时删除部分神经元 Dropout层的作用是在神经网络中引入正则化&#xff0c;以防止过拟合。它通过随机丢弃一部分神经元&#xff08;如图2&#xff09;的输出来减少模型对训练数据的依赖性。这样可以提高模型的泛化能力&#x…

激活Windows过程及报错解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上, 运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本

激活Windows过程及报错问题解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上&#xff0c;运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本。 前言 最近在激活Windows过程中&#xff0c;遇到了报错: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上…

iS-RPM2023.2.0.0新版本发布

引言 经过不断努力和精心打磨,我们带着全新版本的RPM产品与大家见面啦!本次更新将为广大流程分析师和质量管理员们提供更深入、更准确的洞察力,以帮助大家在数据驱动的决策中取得更卓越的成果。然而,让海量数据转化为可用的见解并不是一项容易的任务。我们理解数据分析师们…

工业4G 物联网网关——机房动环监控系统应用方案介绍

机房动环监控系统是什么&#xff1f;机房动环监控系统的全称为机房动力环境监控系统&#xff0c;是一套安装在机房内的监控系统&#xff0c;可以对分散在机房各处的独立动力设备、环境和安防进行实时监测&#xff0c;统计和分析处理相关数据&#xff0c;第一时间侦测到故障发生…

万界星空科技车间生产管理系统解决方案

车间管理系统解决方案:   &#xff08;一&#xff09;车间生产计划管理解决方案   车间管理系统解决方案对于一般的生产计划&#xff0c;需完成编制、审批、下达、执行、完工等操作&#xff0c;车间管理系统解决方案立足于减少中间环节浪费&#xff0c;节约成本&#xff0c…

小米电脑管家 - 手机平板电脑家居互联

系列文章目录 前言 联想电脑安装小米电脑管家实现设备互联 如图&#xff0c;将 小米平板 5 Pro 作为联想笔记本 GeekPro 5000 &#xff08;这垃圾电脑&#xff09;的副屏。 可以在小米平板控制笔记本&#xff0c;如图所示 一、官方使用手册 参考&#xff1a;小米电脑管家帮助 …

WebGL以及wasm的介绍以及简单应用

简介 下面主要介绍了WebGL和wasm,是除了html,css,js以外Web标准所支持的另外两个大件 前者实现复杂的图形处理,后者提供高效的代码迁移以及代码执行效率 WebGL 简介 首先,浏览器里的游戏是怎么做到这种交互又显示不同的画面的? 试想用我们的前端三件套实现一下.好像可以…

clickhouse连接工具dbeaver

地址 地址&#xff1a; Download | DBeaver Community 安装 表引擎 表引擎之TinyLog 以列文件的形式保存在磁盘上&#xff0c;不支持索引&#xff0c;没有并发控制。一般保存少量数据的小表&#xff0c; 生产环境上作用有限&#xff0c;多用于平时练习测试用。 内存引擎&am…

【C++】Ubuntu编译filezilla client

在新版Ubuntu 22.04.3 LTS上编译filezilla client成功&#xff0c;shell命令如下&#xff1a; sudo apt-get install libfilezilla-dev libwxbase3.0-dev gnutls-dev libdbus-1-dev sudo apt-get install libwxgtk3.0-gtk3-dev sudo apt-get install libgtk-3-dev sudo apt-ge…

VSCode Python开发环境配置

目录 1 插件安装2 Debug和测试配置常见问题 1 插件安装 1.1 基础编译插件&#xff0c;Python、Pylance 1.2 修改语言服务器类型&#xff0c;进入用户配置页面搜索Python: Language Server&#xff0c;选择Pylance&#xff08;一定要修改可以提供很多语法提示&#xff09; 1…

初识智慧城市

文章目录 智慧家居 智慧社区 智慧交通 智慧医疗 智慧教育 智慧旅游 智慧农业 智慧安防 智慧家居 利用智能语音、智能交互等技术,实现用户对家居系统各设备的远程操控和能控制如开关窗帘(窗户)、操控家用电器和照明系统、打扫卫生等操作。利用计算机视觉等技术,对被照看…

3d光学轮廓仪测微光学器件应用及其重要意义

微光学器件是光学器件的重要分支&#xff0c;为光学通信、光传感、光计算等领域的发展提供重要支撑。微光学器件具有尺寸小、功耗低、低成本等优势&#xff0c;可以于电子器件集成&#xff0c;实现更高效的数据传输和信号处理。未来&#xff0c;随着微纳加工技术的进一步发展&a…

交换两个数字的三种方法-LeetCode做题总结 344

344. 反转字符串 题解Java知识点交换两个数字的三种方法1、temp2、异或3、 题解 class Solution {public void reverseString(char[] s) {char temp;for(int i0,js.length-1; i<j; i,j--) {temp s[i];s[i] s[j];s[j] temp;}} }Java知识点 交换两个数字的三种方法 1、t…

shell打印粉色小心心、颜文字心心

#!/bin/bash # *********************************************************# # # # * Author : 白嫖一茶 # # * QQ邮箱址 : 2534824121qq.com # #…

【算法与数据结构】435、LeetCode无重叠区间

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;思路和【算法与数据结构】452、LeetCode用最少数量的箭引爆气球类似&#xff0c;也是排序找重叠区间。…

前端算法之双指针

双指针 分类 快慢指针&#xff08;同向&#xff09;对向、背向指针 例子&#xff1a;最接近的三数之和例子&#xff1a;通过删除字母匹配到字典里最长单词 双指针 双指针是一种编程技术&#xff0c;通常用于解决数组或链表的问题。 双指针法使用两个指针&#xff08;通常称为…

【Shell编程练习】监控内存和磁盘容量,小于给定值时报警

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 系列文章目录分析代码实现运行结果 分析 对于磁盘容量&#xff0c;可以使用df命令查看指定指定分区的磁盘使用情况。比如 然后我们需要从这段输出中提取我们想要的信息。在这里就是Available字段的值。…

Vue3-31-路由-RouterView的name属性的作用

作用描述 <router-view> 标签是用来渲染路由对应的组件的位置&#xff1b; 默认情况下&#xff0c;一个路由是只对应一个组件的。 但是&#xff0c;可以通过给 <router-view> 指定 name 属性的方式&#xff0c;实现同时渲染多个组件的效果。 这也叫做 命名视图。 注…

【网络安全 | Misc】Training-Stegano-1

该题考察winhex工具使用 打开文件&#xff1a; 使用StegSolve并不能获取有效信息 使用winhex得到flag steganoI