ACR122U阅读器SELECT(by AID) APDU无法路由至Android设备问题
排查ACR122U阅读器与Android HCE交互故障的解决方案
从你的描述来看,同款同固件版本的ACR122U一台正常工作、一台无法向Android HCE设备发送SELECT APDU,甚至发送部分PN532指令会卡顿,下面是针对性的排查和解决思路:
一、先排查基础连接与驱动问题
- 更换USB端口和线材:优先使用USB 2.0端口,避免USB3.0的兼容性干扰;换一根质量可靠的USB线,接触不良或线材损坏经常会导致NFC设备通信异常。
- 重启设备:同时重启故障阅读器和Android测试设备,有时候阅读器固件临时挂起会导致指令无响应。
- 重装驱动:在Windows上彻底卸载ACR122U的驱动,然后安装官方最新版本的驱动,确保驱动文件没有损坏。
二、检查并重置阅读器配置
ACR122U的自定义配置可能引发兼容性问题,建议用官方工具或指令排查:
- 对比两台阅读器的配置:使用ACR122U Control Panel工具查看两台设备的参数,重点确认:
- ISO-DEP协议是否开启(HCE依赖该协议)
- 自动轮询模式的设置
- APDU传输超时参数
- 重置到出厂设置:执行以下指令重置阅读器,消除自定义配置的影响(执行后阅读器会重启,需重新连接):
execute(channel, new byte[] {(byte)0xFF, 0x00, 0x00, 0x00, 0x04, (byte)0xD4, 0x14, 0x01, 0x00}, card);
三、修正指令序列与格式
你的指令发送逻辑存在几个可能的问题:
- 优化指令时序:连续发送两次
InListPassiveTarget会干扰阅读器状态,建议调整序列为:- 先发送超时设置指令(可选):
FF0051C300 - 发送一次
InListPassiveTarget:FF00000004D44A0100,确认收到包含UID的响应后,再发送SELECT APDU
- 先发送超时设置指令(可选):
- 修正SELECT APDU格式:你当前的指令末尾多了一个
00,正确的SELECT APDU应该是:
多余的execute(channel, new byte[] {0x00, (byte)0xA4, 0x04, 0x00, 7, (byte)0xF0, 0x01, 0x02, 0x03, 0x04, (byte)0x05, 0x07}, card);00会导致HCE设备无法识别指令,自然不会触发processCommandApdu。 - 避免指令冲突:发送PN532芯片级指令前,先停止阅读器的轮询操作,否则会导致卡顿:
// 停止轮询 execute(channel, new byte[] {(byte)0xFF, 0x00, 0x00, 0x00, 0x02, (byte)0xD4, 0x02}, card); // 再发送芯片状态查询指令 execute(channel, new byte[] {(byte)0xFF, 0x00, 0x00, 0x00, 0x02, (byte)0xd4, 0x04}, card);
四、验证硬件故障
如果以上步骤都无效,大概率是硬件问题:
- 把故障阅读器拿到另一台Windows机器上测试,排除当前机器的系统/驱动问题。
- 用故障阅读器测试普通NFC标签(比如Mifare Classic卡),如果连普通标签都无法读取,说明硬件存在故障,需要联系售后。
- 对比两台阅读器的硬件序列号,确认是否是批次性的固件缺陷。
内容的提问来源于stack exchange,提问作者cliffroot
相关产品推荐
相关产品推荐

