Карта TagLostException IsoDep Android Java

Я работаю с картой Java, используя Android IsoDep. Я уже установил тайм-аут на 50000 миллисекунд. Я также рассчитал продолжительность открытия соединения NFC, и она составила чуть более 6 секунд.
Я положила карту на стол и положила на нее телефон. шанс, что карта может быть удалена физически.

Любая идея, почему это происходит?

Мой код:

try {
    if (nfc.isConnected()) {
        DLog.w(TAG, "exchange() - connected");

        byte[] resp = nfc.transceive(apdu);

        // ...
    } else {
        // ...
        close();
    }
} catch (TagLostException e) {
    DLog.e(TAG, "card was removed", e);
    close();
    // ...
}
catch (IOException e) {
    close();
    // ...
}  

Исключение:

01-08 09:54:54.721: E/IsoDepSecureHandler(11221): android.nfc.TagLostException: Tag was lost.
01-08 09:54:54.721: E/IsoDepSecureHandler(11221):   at android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:48)
01-08 09:54:54.721: E/IsoDepSecureHandler(11221):   at android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)
01-08 09:54:54.721: E/IsoDepSecureHandler(11221):   at android.nfc.tech.IsoDep.transceive(IsoDep.java:172)

Конкретная команда, которую он не смог выполнить, это 80460000400000271020363630303030303030353138323133303134333666383639383063022b100141000100000000000000000036364ed930284231adbc6c525e9f0abd

Однако та же самая команда выполнялась просто отлично, когда я использую бесконтактный считыватель, который подключается к моему телефону. Обратите внимание, что команда может выполняться только до тех пор, пока я не повторяю процесс и не генерирую новые параметры безопасности (некоторые другие команды APDU были отправлены на карту до этой). После создания новых параметров безопасности приведенная выше команда больше не работает; поэтому будет возвращено 6982.

tbellenger предложил добавить 00 в конец команды, но это не работает, даже со считывателем смарт-карт, так как возвращается 6985.


person ericn    schedule 08.01.2014    source источник


Ответы (1)


Попробуйте добавить «00» в конец вашего APDU. Иногда это требуется. Не изменяйте «LC» с «40» — просто добавьте нулевой байт. Я думаю, что это требуется в T=CL или T=1.

person tbellenger    schedule 08.01.2014
comment
Спасибо, @tbellenger, добавление 00 привело к тому, что ответ стал 6985 - person ericn; 08.01.2014
comment
6985 означает что-то вроде непроверенных условий безопасности или что-то в этом роде. Этого вы ожидали? - person tbellenger; 09.01.2014
comment
Нет, ожидается 6982. Я знаю это, отправив команду через устройство чтения смарт-карт, а не через телефон - person ericn; 09.01.2014
comment
С каким апплетом вы общаетесь? Очень странно получать ответ, отличный от того, что вы получаете через считыватель смарт-карт... - person tbellenger; 09.01.2014
comment
На самом деле, используя мой телефон ==› TagLostException ==› никакого ответа. Использование считывателя смарт-карт: если я использую мою команду выше ==> 6982, если я добавлю 00 в конец команды, как вы предложили ==> 6985 - person ericn; 09.01.2014