Android响应PN532 InListPassiveTarget

时间:2016-05-13 15:27:41

标签: android nfc hce contactless-smartcard nfc-p2p

我有一种奇怪的情况,我试图在标签模拟和标签阅读器模式之间切换我的PN532。读者可以使用约70毫秒,标签仿真运行约600毫秒。

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

我所拥有的解决方案在某种程度上有效,但我看到一种奇怪的情况,当我呼叫readPassiveTargetID来测试是否存在被动标签时,Android正在响应。这没关系,但我认为Android正在启动一项阻止它阅读模拟标签的服务。

在测试时,有时设备根本不与PN532通信,但是当他们最常使用读卡器模式时。以下是发生这种情况时得到的输出:

Nexus 5x(Android 6):

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

Galaxy 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. 我是否可以发送命令告诉设备停止收听或我可以发送的设置可以解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

这不是一种奇怪的情况,但是当您尝试从任何ISO / IEC 14443A阅读器访问NFC设备时会出现这种情况。 NFC设备通常支持

  • 读取器/写入器模式(即轮询无源标签),
  • 点对点模式(即轮询和侦听其他点对点模式目标),
  • (有时)卡仿真模式(即它监听其他读写器设备的激活)。

当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设备侦听其他设备激活(点对点或读写器模式)时,它将允许使用ISO / IEC 18092中定义的各种选项进行激活。由于这些子协议基于NFC -A和NFC-F,一种支持被动对等模式和卡仿真模式的NFC设备,通常会将收听和#34;相结合。两者都成为一个可激活的目标。

这正是您所看到的:支持ISO / IEC 14443A和ISO / IEC 18092被动模式的设备,速度为106kbps。这两种协议都使用ISO / IEC 14443A的防冲突和选择程序。为了简化发现,NFC设备将卡仿真模式和点对点模式结合到一个可见目标中(即一个&#34;卡&#34;具有一个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设备将在外部阅读器关闭其HF字段后等待大约4秒,然后重新开始轮询标签。这至少是我们使用libnfc-nci测量的Nexus设备。三星以广泛修改NFC堆栈实现而着称(通常会引入许多额外的错误(功能?)),因此在S4上可能略有不同。

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

你可能正在做你应该/可以做的事情。它是Android方面的故意超时(关闭后4秒)导致您体验的内容。

我可以发送一个命令告诉设备停止收听,还是我可以发送的设置可以修复此问题?

不幸的是,这通常并不那么容易。你可以做的一些事情:

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

  • 您可以将PN532处于卡仿真模式的时间增加到约5秒(某些值明显大于上述超时)。然后Android应该(非常)可靠地检测模拟标签,即使它在卡模拟模式下被激活/之前被动对等模式目标。不幸的是,在PN532能够检测无源标签之前的5秒等待时间对于PN532应该读取NFC标签/非接触式智能卡的用户体验而言通常是不可接受的。

  • 如果您的应用只需要能够与应用的活动位于前台时与PN532进行通信(例如,当用户手动打开应用之前他们尝试与PN532进行交互),您可以使用阅读器模式API禁用P2P模式(请参阅NfcAdapter.enableReaderMode()。这再次限制了您运行Android 4.4+的设备(尽管支持所有NFC芯片组)。我怀疑这比在Android端使用HCE有多大好处,因为当用户试图用他们的手机点击PN532端以便自动打开应用程序或安装应用程序时问题又回来了(通过AAR)。