如何重新连接到IsoDep标签?

时间:2015-05-14 09:02:21

标签: android nfc

我试图从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;
    }
是的,有人可以帮帮我吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

connect及相关命令只是管理与标记的逻辑连接。即:它们授予您的线程和应用程序对标记对象的独占访问权限。他们不对物理标签连接做任何事情。 (至少据我所知,自从我上次阅读NfcService代码以来已经有一段时间了。)

因此,一旦标签停止响应您的请求,连接和重新连接将无法帮助您。在这种情况下,您所能做的就是物理移除标签并再次将其呈现给读者。

如果遇到超时问题,请尝试通过调用标记对象上的setTimeout来提高超时值。

答案 1 :(得分:1)

我知道这是一个旧线程。但是我碰巧遇到了同样的问题。恒定地,如果连接长时间闲置(例如大约1分钟),则它将关闭。即使重新触摸标签,电话也无法重新连接。我必须从设置中禁用并再次启用NFC才能恢复连接。

根据我在所有这些测试中得出的结论,我认为手机或操作系统导致NFC硬件进入故障状态。或者也许它处于睡眠模式以节省电量。因为发生这种情况时,其他电话仍可以连接到标签。但是您必须关闭/打开原始电话上的NFC才能重新建立连接。这可能是由硬件或驱动程序中的看门狗计时器引起的。

一种解决方法是每10秒钟左右ping NFC标签,例如检查标签状态,以维持连接。但是,这样一来,您就在消耗手机的电量。

我还在NfcAdapter中尝试ignore方法,以查看这是否是处理此问题的更优雅的方法。

标签:NFC连接断开超时