我的ACR122U处于卡片仿真模式,Android应用程序必须在检测到仿真标签时启动并发送消息,例如:“Hello”。
模拟标记并使用我的手机进行扫描时,它会通过使用android.nfc.action.TAG_DISCOVERED
意图过滤器捕获应用程序来成功打开应用程序。
我对这种情况有三个问题。
问题1
我读到TAG_DISCOVERED
具有最低优先级,您无法确定在标记发现后是否会选择您的应用程序。使用卡片模拟,是使用android.nfc.action.TAG_DISCOVERED
意图过滤器捕获意图的唯一方法,还是有其他(更好)的方式?
问题2
我认为这个问题与问题1有关。当我在PN532上使用tgSetData
命令时,我猜我只是将纯文本发送到Android设备。例如:FF 00 00 00 08 D4 8E 61 73 64 61 73 64
发送字符串“asdasd”。在卡模拟中是否也可以发送NDEF消息或类似的东西?我想如果可以回答问题1,因为你可以使用NDEF意图过滤器。
问题3
这个问题是关于应用程序选择部分。从第一个tgGetData
我收到字节00 a4 04 00 07 d2 76 00 00 85 01 00
。我读到这是应用程序选择。我还注意到,打开Android应用程序时不会得到此程序。我猜这可能是因为应用程序在前面打开了。但是当我的应用程序不在前面时,我如何与此响应进行交互?我目前的互动是:
D4 86
D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 01 00
D4 8E 61 73 64 61 73 64
(只是一个随机字符串)D5 8F 00 90 00
当应用程序未打开时,这不起作用。这是因为这个程序错了,或者我在Android中处理错误了吗?
欢迎任何有关问题的信息。
非常感谢!
问候。
答案 0 :(得分:1)
问题1
将TAG_DISCOVERED
与前台调度结合使用是完全正常的。在这种情况下,您的活动优先于其他应用,TAG_DISCOVERED
是一种简单的全能机制。
但是,您通常不使用TAG_DISCOVERED
作为清单中的意图过滤器。在这种情况下,TAG_DISCOVERED
充当后退,仅捕获任何其他应用的意图过滤器未处理的标记。 (实际上TAG_DISCOVERED
是为了向后兼容非常有限的第一代Android NFC API。)
在这种情况下,您可以将TECH_DISCOVERED
意图过滤器与NfcA
或/和IsoDep
的技术过滤器文件结合使用。 (ACR122U将在IOS / IEC 14443 A型(= IsoDep
)之上模拟ISO / IEC 14443-4卡(= NfcA
)。)
问题2
发送NDEF消息并不容易,但使用模拟标记作为NFC标记(包含NDEF消息)可以完成。 ACR122U模拟ISO / IEC 14443-4标签。因此,您需要在标签端实施NFC论坛类型4标签操作规范,以便将模拟标签用作包含NDEF消息的NFC论坛类型4标签。有关详细信息,请参阅NFC Forum's freely available specifications。您可能还需要查看ISO / IEC 7816-4,它定义了基于APDU的协议以及通过ISO-DEP传输协议使用的应用程序结构。
实施此类代码后,您当然可以使用NDEF_DISCOVERED
意图过滤器。
问题3
有关APDU和智能卡应用程序结构如何工作的信息,请参见ISO / IEC 7816-4。您从Android设备收到的命令
00 A4 04 00 07 D2 76 00 00 85 01 01 00
是NFC论坛类型4标签应用程序(版本1.1)的SELECT命令。 Android设备将自动使用该命令(通常还有一些其他命令,请参阅NFC论坛类型4标签操作规范),以检查标签是否包含NDEF消息。当您收到这样的命令时,您应该根据ISO / IEC 7816-4使用适当的状态代码进行回答(例如6A82
,这意味着找不到文件或应用程序。)
虽然通过ISO-DEP传输非标准(即非ISO / IEC 7816-4)帧(如您的情况下的纯ASCII文本),但我强烈建议遵守ISO / IEC 7816-4以便工作顺利使用Android设备。