我想通过NFC(类IsoDep
)向Java Card智能卡发送长度为1699字节的APDU。我收到了错误
java.io.IOException:收发长度超过支持的最大值
我的手机是三星Galaxy S7。
我在卡片上的applet中使用了扩展长度。我已经确认该卡支持扩展长度。我通过pyapdutool测试了这个,通过向卡发送一个4000字节的APDU。
我发现当我编写此代码时,结果为false
:
final Tag t = (Tag) tag;
myTag = IsoDep.get(t);
boolean result = myTag.isExtendedLengthApduSupported();
我的清单中有这个:
<activity
android:name=".test"
android:label="@string/title_test"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" >
<action android:name="android.nfc.action.TAG_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
</intent-filter>
</activity>
如何通过Android NFC发送1699字节(或任何长度超过261字节)的APDU?
答案 0 :(得分:3)
简短的回答:你不能轻易做到这一点。
您已发现IsoDep
不支持设备上的扩展长度APDU(即isoDep.isExtendedLengthApduSupported()
返回false
)。实际上,不意味着您无法通过IsoDep
对象发送扩展长度的APDU。它实际上只意味着IsoDep
对象不会在超过两个ISO-DEP块上正确地分割扩展长度的APDU,因此假定长度超过261字节的APDU超过发送缓冲区大小。您仍然可以发送大小为&lt; = 261字节的扩展长度的APDU。
所以isoDep.isExtendedLengthApduSupported()
实际上表示你是否可以在一个ISO-DEP收发器中发送超过261个字节。
你可以做的就是不要使用IsoDep
对象,而是在{{之上手动实现ISO-DEP(ISO / IEC 14443-4传输协议)。 1}}对象(如果您的卡基于NFC-A / ISO / IEC 14443类型A)或NfcA
对象(如果您的卡基于NFC-B / ISO / IEC 14443类型B 和如果您的设备支持通过NfcB
对象交换数据。然后,您可以将扩展长度的APDU分成ISO-DEP块,这些块足够小,可用于NFC控制器的收发缓冲区(通常为253字节,包括头字节,不包括CRC字节)。但是,自己处理ISO-DEP协议也意味着你必须处理正确的ISO-DEP激活,处理块编号,阻止确认,超时,等待时间扩展等。这是相当复杂的,特别是超时是由于Android NFC堆栈的延迟,不容易观察到。