2013-06-23 1 views
1

Я работаю над приложением для Android, читающим бесконтактную смарт-карту, но у меня есть некоторые проблемы с моей Galaxy S3. Прежде чем описывать проблемы, мне нужно уточнить, что на ПК я могу прекрасно общаться с картой, используя API смарт-карт в Java и NFC-устройствах от разных производителей.Transceive не удалось на Galaxy S3 с картой NFC-B

Эта карта обнаружена в качестве поддерживающих технологий «IsoDep» и «NfcB» стекю NFC. Однако, когда я отправляю свою команду apdu с «transceive», я получаю исключение «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

У меня точно такие же результаты с Samsung Nexus S I9020 от Samsung под Android 4.1.2 – moimoiici

+0

Нет лучшего результата с внешней антенной на Galaxy Nexus S ... :-( – moimoiici

ответ

1

У меня есть галактика S3 от Samsung, и я заметил, что производительность соединения для бесконтактных карт TypeB хуже, чем для TypeA. Повышение значения тайм-аута, по-видимому, является быстрым решением проблем такого рода, но поскольку это не сработало для вас, проблема может быть связана с силой RF-поля. Вы протестировали ли отказ transceive() из-за таймаута или из-за потери соединения? Возможно, вы могли бы попытаться увеличить тайм-аут еще больше, некоторые операции могут занять много времени на смарт-карте.

Еще одно предложение, связанное с вашей проблемой, заключается в том, чтобы снять крышку вашего S3 и поместить смарт-карту непосредственно на батарею (там встроена антенна NFC). По моему опыту, небольшая разница заключается в том, что чип расположен на смарт-карте, поэтому вы можете экспериментировать с ориентацией карты. Вы можете проверить это, сдвинув карту на батарею от нижней части устройства до верхней части.

В моей работе с Galaxy S3 (Android 4.1.1) я смог подключить и трансивер данных к бесконтактным смарт-картам TypeA и TypeB (немецкие карты eID). Я заметил, что карта TypeB иногда терялась без всякой причины, когда она простаивала. Но я могу отправлять и получать данные с ним в любом случае. Даже когда чип на карте должен выполнить некоторые вычисления и, следовательно, требует немного большей мощности от радиочастотного поля, поле антенны NFC кажется достаточно сильным, чтобы поддерживать соединение в моем случае. Может быть, ваша карта неправильно разработана для работы с полями с более низким энергопотреблением? К сожалению, пока нет возможности увеличить выходную мощность антенны NFC на устройствах Android.

Общение с помощью NfcB (NfcB nfcb = NfcB.get(tag);), похоже, не имеет для меня никакого значения.Я могу общаться через IsoDep Объект и трансивер данных отлично.

Использование внешней или дополнительной антенны стоит попробовать. In this YouTube video показано, как можно добавить дополнительную антенну NFC в Galaxy S4. В видео вы увидите внешние штырьки антенны на задней панели S4. При просмотре третьего изображения здесь (Galaxy SIII teardown) - тот, который вытащил аккумулятор, вы заметите, что на задней панели SIII имеются дополнительные штырьки антенны. Два золотых контактных контакта на левой стороне. Похоже, что некоторые из них названы «ANT500» и «ANT501», поэтому они, вероятно, являются внешними контактами антенны NFC. Если вы ищете «Samsung Galaxy Note2 внешняя антенна NFC» или что-то подобное на eBay (или любой поисковой системе), вы получите антенну, используемую в видео YouTube. Официальных внешних антенн NFC для SIII и S4 нет, но, вероятно, это сработает. Антенна не очень дорогая (в настоящее время около 5 долларов США), поэтому вы можете попробовать.

1

Это, безусловно, таймаут вещь, и совместимость вещь с чипами NXP NFC (например, один в S3)

Я работал с бирками типа В на антенну с высоким коэффициентом Q, чем у типичная антенна для мобильных телефонов, а при выполнении ISO-DEP мне нужно по-прежнему изменять тайм-ауты по умолчанию чипа NFC, который я использую (NXP PN532). Модуляция типа А была разработана Phillps, теперь NXP. Модуляция типа B была разработана Motorolla и под лицензией NXP для своих чипов для считывателей, поэтому только базовая реализация включена относительно реализации типа A.

Я не делаю этого на Android, но встроенная платформа, поэтому у меня есть полный доступ к функциям чипа NFC. Таким образом, только используя более базовый метод трансивера, который требует, чтобы приложение обрабатывало протокол 14443-4 и увеличивало допуск к тайм-ауту читателя, я мог поговорить с тегом типа B, используя ISO-DEP

Android 4.4 имеет что-то называемое reader mode, которое может иметь функцию, которая позволяет продлить этот таймаут.