如何重新连接到 IsoDep 标签?

问题描述 投票:0回答:3

我正在尝试从 Android 手机发送一些 apdu 命令到 nfc 标签并获取答案。使用的技术类型是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;
    }

有人可以帮我吗?非常感谢。

android nfc
3个回答
4
投票

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

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

如果遇到超时问题,请尝试通过在标签对象上调用

setTimeout
来提高超时值。


1
投票

我知道这是一个旧线程。但我碰巧遇到了同样的问题。不断地,如果连接空闲很长时间,比如说1分钟左右,就会被关闭。即使重新触摸标签后,手机也无法重新连接。我必须从设置中禁用并再次启用 NFC 才能恢复连接。

从我在所有这些测试中所了解到的情况来看,我相信手机或操作系统导致 NFC 硬件进入故障状态。或者它可能处于睡眠模式以节省电量。因为当发生这种情况时,不同的手机仍然可以连接到标签。但您必须关闭/打开原手机上的 NFC 才能再次连接。这可能是由硬件或驱动程序中的看门狗定时器引起的。

一种解决方法是每隔 10 秒左右对 NFC 标签执行一次 ping 操作,例如检查标签状态,以保持连接。但这样一来,你就会耗尽手机的电量。

我还在尝试 NfcAdapter 中的忽略方法,看看它是否是处理此问题的更优雅的方法。

标签:NFC 连接断开超时


0
投票

虽然这是一个旧线程,但我在测试 NFC 读取器/HCE 场景时报告了类似的问题,但可能略有不同。我的问题不是连接问题,而是有时发现的标签不再显示 IsoDep 技术。

手机 1 = Pixel 3XL API 31,充当 NFC 读取器

手机 2 = Pixel 7 API 34,充当 HCE。

当电话 2 轻按电话 1 时,电话 1 发现标签(触发 OnTagDiscoved)。标签技术包含 NfcA 和 IsoDep,我能够继续在两部手机之间发送 APDU 命令。

现在,经过多次测试迭代,IsoDep 不再被检测到,并且发现的标签仅列出 NfcA。这就像电话 2 上的某些内容被禁用或关闭,导致 IsoDep 技术在电话 2 上不再可用。即使在两部电话重新启动/重启后,IsoDep 也不可用。

当我翻转电话角色(电话 1 用作 HCE,电话 2 用作 Reader)时,我没有遇到此问题(至少到目前为止没有)。

我将继续调查此问题,但有人知道什么可能会导致 IsoDep 技术突然停止被检测到吗?

阿克

© www.soinside.com 2019 - 2024. All rights reserved.