2015-05-17 19 views
5

Я использую пакет javax.smartcardio для разработки приложений, связанных с смарт-картой. Я хочу отправить команды Pseudo ADPU для установки состояния светодиода/ЖК-дисплея моего читателя.Можно ли отправлять команды Pseudo-APDU пока карты нет?

Я обнаружил, что единственный способ отправки команд APDU для чтения/карты - CardChannel::transmit, но он должен быть запущен на карте.

Можно ли отправлять команды Pseudo-APDU, пока карта не присутствует в считывающем устройстве? как насчет команд APDU? (Использование Java)

+0

... Я читал это как «Smart Cardio». Я умный, обещаю! Кроме того, что означает ADPU?Я никогда этого не видел. –

+0

@QPaysTaxes: Лучше прочитать его как SmartCardInOut;). APDU или Application Data Protocol Unit - это протокол для отправки команд смарт-картам и получения ответа от них. Просто это очередь шестнадцатеричных чисел. минимальная длина этих команд составляет 4 байта (заголовок команды), а минимальная длина ответа на карту - 2 байта (слова состояния) – Abraham

+0

Взгляните на следующий поток в сообществе оракулов, похоже, что это та самая проблема, что у вас есть: https : //community.oracle.com/thread/2193998 – Abraham

ответ

3

найден решением из образец карточки-emul в SDK for PC/SC в http://www.springcard.com. Вот мой код:

import java.util.List; 

import javax.smartcardio.CardException; 
import javax.smartcardio.CardTerminal; 
import javax.smartcardio.TerminalFactory; 

public class TestPcsc { 

    public static void main(String[] args) throws CardException { 

     TerminalFactory tf = TerminalFactory.getDefault(); 
     List<CardTerminal> terminals = tf.terminals().list(); 
     CardTerminal cardTerminal = (CardTerminal) terminals.get(0); 

     byte[] command = { (byte) 0xE0, (byte) 0x00, (byte) 0x00, (byte) 0x29, (byte) 0x01, (byte) 0x00 }; 
     cardTerminal.connect("DIRECT").transmitControlCommand(CONTROL_CODE(), command); 

    } 

    public static int CONTROL_CODE() { 

     String osName = System.getProperty("os.name").toLowerCase(); 
     if (osName.indexOf("windows") > -1) { 
      /* Value used by both MS' CCID driver and SpringCard's CCID driver */ 
      return (0x31 << 16 | 3500 << 2); 
     } 
     else { 
      /* Value used by PCSC-Lite */ 
      return 0x42000000 + 1; 
     } 

    } 

} 

Я думаю, что точки:

  1. Использование DIRECT протокола, чтобы получить «карту»
  2. Использование Card::transmitControlCommand метод с кодом получил от функции CONTROL_CODE (копируется из образец кода, не уверен, что такое теория> _ <)
1

Я думаю, что следующий метод нуждается в картах, присутствующий в читателе также, но только для информации, которую я разместил его здесь, чтобы сказать, что мы есть другой метод для команд терминала управления:

Цитируется here:

transmitControlCommand:

общественные абстрактные байты [] transmitControlCommand (интермедиат controlCode, байты [] команда) бросает CardException

Передача управляющей команды на терминальное устройство. Этот может использоваться, например, для функций управляющих терминалов, таких как встроенный PIN-пэд или биометрия .

Параметры:

controlCode - управляющий код команды

команда - данные команды

Броски:

SecurityException - если SecurityManager существует и абонент не имеет требуемого разрешения

NullPointerException - если команда является нулем

CardException - если операция карты не удалась

IllegalStateException - если этот объект карты был утилизирован с помощью метода разъединения()

 Смежные вопросы

  • Нет связанных вопросов^_^