Можно ли отправлять команды псевдо-APDU, когда карты нет?

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

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

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

2 ответа

Решение

Нашел решение по образцу карт-эмуль в 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 (скопирован из примера кода, не уверен, что такое теория>_<)

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

Цитируется здесь:

transmitControlCommand:

public abstract byte[] transmissionControlCommand(int controlCode, команда byte[]) выбрасывает CardException

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

Параметры:

controlCode - контрольный код команды

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

Броски:

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

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

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

IllegalStateException - если этот объект карты был удален через метод disconnect()

Другие вопросы по тегам