You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ACR122U读写器开发NFC标签扫描存储代码遇pynfc失效求助

解决ACR122U扫描并保存NFC标签信息的方案

我之前用ACR122U配合nfcpy开发时也踩过不少坑,给你整理了一套亲测有效的方案,能实现扫描NFC标签并保存信息的功能:

先搞定环境依赖

很多时候代码跑不起来都是环境问题,先确保这些步骤做对:

  • Linux(Ubuntu/Debian):先安装系统依赖库
    sudo apt-get install libnfc-bin libnfc-dev
    
  • Windows:去ACR122U官方网站下载并安装对应的USB驱动
  • 重新安装nfcpy(避免旧版本冲突):
    pip uninstall -y nfcpy && pip install nfcpy
    

完整可运行代码

这段代码会检测标签靠近,读取标签UID和NDEF内容,自动保存到文本文件:

import nfc
import ndef
import time
from threading import Thread

def read_and_save_tag(tag):
    """读取标签信息并保存到文件"""
    try:
        # 获取标签唯一ID(UID)
        tag_uid = tag.hex
        print(f"检测到标签,UID: {tag_uid}")

        # 读取NDEF记录
        if not tag.ndef:
            print("该标签没有存储NDEF格式数据")
            save_content = f"标签UID: {tag_uid}\n备注: 无NDEF数据"
        else:
            records = list(tag.ndef.records)
            save_content = f"标签UID: {tag_uid}\n\nNDEF记录内容:\n"
            for idx, record in enumerate(records):
                save_content += f"--- 记录{idx+1} ---\n"
                save_content += f"类型: {record.type}\n"
                # 兼容非UTF-8编码的内容
                content = record.data.decode('utf-8', errors='replace')
                save_content += f"内容: {content}\n\n"

        # 用时间戳命名文件,避免覆盖旧数据
        filename = f"nfc_tag_info_{int(time.time())}.txt"
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(save_content)
        
        print(f"标签信息已保存到: {filename}")
    except Exception as e:
        print(f"处理标签时出错: {str(e)}")

def on_tag_connected(tag):
    """标签连接时的回调函数"""
    Thread(target=read_and_save_tag, args=(tag,)).start()
    return True  # 返回True保持连接,直到标签离开

if __name__ == "__main__":
    print("等待NFC标签靠近...")
    try:
        # 初始化ACR122U读写器,'usb'是默认前端
        with nfc.ContactlessFrontend('usb') as clf:
            # 等待标签连接,触发回调
            clf.connect(rdwr={'on-connect': on_tag_connected})
    except Exception as e:
        print(f"初始化读写器失败: {str(e)}")
        print("排查方向:")
        print("- 确认ACR122U已正确连接到电脑")
        print("- Linux用户请检查是否有USB设备访问权限(可尝试sudo运行脚本)")
        print("- 可使用`nfc-list`命令查看设备是否被识别")

关键注意事项

  1. Linux权限问题:普通用户可能无法访问USB设备,临时解决可以用sudo python your_script.py运行;永久解决可以把用户加入dialout组:
    sudo usermod -aG dialout $USER
    
    执行后重启或重新登录生效。
  2. 设备路径指定:如果usb无法识别设备,可以用nfc-list命令查看设备路径,比如usb:001:005,然后修改代码中的初始化部分:
    with nfc.ContactlessFrontend('usb:001:005') as clf:
    
  3. 非NDEF标签处理:如果你的标签是MIFARE Classic这类非NDEF格式的,需要额外处理扇区读取(涉及密钥验证),可以在评论区告诉我,我再补充相关代码。

内容的提问来源于stack exchange,提问作者Vacpox Gamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:38:47