2015-05-17 31 views
5

Akıllı kartla ilgili uygulamalar geliştirmek için javax.smartcardio paketini kullanıyorum. Okuyucu LED/LCD durumunu ayarlamak için Pseudo ADPU komutları göndermek istiyorum.Kart mevcut değilken Pseudo-APDU komutları göndermek mümkün mü?

Okuyucu/kart için APDU komutları göndermenin tek yönteminin CardChannel::transmit olduğunu buldum, ancak kartta mevcut olması gerekir.

Okuyucuda kart yokken Pseudo-APDU komutları göndermek mümkün mü? APDU komutları ne olacak? (Kullanma Java)

+0

... Bunu "Akıllı Kardiyo" olarak okudum. Ben akıllıyım, söz veriyorum! Ayrıca, ADPU ne anlama geliyor?Daha önce hiç görmedim. –

+0

@QPaysTaxes: SmartCardInOut olarak okumak daha iyidir;). APDU veya Uygulama Veri Protokolü Birimi, akıllı kartlara komut göndermek ve bunlardan yanıt almak için bir protokoldür. Basitçe onaltılık bir sıra kuyruğu. Bu komutların minimum uzunluğu 4 bayttır (komut başlığı) ve minimum kart cevabı uzunluğu 2 bayttır (Durum Kelimesi) – Abraham

+0

Oracle topluluğu içinde aşağıdaki konuya bir bakın: Görünüşe göre aynı sorun var: https : //community.oracle.com/thread/2193998 – Abraham

cevap

3

yoluyla bertaraf edilmiştir halinde http://www.springcard.com numaralı telefondan SDK for PC/SC numaralı telefondan örnek olarak bir örnek.

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; 
     } 

    } 

} 

ben noktalarıdır düşünüyorum: İşte benim kodudur

  1. koduyla Card::transmitControlCommand yöntemi kullanarak 'Kartı'
  2. almak için DIRECT protokolünü kullanarak CONTROL_CODE işlevinden var (kopyalanan örnek kod, teori ne anlama geldiğinden emin değilsiniz.>
1

Aşağıdaki yöntem, aynı zamanda okuyucuya bir kart mevcut ihtiyacı var ama sadece bilgin biz terminali kontrol eden komutlar için başka bir yöntem olduğunu söylemek burada yayınlanmıştır düşünüyorum:

Alıntı sahibi here:

transmitControlCommand:

halka soyut bayt [] transmitControlCommand (int controlCode, bayt [] komutu) CardException atar

Terminal aygıtına bir kontrol komutu iletir. Bu , örneğin, dahili PIN pedi veya biyometri gibi kontrol terminali işlevlerine kullanılabilir.

Parametreler:

controlCode - komuta kontrol kodu

komut - komut verileri

Atmalar:

SecurityException - Bir SecurityManager varsa ve eğer arayan gerekli izinlere sahip değil

NullPointerException - Komut null ise

CardException - kart işlemi başarısız olursa

IllegalStateException - bu kart bir amacı, bir çözelti, mesafede Bulunan kesme() yöntemiyle