我正在为读取非接触式智能卡的Android应用程序工作,但我的Galaxy S3遇到了一些问题。
在描述问题之前,我需要弄清楚在PC上,我可以使用Java中的smartcardio API和来自不同制造商的NFC读取器与卡进行完美的通信。
NFC堆栈将该卡检测为支持技术“ IsoDep”和“ NfcB”。
但是,当我用“ transceive”发送apdu命令时,出现异常“ Transceive failed”。我试图增加超时时间,但没有更好的结果。
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());
}
}
运行此代码时,我得到:
Max:261 timeout:309 connected: true
Max:261 timeout:2474 connected: true
Transceive failed
我已经注意到,此卡需要离NFC天线很近才能工作。我需要卸下手机的其他塑料保护壳(而不是后盖),以便检测卡(我猜是通电)。
发布之前,我已经阅读了NFC typeb card not getting detected by any NFC application (like:nfctaginfo)和Android isodep.isConnected() returns false and maximum Transceive length:0 byte ,for type B card.?以及其他地方的其他几篇文章(http://forum.xda-developers.com/showthread.php?t=1705970,http://code.google.com/p/android/issues/detail?id=35960),但是我没有找到解决方案。
一种可能的解决方案是尝试与外部天线进行通信,但是我不确定该在哪里连接?在电池连接器上没有“ +”和“-”的地方吗?
另一种解决方案是尝试使用NfcB(
NfcB nfcb = NfcB.get(tag);
)与卡进行通信,但我不知道ISO14443-3B协议(我只非常了解APDU,T0-TPDU,但不了解其他TPDU协议)。可以肯定的是,我已经将手机更新为Android 4.1.2(而不是4.1.1),但是没有更好的结果。
最佳答案
我也有一个三星Galaxy S3,我注意到TypeB非接触式卡的连接性能比TypeA差。提高超时值似乎是解决此类问题的一种快速方法,但是由于这种方法对您不起作用,因此问题可能出在RF场强上。您是否测试了transceive()
的调用是否由于超时或连接丢失而失败?也许您可以尝试进一步提高超时时间,但是使用智能卡进行某些操作可能会花费很长时间。
对您的问题的另一个建议是卸下S3的后盖,然后将智能卡直接放在电池上(NFC天线已集成在电池中)。以我的经验,芯片在智能卡上的位置稍有不同,因此您可以尝试使用智能卡的方向。您可以通过从设备底部到顶部将卡滑入电池来进行测试。
在使用Galaxy S3(Android 4.1.1)的过程中,我能够连接到TypeA和TypeB非接触式智能卡(德国eID卡)并收发数据。我注意到,TypeB卡在空闲时有时会无故丢失。但是我仍然可以使用它来发送和接收数据。即使卡上的芯片必须执行一些计算,因此需要从RF场中获取更多功率,但在我看来,NFC天线的场强似乎足以保持连接。也许您的卡设计不适合在较低功率的RF场上工作?不幸的是,据我所知,无法提高Android设备上NFC天线的功率输出。
通过NfcB(NfcB nfcb = NfcB.get(tag);
)进行通信对我似乎没有任何影响。我能够通过IsoDep
对象进行通讯并完美地收发数据。
值得尝试使用外部或附加天线。 In this YouTube video展示了如何将额外的NFC天线放入Galaxy S4。在视频中,您会注意到S4背面的外部天线引脚。观看此处的第三张图片(Galaxy SIII teardown)时(这是取出电池的图片),您会注意到SIII的背面也有其他天线针脚。左侧的两个金色接触针。稍作查询就发现这些引脚分别命名为“ ANT500”和“ ANT501”,因此它们很可能是外部NFC天线触点。如果您在eBay(或任何搜索引擎)上搜索“ Samsung Galaxy Note2外置NFC天线”或类似名称,您将在YouTube视频中使用该天线。 SIII和S4都没有官方的外部NFC天线,但是可能会起作用。天线不是很贵(目前约5美元),因此您可以尝试一下。