如何给MIFARE DESFire EV2写入员工信息与小额交易余额(工卡功能)
MIFARE DESFire EV2 员工卡写入方案:软件/编程双路径
最简软件操作方案(无需编程)
- 准备工具:PC/SC兼容NFC读写器(如ACR122U)、MIFARE DESFire EV2卡、DESFire专用管理工具(如官方MIFARE DESFire EV2 Toolkit类软件)
- 操作步骤:
- 安装读写器驱动,确保系统识别设备
- 打开管理工具,连接读写器并放置卡片
- 初始化新卡:设置全局应用密钥,创建两个独立应用——一个用于存储员工档案(二进制数据文件),一个用于小额余额(钱包文件)
- 写入员工档案:进入员工档案应用,创建二进制文件,将结构化员工信息(如自定义字节流、JSON转字节)写入
- 写入初始余额:进入余额应用,创建钱包文件,输入初始余额数值并确认写入
- 验证:读取两个应用的数据,确认信息与余额无误
编程实现分步教程(Python示例)
准备工作
安装pyscard库:
pip install pyscard
准备PC/SC兼容读写器
核心代码步骤
- 连接卡片
from smartcard.System import readers from smartcard.util import toHexString, toBytes # 获取第一个可用读写器 reader = readers()[0] conn = reader.createConnection() conn.connect() # 确认连接DESFire EV2卡 select_cmd = [0x90, 0x5A, 0x00, 0x00, 0x03, 0xD2, 0x76, 0x00, 0x00, 0x00] _, sw1, sw2 = conn.transmit(select_cmd) if sw1 == 0x90 and sw2 == 0x00: print("已成功连接DESFire EV2卡")
- 创建应用与文件
# 创建员工档案应用(应用ID:0x000001) create_emp_app = [0x90, 0xCA, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00] conn.transmit(create_emp_app) # 选择员工档案应用,创建二进制数据文件(文件ID:0x01) select_emp_app = [0x90, 0x5A, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00] conn.transmit(select_emp_app) create_emp_file = [0x90, 0xCD, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00] conn.transmit(create_emp_file) # 创建余额钱包应用(应用ID:0x000002) create_wallet_app = [0x90, 0xCA, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00] conn.transmit(create_wallet_app) # 选择余额应用,创建钱包文件(文件ID:0x01) select_wallet_app = [0x90, 0x5A, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00] conn.transmit(select_wallet_app) create_wallet_file = [0x90, 0xCD, 0x00, 0x00, 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] conn.transmit(create_wallet_file)
- 写入数据
# 写入员工信息(示例:员工ID=001,姓名=张三,转为自定义字节流) emp_info = toBytes("3030315F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F") write_emp_cmd = [0x90, 0xDB, 0x00, 0x01, len(emp_info)] + emp_info + [0x00] conn.transmit(write_emp_cmd) # 写入初始余额(示例:100元,4字节大端格式) balance = [0x00, 0x00, 0x00, 0x64] write_balance_cmd = [0x90, 0x3C, 0x00, 0x01, 0x04] + balance + [0x00] conn.transmit(write_balance_cmd)
- 验证读写结果
# 读取员工信息 read_emp_cmd = [0x90, 0xBD, 0x00, 0x01, 0x14, 0x00] emp_data, _, _ = conn.transmit(read_emp_cmd) print("读取到的员工信息:", toHexString(emp_data)) # 读取余额 read_balance_cmd = [0x90, 0x3B, 0x00, 0x01, 0x00] balance_data, _, _ = conn.transmit(read_balance_cmd) print("当前余额:", int.from_bytes(balance_data, byteorder='big'))
关键注意事项
- 实际使用需添加密钥验证逻辑,避免卡片被非法访问
- 员工信息建议采用TLV或自定义结构化格式,便于后续解析
- 钱包操作需遵循DESFire原子性规范,防止余额修改异常
内容的提问来源于stack exchange,提问作者Caerelum Igniculus
相关产品推荐
相关产品推荐

