1

I am working on an application for Android reading a contactless smart card but I have some problems with my Galaxy S3. Before to describe problems, I need to precise that on a PC, I can communicate perfectly with the card using the smartcardio API in Java and NFC readers from different manufacturers.

This card is detected as supporting technologies "IsoDep" and "NfcB" by the NFC stack. However, when I send my apdu command with "transceive", I get an exception "Transceive failed". I have tried to increase timeout but no better result.

iso = IsoDep.get(tag);
if (iso!=null) {
    try {
        iso.connect();
        // txMessage is a TextView object used for debugging purpose
        txMessage.setText("Max:"+iso.getMaxTransceiveLength()+" timeout:"+iso.getTimeout()+" connected:"+iso.isConnected());
        iso.setTimeout(2000);
        txMessage.setText("Max:"+iso.getMaxTransceiveLength()+" timeout:"+iso.getTimeout()+" connected:"+iso.isConnected());
        byte[] command = new byte[] {(byte) 0x00, (byte) 0xA4, (byte) 0x04,(byte) 0x00, (byte) 0x06,(byte) 0xA0,(byte) 0x00,(byte) 0x00, (byte) 0x00,(byte) 0x12,(byte) 0x00};
        byte[] response = iso.transceive(command);
        } catch (IOException e) {
            txMessage.setText(txMessage.getText()+"\n"+e.getMessage());
        }
}

When running this code, I get:

Max:261 timeout:309 connected: true
Max:261 timeout:2474 connected: true
Transceive failed

I have noticed that this card requires to be very close of the NFC antenna to work. I need to remove the additional plastic protection case (not the back cover) of my phone in order the card would be detected (I guess powered).

Before to post, I have read NFC typeb card not getting detected by any NFC application (like:nfctaginfo) and Android isodep.isConnected() returns false and maximum Transceive length:0 byte ,for type B card.? and several other posts elsewhere (http://forum.xda-developers.com/showthread.php?t=1705970 , http://code.google.com/p/android/issues/detail?id=35960 ) but I did not find a solution.

A possible solution would be to try to communicate with an external antenna but I am not sure where to connect it? On battery connector where there is no "+" and "-"?

Another solution would be to try to communicate with the card with NfcB (NfcB nfcb = NfcB.get(tag);), but I do not know the ISO14443-3B protocol (I only know quite well APDU, T0-TPDU but not other TPDU protocols).

Just to be sure, I have updated my phone to Android 4.1.2 (instead of 4.1.1) but no better result.

4

2 回答 2

1

这绝对是一个超时问题,并且与 NXP NFC 芯片(如 S3 中的那个)兼容

我曾在比典型手机天线具有更高 Q 因子的天线上使用 B 型标签,并且在执行 ISO-DEP 时,我仍然需要更改我正在使用的 NFC 芯片的默认超时时间(NXP PN532 )。A 型调制由 Phillps(现为 NXP)开发。B 型调制由 Motorolla 开发,并已获得 NXP 的阅读器芯片许可,因此相对于 A 型实现,仅包含一个基本实现。

我不是在 Android 上执行此操作,而是在嵌入式平台上执行此操作,因此我可以完全访问 NFC 芯片的功能。因此,只有通过使用要求应用程序处理 14443-4 协议并扩展阅读器超时容限的更基本的收发方法,我才能使用 ISO-DEP 与 B 型标签通信

Android 4.4 有一个叫做reader mode的东西,它可能有一个特性可以让你延长这个超时时间。

于 2014-11-25T00:31:05.640 回答
1

我也有三星 Galaxy S3,我注意到 TypeB 非接触式卡的连接性能比 TypeA 差。提高超时值似乎是解决此类问题的快速解决方案,但由于它对您不起作用,问题可能与射频场的强度有关。您是否测试过调用transceive()失败是因为超时还是因为连接丢失?也许您可以尝试进一步提高超时时间,智能卡上的某些操作可能需要很长时间。

针对您的问题的另一个建议是移除 S3 的后盖并将智能卡直接放在电池上(NFC 天线集成在其中)。根据我的经验,芯片在智能卡上的位置略有不同,因此您可以尝试卡的方向。您可以通过将卡从设备底部滑到电池上来测试这一点。

在我使用 Galaxy S3(Android 4.1.1)时,我能够连接到 TypeA 和 TypeB 非接触式智能卡(德国 eID 卡)并将数据收发到其中。我注意到TypeB卡在空闲时有时会无缘无故丢失。但无论如何我都可以用它发送和接收数据。即使卡上的芯片必须执行一些计算并因此需要稍微多一点的射频场功率,NFC 天线的场似乎也足够强,可以在我的情况下保持连接。也许您的卡没有正确设计用于低功率射频场?不幸的是,据我所知,在 Android 设备上提高 NFC 天线的功率输出是不可能的。

通过 NfcB ( NfcB nfcb = NfcB.get(tag);) 进行通信似乎对我没有任何影响。我能够通过IsoDep对象进行通信并完美地收发数据。

使用外部或附加天线值得一试。在这个 YouTube 视频中,它展示了如何将额外的 NFC 天线放入 Galaxy S4。在视频中,您会注意到 S4 背面的外部天线引脚。在这里观看第三张照片时(Galaxy SIII 拆解)——取出电池的那张——你会注意到 SIII 背面还有额外的天线引脚。左侧的两个金色触针。谷歌搜索一下,这些引脚被命名为“ANT500”和“ANT501”,因此它们可能是外部 NFC 天线触点。如果您搜索“三星 Galaxy Note2 外置 NFC 天线“或在 eBay(或任何搜索引擎)上类似的东西,你会得到 YouTube 视频中使用的天线。SIII 和 S4 都没有官方的外部 NFC 天线,但它可能会工作。天线不是很价格昂贵(目前约为 5 美元),因此您可以尝试一下。

于 2013-08-20T08:34:27.343 回答