我试图从Android手机向nfc标签发送一些apdu命令并获得答案。使用的技术类型是IsoDep。一切正常,但有时候,当发送命令之间的时间太长时,标签会切换到禁用状态,之后每次重新连接都会失败。
我的代码:
public byte[] transferCommand(byte[] command) throws Exception {
byte[] result = null;
if (iso == null) {
iso = IsoDep.get(tag);
iso.connect();
}
if (!iso.isConnected()) {
try {
iso.close();
iso.connect();
result = iso.transceive(command);
} catch (Exception ex) {
iso.close();
}
}
return result;
}
是的,有人可以帮帮我吗?非常感谢。
答案 0 :(得分:2)
connect
及相关命令只是管理与标记的逻辑连接。即:它们授予您的线程和应用程序对标记对象的独占访问权限。他们不对物理标签连接做任何事情。 (至少据我所知,自从我上次阅读NfcService代码以来已经有一段时间了。)
因此,一旦标签停止响应您的请求,连接和重新连接将无法帮助您。在这种情况下,您所能做的就是物理移除标签并再次将其呈现给读者。
如果遇到超时问题,请尝试通过调用标记对象上的setTimeout
来提高超时值。
答案 1 :(得分:1)
我知道这是一个旧线程。但是我碰巧遇到了同样的问题。恒定地,如果连接长时间闲置(例如大约1分钟),则它将关闭。即使重新触摸标签,电话也无法重新连接。我必须从设置中禁用并再次启用NFC才能恢复连接。
根据我在所有这些测试中得出的结论,我认为手机或操作系统导致NFC硬件进入故障状态。或者也许它处于睡眠模式以节省电量。因为发生这种情况时,其他电话仍可以连接到标签。但是您必须关闭/打开原始电话上的NFC才能重新建立连接。这可能是由硬件或驱动程序中的看门狗计时器引起的。
一种解决方法是每10秒钟左右ping NFC标签,例如检查标签状态,以维持连接。但是,这样一来,您就在消耗手机的电量。
我还在NfcAdapter中尝试ignore方法,以查看这是否是处理此问题的更优雅的方法。
标签:NFC连接断开超时