Эмуляция карты с Nexus S и ACS ACR122

как я написал в заголовке, я пытаюсь использовать эмуляцию карты, используя свой Nexus S, Cyanogenmod 10.1.3 и usb-ридер ACS Acr122. Я нашел эту статью http://nelenkov.blogspot.it/2012/10/emulatory-pki-smart-card-with-cm91.html и github с исходным кодом https://github.com/nelenkov/virtual-pki-карта. Я следовал инструкциям, и произошла странная вещь. Пока смартфон находится на ридере, соединение постоянно начинается и останавливается, поэтому демонстрация не работает, и клиент вызывает это исключение:

Exception in thread "main" java.lang.RuntimeException: javax.smartcardio.CardException: connect() failed
    at org.nick.sepkiclient.Main.main(Main.java:105)
Caused by: javax.smartcardio.CardException: connect() failed
    at sun.security.smartcardio.TerminalImpl.connect(Unknown Source)
    at org.nick.sepkiclient.Main.waitForCard(Main.java:166)
    at org.nick.sepkiclient.Main.main(Main.java:48)
Caused by: sun.security.smartcardio.PCSCException: SCARD_E_READER_UNAVAILABLE
    at sun.security.smartcardio.PCSC.SCardStatus(Native Method)
    at sun.security.smartcardio.CardImpl.<init>(Unknown Source)
    ... 3 more

У вас есть идеи, как это исправить? Спасибо


person michoprogrammer    schedule 05.12.2013    source источник


Ответы (1)


К сожалению, NFC-ридер ACR 122U нельзя использовать в качестве считывателя смарт-карт. Несмотря на то, что он использует ПК/SC (CCID) для подключения считывателя к ПК, большинство версий ACR 122U требуют, чтобы вы использовали специальные команды считывателя и туннелировали их через ПК/SC. См. этот вопрос для получения дополнительной информации о процедуре туннелирования и доступных командах. .

person Michael Roland    schedule 06.12.2013
comment
На самом деле это ACR 122, а не ACR 122U. Я использую его для чтения смарт-карт, тегов и связи P2P с устройствами Android. Проблема сейчас в том, что я не могу использовать эмуляцию карты, и я не знаю, почему. знак равно - person michoprogrammer; 06.12.2013
comment
Согласно веб-сайту ACS, такого вещь как ACR 122 (т.е. без букв после цифр). Как вы сказали, ваш ридер использует USB, это может быть ACR 122U или ACR 122T (то же самое, но в другом корпусе). Просто чтобы вы были правы: вы используете ACR 122x, подключенный к телефону, для эмуляции карты или вы используете ACR 122x для чтения карты, эмулированной с помощью средства эмуляции программной карты CM? - person Michael Roland; 06.12.2013
comment
Второй! Я пытаюсь прочитать карту, эмулированную через CM, с помощью примера приложения, которое вы можете найти здесь github. com/nelenkov/virtual-pki-card . Об имени ACR с использованием этого простого кода ....terminals.list().get(0).getName()... Я получаю этот ACS ACR122 0, тогда я думал, что мой ACR не был ACR 122U, но что угодно ... :-) - person michoprogrammer; 06.12.2013
comment
Затем мы возвращаемся к проблеме, которую я описал выше. В примере Николая для считывателя требуется совместимый со стандартом считыватель ПК/SC, которым ACR 122x нет. Но если вы уже использовали это устройство для чтения бесконтактных карт и меток, у вас уже должен быть код для работы, который реализует прямую связь с чипом NFC в этом считывателе. - person Michael Roland; 06.12.2013
comment
Когда я использую другие библиотеки для чтения тегов mifare ultrilight с помощью ACR122x или для связи p2p между ACR122x и устройством Android (не с CM), все работает правильно. Когда я использую этот код здесь github.com/nelenkov/virtual-pki-card, приложение вроде работает корректно, клиентская часть вроде работает без проблем, но когда кладу смартфон на ридер, ридер начинает шуметь и клиент выдает исключение, написанное выше, а потом вылетает. - person michoprogrammer; 06.12.2013
comment
Если у вас есть только один считыватель смарт-карт, подключенный к вашему ПК, мне было бы интересно узнать, что произойдет, если вы замените строку 48 (Card card = waitForCard(terminals);) на CardTerminal terminal = terminals.list().get(0); terminal.waitForCardPresent(0); Card card = terminal.connect("*");. С ACR 122U я немедленно возвращаю объект Card, даже если карта не помещена в считыватель. , но, как ваш читатель, казалось, блокировался раньше, могут быть некоторые различия... - person Michael Roland; 06.12.2013
comment
Я заменил линию, как вы сказали, и результат тот же. Кажется, что CM не может установить канал связи, и когда я включаю устройство, ACR122x начинает пытаться установить соединение, но не может и начинает бесконечный цикл попыток соединения. Это очень странно.. - person michoprogrammer; 06.12.2013
comment
То есть программа проходит эту строку только тогда, когда вы подносите свой телефон к считывателю, верно? - person Michael Roland; 06.12.2013
comment
Кстати. Вы используете Windows и если да, то какую версию? - person Michael Roland; 06.12.2013
comment
Также не могли бы вы дать ссылку на то, с каким приложением вы успешно используете ридер для связи P2P или для чтения тегов MF UL? - person Michael Roland; 06.12.2013
comment
Я установил точку останова и могу подтвердить, что во время выполнения она достигает строки Card card = terminal.connect(*); и оно ждет. После того, как я поставил телефон на ACR122x, возникает исключение. - person michoprogrammer; 06.12.2013
comment
Я использую Windows 8 pro с Eclipse Standard/SDKVersion: Kepler Service Release 1. Рабочая библиотека: github.com /grundid/nfctools, но назначение этой библиотеки отличается от эмуляции карты. - person michoprogrammer; 06.12.2013
comment
Нет, я использую 64-битную версию Java. - person michoprogrammer; 06.12.2013
comment
Тогда я настоятельно рекомендую вам попробовать 32-битную версию. Есть некоторые известные проблемы с smartcardio в 64-разрядной версии Oracle Java. - person Michael Roland; 06.12.2013
comment
Это действительно странно. Я просмотрел библиотеку nfctools, и кажется, что она использует ту же процедуру для подключения к считывателю. - person Michael Roland; 06.12.2013
comment
Но процедура подключения всегда одна и та же, думаю, что проблема скорее всего в использовании CM. Я очень ценю твою помощь, чувак ^^ - person michoprogrammer; 06.12.2013
comment
Ну, как только программа проходит terminal.waitForCardPresent(0);, Card card = terminal.connect("*"); должно завершиться успешно, не дожидаясь фактической карты (т. е. предполагается, что считыватель покажет фиктивную карту драйверу ПК/SC). - person Michael Roland; 06.12.2013
comment
Всегда одна и та же проблема: Exception in thread "main" java.lang.RuntimeException: javax.smartcardio.CardException: connect() failed - person michoprogrammer; 09.12.2013