Android 响应 PN532 InListPassiveTarget

Android responds to PN532 InListPassiveTarget

我有一个奇怪的情况,我试图在标签模拟和标签 reader 模式之间切换我的 PN532。 reader 持续约 70 毫秒,标签仿真 运行 持续约 600 毫秒。

我想要发生的是,当我将 Android 设备放在天线附近时,它会读取模拟标签。当我将 NFC 标签贴在 PN532 上时,它应该会读取标签。

我的解决方案有点管用,但我看到一个奇怪的情况,当我调用 readPassiveTargetID 来测试是否存在被动标签时,Android 正在响应。这很好,但我认为 Android 正在启动一项服务,阻止它读取模拟标签。

测试时,有时设备根本不与 PN532 通信,但当它们通信时,最常见的是 reader 模式。这是发生这种情况时我得到的输出:

Nexus 5x(Android 6):

<< 4A 1 0
>> 4B 1 1 0 4 60 4 1 2 3 4 5 78 80 71 0

银河 S4 (Android 5.0.1):

<< 4A 1 0
>> 4B 1 1 0 4 20 4 8 87 F6 62 5 78 B3 70 2

5x 通常会在一秒左右后读取模拟标签,但当我在两种模式之间切换时,S4 很少读取标签。当我只是 运行 标签模拟时,两个设备都可以正常工作。

我认为我正在做的事情可能存在一些问题。

  1. 我需要做一些特殊的事情来切换模式吗?当我切换时,我实际上并没有重置或重新初始化 PN532。
  2. 是否有我可以发送的命令来告诉设备停止收听或我可以发送的设置来解决这个问题?

我的解决方案有点管用,但我看到一个奇怪的情况,当我调用 readPassiveTargetID (InListPassiveTarget) Android 时有响应。

这不是什么奇怪的情况,而是当您尝试从任何 ISO/IEC 14443A reader 访问 NFC 设备时可以预料到的情况。 NFC 设备通常支持

  • reader/writer 模式(即轮询被动标签),
  • 点对点模式(即轮询和侦听其他点对点模式目标),以及
  • (有时)卡模拟模式(即它监听其他 reader/writer 设备的激活)。

当 NFC 设备轮询标签时,这通常类似于 InListPassiveTarget 所做的,不同之处在于它通常会测试各种不同的标签技术(NFC-A = ISO/IEC 14443A,NFC-B = ISO/IEC 14443B,NFC-F = JIS X 6319-4,NFC-V = ISO/IEC 15693)。由于被动点对点模式基于 ISO/IEC 14443A 和 JIS X 6319-4,它还会通过 NFC-A 和 NFC-F 测试自动发现被动点对点目标。此外,它将测试其他点对点设备(ISO/IEC 18092 活动模式)。

当 NFC 设备侦听其他设备(点对点或 reader/writer 模式)的激活时,它将允许使用 ISO/IEC 18092 中定义的各种选项进行激活。由于这些子-协议基于 NFC-A 和 NFC-F,支持被动对等模式和卡模拟模式的 NFC 设备通常会将两者的侦听 "phases" 组合到一个可激活的目标中。

这正是您所看到的:支持 ISO/IEC 14443A 和 ISO/IEC 18092 106kbps 被动模式的设备。这两个协议都使用 ISO/IEC 14443A 中的防冲突和选择程序。为了简化发现,NFC 设备将卡模拟模式和点对点模式结合到一个单一的可见目标中(即一个 "card" 和一个 UID)。

从激活期间收到的参数值(特别是 SAK/SEL_RES 字节)可以清楚地看到这一点。对于 Nexus 5X,此字节为 0x60,表示此目标支持 ISO/IEC 14443-4(A 类),第 5 位已设置,ISO/IEC 18092 被动,106kbps,第 6 位已设置。

请注意,三星在其 Galaxy S4 上决定不在 SAK 字节 (0x20) 中宣布点对点模式支持,这可能是由于某些信用卡支付终端的问题。

这很好,但我认为 Android 正在启动一项服务,阻止它读取模拟标签。

这实际上不是服务启动,而是 Android 故意引入超时。一旦 Android 设备在点对点或卡仿真模式下被激活,Android 设备将在外部 reader 关闭其 HF 场后等待大约 4 秒,然后重新开始轮询标签。这至少是我们使用 libnfc-nci 对 Nexus 设备进行的测量。三星以广泛修改 NFC 堆栈实现而闻名(通常会引入很多额外的错误(功能?)),因此这在 S4 上可能会略有不同。

我需要做一些特殊的事情来切换模式吗?当我切换时,我实际上并没有重置或重新初始化 PN532。

您可能正在做您 should/could 所做的事情。这是 Android 一侧的故意超时(场关闭后 4 秒)导致您遇到的情况。

是否有我可以发送的命令来告诉设备停止收听或我可以发送的设置来解决这个问题?

不幸的是,这通常并不那么容易。您可以做的几件事:

  • 你真的需要 Android phone 上的 reader/writer 模式吗?如果您可以通过主机卡仿真 (HCE) 在 Android 端实现所需的所有功能,则可以将 PN532 端实现为仅在 reader/writer 模式下运行。这将消除两种模式之间的切换,您将不再受到超时的影响。不幸的是,这会限制您使用支持 Android HCE(Android 4.4+ 和某些较新的 NFC 芯片组)的设备。此外,如果缺少应用程序(通过 Android 应用程序记录,AAR)自动安装应用程序等一些事情是不可能的。不过,当 reader 与您的 HCE 服务通信时,您仍然可以启动应用的 activity(参见 )。

  • 您可以将 PN532 处于卡模拟模式的时间增加到 ~5 秒(某个值明显大于上述超时)。那么 Android 应该(相当)可靠地检测到模拟标签,即使它之前在卡模拟 mode/as 被动对等模式目标中被激活。不幸的是,对于 PN532 应读取 NFC tags/contactless-smartcards.

    [=58 的情况,就用户体验而言,在 PN532 能够检测到无源标签之前等待 5 秒通常是不可接受的=]
  • 如果您的应用程序只需要能够与 PN532 通信,而您的应用程序的 activity 在前台(即当用户 手动打开 应用 它们尝试与 PN532 端交互之前),您可以使用 reader-模式 API 禁用 P2P 模式(参见 NfcAdapter.enableReaderMode()。这再次限制您使用设备 运行 Android 4.4+(尽管所有 NFC 芯片组都支持)。我怀疑这比在 Android 上使用 HCE 有多大好处不过,由于当用户尝试使用他们的 phone 轻敲 PN532 端以自动打开应用程序或安装应用程序(通过 AAR)时,问题又出现了。