我有一个奇怪的情况,我试图切换我的PN532之间的标签模拟和标签阅读器模式。读卡器运行约70ms,标签模拟运行约600ms。
我想发生的是,当我把我的android设备放在天线附近时,它会读取模拟标签。当我拿着一个NFC标签到PN532的时候,它应该会读到标签。
我的解决方案有点奏效,但我看到了一个奇怪的情况,当我调用readPassiveTargetID
来测试被动标签的存在时,android会做出响应。这很好,但我认为android正在启动一个服务,阻止它读取模拟的标签。
当测试出来,有时设备根本不与PN532通信,但当他们这样做时,最常见的是读卡器模式。这是发生这种情况时的输出:
Nexus 5x(安卓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很少读取标记。当我运行标签模拟时,两个设备都能完美地工作。
我在想我的工作可能会有一些问题。
我需要做一些特别的事情来切换模式吗?当我切换时,实际上我不会重置或重新初始化PN532。
有没有一个命令我可以发送,告诉设备停止监听或设置,我可以发送,将解决这个问题?
最佳答案
我的解决方案有点奏效,但我看到了一个奇怪的情况,当我调用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设备通常将两者的监听“阶段”组合为单个可激活目标。
这正是你所看到的:一种支持ISO/iec 14443a和ISO/iec 18092无源模式的设备,速率为106kbps。这两个协议都使用了ISO/IEC 14443A中的防碰撞和选择过程。为了简化发现,NFC设备将卡仿真模式和对等模式结合到一个可见目标(即一个“卡”和一个uid)中。
从激活期间收到的参数值(特别是sak/sel_res字节)可以清楚地看到这一点。nexus 5x的此字节0x60
,表示此目标支持设置了位5的iso/iec 14443-4(类型A)和设置了位6的106kbps的iso/iec 18092无源。
请注意,galaxy s4上的三星决定不在sak字节(0x20
)中宣布点对点模式支持,这可能是由于某些信用卡支付终端的问题。
这很好,但我认为android正在启动一个服务,阻止它读取模拟的标签。
实际上,这不是一个服务在转,而是安卓有意引入了一个超时。一旦android设备在点对点或卡模拟模式下被激活,android设备将在外部读卡器关闭其hf字段后等待大约4秒,然后重新开始轮询标签。这至少是我们对使用libnfc nci的nexus设备的测量。三星以广泛修改nfc堆栈实现而闻名(通常会引入很多额外的bug(特性?),因此这在s4上可能略有不同。
我需要做一些特别的事情来切换模式吗?当我切换时,实际上我不会重置或重新初始化PN532。
你可能在做你该做的事。这是android端的一个故意超时(字段关闭后4秒)导致的体验。
有没有一个命令我可以发送,告诉设备停止监听或设置,我可以发送,将解决这个问题?
不幸的是,这通常不是那么容易。你可以做一些事情:
你真的需要Android手机的读写模式吗?如果你能在android端通过主机卡模拟(hce)实现你所需要的所有功能,你就可以实现pn532端,使其只在读写器模式下运行。这将消除两种模式之间的切换,您将不再受到超时的影响。不幸的是,这将限制您使用支持android hce(android 4.4+和某些较新的nfc芯片组)的设备。此外,一些事情,如自动安装应用程序,如果丢失(通过android应用程序记录,aar)是不可能的,然后。但是,当阅读器与HCE服务通信时,您仍然可以启动应用程序的活动(请参见How can I send message from HostApduService to an activity?)。
您可以将pn532处于卡模拟模式的时间增加到~5秒(某些值明显大于上述超时)。然后android应该(相当)可靠地检测模拟标签,即使它以前是在卡模拟模式/作为被动对等模式目标被激活的。不幸的是,对于pn532应该读取nfc标签/非接触智能卡的情况,就用户体验而言,在pn532能够检测到被动标签之前的5秒等待时间通常是不可接受的。
如果您的应用程序只需要在其活动处于前台时(即当用户在尝试与PN532端交互之前手动打开该应用程序时)与PN532通信,则可以使用Reader Mode API禁用P2P模式(请参见NfcAdapter.enableReaderMode()
)。这再次限制您使用运行Android4.4+的设备(尽管所有NFC芯片组都支持)。我怀疑这会比在android端使用hce带来更多好处,因为当用户试图用手机点击pn532端,以便自动打开应用程序或安装应用程序(通过aar)时,问题又回来了。
关于android - Android响应PN532 InListPassiveTarget,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37213889/