【问题标题】:NFC Card Reader ACR 122 incompatible with Android 4.1 Jelly Beans?NFC 读卡器 ACR 122 与 Android 4.1 Jelly Beans 不兼容?
【发布时间】:2012-07-27 08:08:45
【问题描述】:

我之前使用过 ACR 122,它与 Android

【问题讨论】:

  • 您使用什么软件/SDK(libnfc、ISMB、NFCTools...)对 ACR122 进行编程?
  • 你的 ACR 122 阅读器连接到 Android 了吗?
  • 我在这里使用这个 SNEP 库:code.google.com/p/ismb-snep-java 我已将其转换为 groovy 脚本并验证它在 4.0.3 下工作 - 阅读器已连接到 macbook,这里的目标是使用消息对阅读器进行编程,然后将其推送到 Android 设备。

标签: android nfc nfc-p2p


【解决方案1】:

从 Android 4.1 Jelly Bean 开始,NFC 点对点通信被配置为使用更高的比特率 (212 kbps),而之前它使用的是 106 kbps(在安装了 Google 电子钱包的 Android 设备中,它始终使用 212 kbps )。

不知道ACR122U能否通过javax.smartcardio支持更高码率。里面的NFC芯片(NXP的PN532)当然可以做到。 212 和 424 kbps 的低级 ISO18092/ECMA-340 协议不同于 106 kbps。对于 106 kbps,它使用与 ISO14443 相同的调制方式,而更高的比特率使用与 FeliCa 相同的调制方式(参见页面7 and 8 of the standard)。所以我怀疑这不能通过javax.smartcardio处理。

【讨论】:

    【解决方案2】:

    很高兴看到其他人致力于此。您可以通过“直接”连接到阅读器。感谢 Peter Kmet:javax.smartcardio transmit to NFC USB reader without card

    这个示例只会切换灯光

            TerminalFactory factory;
            List<CardTerminal> terminals;
            factory = TerminalFactory.getDefault();
            terminals = factory.terminals().list();
            terminal = terminals.get(0);
    
            byte[] response = null;
            byte[] command = new byte[] { (byte) 0xff, (byte) 0x00, (byte) 0x40, (byte) 0xd0, (byte) 0x04,
                (byte) 0x05, (byte) 0x05, (byte) 0x02, (byte) 0x01 };
            int controlCode = 0x310000 + 3500 * 4;
            Card card = null;
            card = terminal.connect("DIRECT");
            response = card.transmitControlCommand(controlCode, command);
    

    如果您在 Jelly Bean 方面取得任何进展,请更新,我也会检查您的代码。

    【讨论】:

      【解决方案3】:

      这有助于在没有卡的情况下连接到终端:

      terminal.connect("DIRECT");
      

      【讨论】:

        【解决方案4】:

        我用一个小“hack”解决了这个问题。我正在使用带有 SAM 模块的 ACR122U,不知道哪个版本有这个,它是 TouchATag 阅读器。我发现阅读器必须通过这条线,当手机不在 NFC 领域时也是如此:

        cardTerminal.connect("*").getBasicChannel();
        

        这是因为您必须在手机进入 nfc 字段之前将阅读器置于初始化模式,并且这只有在您可以发送 APDU 时才有效!

        如果有人找到了发送 APDU 的解决方案,而无需在 cardTerminal 上调用 connect()

        这个问题与更高的比特率无关,我设法获得了 424 kbps 的通信。

        您可以在 googel 代码中找到我用这些知识编写的 NFC API,我还将在那里提供一些文档:

        http://code.google.com/p/java-android-beam-api/

        欢迎评论!

        【讨论】:

        • 我们在这个问题上取得了很大的进展,现在使用的是 terminal.connect("DIRECT")。最好的消息是,在我们的第一次测试中,它也可以在 Linux 上运行!您可以在此处和我们的存储库中找到它的快照,我们目前正在寻找测试它的人。 Have a look here for the binary snapshot
        【解决方案5】:

        在 Java 语言中,您可以使用:

        1) nfctools: https://github.com/grundid/nfctools 。它适用于 Android 4.0、4.1、4.2、4.3、4.4。

        2)http://code.google.com/p/ismb-snep-java。它适用于 Android 4.0 和 Android 4.4(但不适用于 4.1、4.2、4.3)。为了在 4.4 中支持三星设备,需要对协议进行一些更改(可以从 nfctools 中获取,但最好使用 nfctools 来增加兼容性)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-10
          • 1970-01-01
          • 2012-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-13
          • 1970-01-01
          相关资源
          最近更新 更多