基于Python pyscard库采集ACS ACR122U NFC读卡器数据的详细操作步骤

embedded/2025/3/18 23:35:02/

步骤1:安装驱动

1. 下载驱动:

   - 访问ACS官网的驱动下载页面:[ACR122U驱动下载](https://www.acs.com.hk/en/drivers/6/acr122u-nfc-reader/)。

   - 选择适用于Windows的驱动(如 ACR122U Driver (Windows) V3.05.02.zip)。

2. 安装驱动:

   - 解压下载的压缩包,运行 Setup.exe。

   - 按照向导完成安装。

   - 插入ACR122U读卡器,Windows会自动识别并加载驱动。

3. 验证设备识别:

   - 打开 设备管理器,检查是否有 ACS ACR122U PICC Interface或类似设备,无感叹号即表示驱动正常。

步骤2:安装Python库

使用 pyscard 库(基于PC/SC标准):

pip install pyscard

步骤3:编写Python代码

# 基础代码(读取卡片UID)

from smartcard.System import readers

from smartcard.util import toHexString

# 获取所有读卡器列表

reader_list = readers()

if not reader_list:

    print("未检测到读卡器!请检查设备连接。")

    exit()

# 选择第一个读卡器(通常为ACR122U)

reader = reader_list[0]

print("已连接读卡器:", reader)

# 建立连接

connection = reader.createConnection()

try:

    connection.connect()

    print("读卡器连接成功!")

except Exception as e:

    print("连接失败:", e)

    exit()

# 定义获取UID的APDU指令(ACS ACR122U专用)

GET_UID_APDU = [0xFF, 0xCA, 0x00, 0x00, 0x00]

# 发送指令并获取响应

data, sw1, sw2 = connection.transmit(GET_UID_APDU)

# 检查响应状态码

if sw1 == 0x90 and sw2 == 0x00:

    print("卡片UID:", toHexString(data))

else:

    print("读取失败,状态码:", hex(sw1), hex(sw2))

 

步骤4:读取MIFARE Classic卡片数据

# 定义块号和密钥(默认密钥为6个0xFF)

BLOCK_NUMBER = 4

KEY = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

# 1. 发送认证指令

AUTH_APDU = [

    0xFF, 0x86, 0x00, 0x00,

    0x05, 0x01, 0x00, BLOCK_NUMBER, 0x60, 0x00

] + KEY

# 合并密钥到指令

auth_data, auth_sw1, auth_sw2 = connection.transmit(AUTH_APDU)

if auth_sw1 != 0x90:

    print("认证失败!请检查密钥或块号。")

    exit()

# 2. 读取块数据

READ_APDU = [0xFF, 0xB0, 0x00, BLOCK_NUMBER, 0x10]

data, sw1, sw2 = connection.transmit(READ_APDU)

if sw1 == 0x90:

    print(f"块 {BLOCK_NUMBER} 数据:", toHexString(data))

else:

    print("读取失败,状态码:", hex(sw1), hex(sw2))

步骤5:轮询检测卡片(持续监控)

import time

while True:

    try:

        # 重新连接读卡器(检测卡片状态变化)

        connection.reconnect()

        data, sw1, sw2 = connection.transmit(GET_UID_APDU)

        if sw1 == 0x90:

            print("检测到卡片,UID:", toHexString(data))

        else:

            print("未检测到卡片")

    except Exception as e:

        print("通信错误:", e)

    time.sleep(1) # 每秒检测一次

 

完整示例代码

# 保存为 `acr122u_read.py`

from smartcard.System import readers

from smartcard.util import toHexString

import time

def main():

    # 获取读卡器

    reader_list = readers()

    if not reader_list:

        print("未检测到读卡器!")

        return

    reader = reader_list[0]

    print("已连接读卡器:", reader)

    # 连接读卡器

    connection = reader.createConnection()

    try:

        connection.connect()

    except Exception as e:

        print("连接失败:", e)

        return

    # 持续轮询检测卡片

    GET_UID_APDU = [0xFF, 0xCA, 0x00, 0x00, 0x00]

    while True:

        try:

            connection.reconnect()

            data, sw1, sw2 = connection.transmit(GET_UID_APDU)

            if sw1 == 0x90 and sw2 == 0x00:

                print("检测到卡片,UID:", toHexString(data))

            else:

                print("等待卡片靠近...")

            time.sleep(1)

        except KeyboardInterrupt:

            print("已退出")

            break

        except Exception as e:

            print("错误:", e)

if __name__ == "__main__":

    main()

运行方法

1. 保存代码为 .py文件(如 nfc_reader.py)。

2. 打开命令行,运行:

   python nfc_reader.py

3. 将NFC卡片靠近读卡器,观察输出结果。

通过以上步骤,你可以在Windows系统下使用Python成功采集ACS ACR122U NFC读卡器的数据!


http://www.ppmy.cn/embedded/173707.html

相关文章

repo init 错误 Permission denied (publickey)

一、已经生成ssh-key并设置到gerrit上 二、已经设置.gitconfig (此步骤是公司要求,设置gerrit地址为一个别名之类的,有的公司不需要) 然后出现下面的错误,最后发现忘记设置git的用户名和邮箱 1. git config --globa…

【C++标准库类型】深入理解vector类型(1):从基础到实践

目录 一、vector 的本质与核心特性 二、使用方法 2.1. 定义和初始化 2.2. 插入和删除元素 2.3. 访问元素 2.4. 迭代器与算法应用 2.5. 容量和大小 三、性能优化关键点 四、实践应用 4.1. 动态数组 4.2. 存储自定义类型 4.3. 实现栈结构 4.4. 矩阵表示(…

卷积神经网络 - 一维卷积、二维卷积

卷积(Convolution),也叫褶积,是分析数学中一种重要的运算。在信号处理或图像处理中,经常使用一维或二维卷积,本博文我们来学习一维卷积和二维卷积。 理解一维卷积和二维卷积的核心在于把握维度对特征提取方式的影响。我们从数学定…

Bash语言的语法

Bash语言的魅力:探秘命令行的力量 引言 在现代计算机科学的领域中,编程语言和脚本语言的使用已经变得不可或缺。每一种语言都有其独特的魅力和用武之地。在众多编程语言中,Bash(Bourne Again SHell)作为一种强大的脚…

【解决】XCode不支持旧版本的iOS设备

办法: 手动添加设备支持文件(暂时解决方式) 如果您无法立即升级 Xcode,也可以通过下载设备支持文件来暂时解决问题。 检查当前设备的 iOS 版本: 连接设备到 Mac,打开 Xcode 查看提示的 iOS 版本。例如&…

将COCO格式的物体检测数据集划分训练集、验证集和测试集

目录 导入所需库 定义数据集路径 创建输出目录 读取JSON注释文件 随机打乱图像列表 计算划分大小 复制图像到相应文件夹 完整代码 导入所需库 我们需要以下Python库: os:处理文件路径。 json:读取和写入JSON文件。 numpy&#xff…

QT:文件读取

问题: 在文件读取,判断md5值时,遇到py文件读取转String后,再转byte,md5前后不一致问题。 解决方法: python文件读取要使用QTextStream,避免\t 、\r、\n的换行符跨平台问题(window…

MySQL 锁

MySQL中最常见的锁有全局锁、表锁、行锁。 全局锁 全局锁用于锁住当前库中的所有实例,也就是说会将所有的表都锁住。一般用于做数据库备份的时候就需要添加全局锁,数据库备份的时候是一个表一个表备份,如果没有加锁的话在备份的时候会有其他的…