2

当我在 ACR122U 上模拟卡时,我的 Galaxy 5 有奇怪的行为。我认为问题发生在我运行 Android 更新时。当应用程序不在前台时,我的意图过滤器不再捕获标签,因为模拟标签被视为 aJIS 6319-4而不是ISO/IEC 14443-4标签。

当应用程序不在前台或在前台并运行时,我得到序列foregroundDispatch

TgInitAsTarget
>  FF 00 00 00 27 D4 8C 04 04 00 01 23 45 20 000000000000000000000000000000000000000000000000000000000000
<  D5 8D 08 E0 80 90 00

TgGetData
>  FF 00 00 00 02 D4 86

Target has been released error
<  D5 87 29 90 00

我循环了 5 次,但没有一个TgInitAsTarget会起作用。当我使用enableReaderMode(没有 NDEF 跳过)时,我得到了正确的序列:

...
>  FF 00 00 00 02 D4 86 //TgGetData
<  D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 01 00 9000 //SELECT command
>  FF 00 00 00 05 D4 8E 02 6A 82 //file or application not found
<  D5 8F 00 90 00 //Ack

>  FF 00 00 00 02 D4 86 //TgGetData
<  D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 00 90 00 //SELECT command
>  FF 00 00 00 05 D4 8E 02 6A 82 //file or application not found
<  D5 8F 00 90 00 //Ack

>  FF 00 00 00 02 D4 86 //TgGetData
<  D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 00 90 00 //SELECT command
>  FF 00 00 00 05 D4 8E 02 6A 82 //file or application not found
<  D5 8F 00 90 00 //Ack

TgGetData
>  FF 00 00 00 02 D4 86
//Recieving data

问题 1

为什么当应用程序不在前台或不使用时,Android 什么也不发回enableForegroundDispatch?这很奇怪,因为它一直在工作,但看起来更新改变了 NFC 的行为。

问题2

enableReaderMode(没有 NDEF 跳过)的行为与 的行为不同是否正常enableForegroundDispatch

请注意,使用以下命令启用阅读器模式:

nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A, null);
4

1 回答 1

1

关于 ACR122U 在主机卡仿真模式下被检测为 FeliCa (JIS X 6319-4) 而不是 ISO-DEP (ISO/IEC 14443-4):

这似乎是 PN532 NFC 控制器的一个已知问题。到目前为止,我没有找到任何解决方案。这与您在您的这个问题中已经发现的问题相同。

关于问题 1:为什么当应用程序不在前台或使用 enableForegroundDispatch 时,Android 什么也不发回?

好吧,正如您已经发现的那样,Android 设备显示它检测到模拟卡为 FeliCa。然而,对 tgInitAsTarget 命令 ( D5 8D 08 E0 80 90 00) 的响应表明 PN532激活为 ISO-DEP。因此,Android 设备似乎启动了与模拟 ISO-DEP 卡的通信,但必须立即放弃它而没有发送命令帧(因此您收到错误以响应 tgGetData 命令)。相反,Android 设备必须检测到(并且可能与)模拟的 FeliCa(实际上是 NFCIP-1)卡(这与我回答的第一部分中的问题有关)。

由于这在以前有效,因此更新必须对您的 Android 设备的轮询/对等发现算法进行了一些更改。

关于问题2:enableReaderMode(没有跳过NDEF)的行为与enableForegroundDispatch的行为不同是否正常?

这取决于您认为的“正常行为”。当您使用命令启用 Android 的阅读器模式时

nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A, null);

您明确指示 Android 的行为与默认标签/对等发现机制(与enableForegroundDispatch普通标签调度系统一起使用)不同。

默认轮询将尝试发现所有不同的标签技术(NfcA、NfcB、NfcF(快速)、NfcF(慢速)、NfcV(可能有多种模式)、NFCIP-1 活动模式、NfcBarcode;通常不按此顺序),因此它可以在 FeliCa/NFC-DEP 模式下发现 ACR122U。

使用您的enableReaderMode命令,您明确指示 Android 仅轮询 NfcA。因此,您的设备将在 ISO-DEP 模式下正确激活 ACR122U,从而启动 NDEF 发现过程。

于 2014-10-17T04:47:18.617 回答