我正在开发Android阅读非接触式智能卡的应用程序,但我的Galaxy S3存在一些问题。 在描述问题之前,我需要在PC上精确地使用Java中的smartcardio API和来自不同制造商的NFC读卡器与卡完美通信。
此卡被NFC堆栈检测为支持技术“IsoDep”和“NfcB”。 但是,当我发送带有“收发”的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)但效果不佳。
答案 0 :(得分:1)
我也有三星Galaxy S3,我注意到TypeB非接触式卡的连接性能比TypeA差。提高超时值似乎是对此类问题的快速解决方案,但由于它不适合您,问题可能在于RF场的强度。您是否测试过transceive()
的呼叫是否由于超时或连接丢失而失败?也许你可以尝试进一步提高超时,某些操作可能需要很长时间才能使用智能卡。
您的问题的另一个建议是取下S3的后盖并将智能卡直接放在电池上(NFC天线集成在那里)。根据我的经验,芯片位于智能卡上的位置略有不同,因此您可以尝试卡的方向。您可以通过将卡从设备底部滑到电池顶部来测试。
在我使用Galaxy S3(Android 4.1.1)的工作中,我能够连接到TypeA和TypeB非接触式智能卡(德国eID卡)并将数据收发。我注意到TypeB卡在闲置时有时没有任何理由丢失。但无论如何,我可以用它发送和接收数据。即使当卡上的芯片必须执行一些计算并因此需要来自RF场的稍微更多的功率时,NFC天线的场看起来足够强以保持连接在我的情况下。也许您的卡设计不适合使用低功率射频场?不幸的是,据我所知,不可能在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美元),所以你可以尝试一下。
答案 1 :(得分:1)
这绝对是超时的事情,与NXP NFC芯片兼容(如S3中的那个)
我在Q系数比典型手机天线更高的天线上使用了B型标签,在进行ISO-DEP时,我还需要更改我正在使用的NFC芯片的默认超时(恩智浦PN532)。 A型调制由Phillps开发,现在是恩智浦。 B型调制由Motorolla开发,并且获得恩智浦的读卡器芯片许可,因此相对于A型实现仅包括基本实现。
我不是在Android上做这个,而是嵌入式平台,所以我可以完全访问NFC芯片的功能。因此,只有使用更基本的transeiving方法,需要应用程序处理14443-4协议并扩展阅读器的超时容限,我才能使用ISO-DEP与B类标签对话
Android 4.4有一个名为reader mode的东西,可能有一项功能可以让你延长这个超时。