Android应用程序与ACR122U在卡仿真中的交互

时间:2014-08-20 22:05:39

标签: android android-intent nfc apdu contactless-smartcard

我的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应用程序时不会得到此程序。我猜这可能是因为应用程序在前面打开了。但是当我的应用程序不在前面时,我如何与此响应进行交互?我目前的互动是:

  • getData D4 86
  • 响应= D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 01 00
  • setData D4 8E 61 73 64 61 73 64(只是一个随机字符串)
  • 响应= D5 8F 00 90 00
  • 使用send- / getData传输数据。

当应用程序未打开时,这不起作用。这是因为这个程序错了,或者我在Android中处理错误了吗?

欢迎任何有关问题的信息。

非常感谢!

问候。

1 个答案:

答案 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设备。