使用ACS ACR122U(PN532)切换Mifare Plus SE从SL1到SL3遇阻求助
我之前也碰到过几乎一模一样的问题——Mifare Plus SE在SL1模式下会完全模拟Mifare Classic的ATR,导致ACR122U的PN532模块直接走Classic的激活流程,跳过了ISO14443-4的初始化步骤。下面是我亲测有效的解决思路和操作步骤:
核心逻辑
Mifare Plus SE哪怕在SL1模式下,底层依然支持ISO14443-4协议,只是ACR122U的默认自动识别逻辑把它误判成了Mifare Classic。我们需要强制PN532模块以纯ISO14443-A Type A的方式初始化卡片,触发ATS(Answer To Select)和PPS(Protocol Parameter Selection)流程,从而激活ISO14443-4通信链路。
具体操作步骤
1. 先释放当前卡片连接
先发送inRelease命令确保卡片处于未激活状态,避免之前的连接残留影响后续操作:
// Smartcardio发送inRelease命令示例 byte[] releaseCmd = new byte[]{(byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x05, (byte)0xD4, (byte)0x06}; card.transmitControlCommand(IOCTL_SMARTCARD_ACR122_ESCAPE, releaseCmd);
2. 强制用ISO14443-A模式扫描卡片
不要用inAutoPoll或默认参数的InListPassiveTarget,而是发送指定参数的InListPassiveTarget命令,明确告诉PN532只扫描ISO14443-A类型的卡片,禁止自动识别Mifare Classic:
// InListPassiveTarget命令:指定ISO14443-A(0x00),关闭Mifare自动检测 byte[] listTargetCmd = new byte[]{(byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x08, (byte)0xD4, (byte)0x4A, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00}; byte[] response = card.transmitControlCommand(IOCTL_SMARTCARD_ACR122_ESCAPE, listTargetCmd);
这个命令会触发卡片返回ATS(而非Mifare Classic的UID),此时PN532会自动切换到ISO14443-4通信模式。
3. 验证ISO14443-4激活状态
发送inATR命令获取卡片的ATR,此时应该能得到包含ISO14443-4标识(通常是0x80)的ATR,而非Mifare Classic的简单UID:
byte[] atrCmd = new byte[]{(byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x03, (byte)0xD4, (byte)0x00}; byte[] atrResponse = card.transmitControlCommand(IOCTL_SMARTCARD_ACR122_ESCAPE, atrCmd);
如果返回的ATR符合ISO14443-4格式,说明激活成功。
4. 执行SL3切换密钥认证
现在就可以正常发送Mifare Plus的认证命令,用SL3切换密钥完成模式切换了:
// 示例:发送Mifare Plus SL3切换认证命令(请根据你的实际密钥调整参数) byte[] authCmd = new byte[]{(byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x10, (byte)0xD4, (byte)0x40, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00}; byte[] authResponse = card.transmitControlCommand(IOCTL_SMARTCARD_ACR122_ESCAPE, authCmd);
为什么之前的尝试没效果?
inAutoPoll:PN532的自动扫描逻辑会把SL1模式的Mifare Plus SE识别为Mifare Classic(类型10),直接走Classic的激活流程,完全跳过ISO14443-4初始化。- 默认参数的
InListPassiveTarget:默认允许PN532自动检测Mifare类型,同样会误判成Classic,不走ISO14443-4流程。 inATR:在Classic模式下,卡片不会响应ISO14443-4的ATR请求,自然会超时。
额外注意事项
- 确保你的ACR122U固件是最新版本,旧固件对Mifare Plus的兼容性较差。
- 切换密钥必须是卡片出厂预设的SL3切换密钥,或者你之前自定义设置的密钥,否则认证会失败。
内容的提问来源于stack exchange,提问作者rudikiaz




