2014-03-05 158 views
1

我試圖通過Java讀取印度政府標準「Scosta」智能卡smartcardio 我使用的代碼是Java智能卡 - 讀Scosta智能卡

package com.example.smartcardreader; 

import java.util.List; 

import javax.smartcardio.ATR; 
import javax.smartcardio.Card; 
import javax.smartcardio.CardChannel; 
import javax.smartcardio.CardException; 
import javax.smartcardio.CardTerminal; 
import javax.smartcardio.CommandAPDU; 
import javax.smartcardio.ResponseAPDU; 
import javax.smartcardio.TerminalFactory; 

public class SmartCardReader { 

public static void main(String[] args) { 

     try{ 

      // show the list of available terminals 
      TerminalFactory factory = TerminalFactory.getDefault(); 

      List<CardTerminal> terminals = factory.terminals().list(); 

      System.out.println("Terminals: " + terminals); 

      // get the first terminal 
      CardTerminal terminal = terminals.get(0); 

      // establish a connection with the card 
      Card card = terminal.connect("*"); 
      System.out.println("card: " + card); 

      // get the ATR 
      ATR atr = card.getATR(); 
      byte[] baAtr = atr.getBytes(); 

      System.out.print("ATR = 0x"); 
      for(int i = 0; i < baAtr.length; i++){ 
       System.out.printf("%02X ",baAtr[i]); 
      } 

      CardChannel channel = card.getBasicChannel(); 
      byte[] cmdApduGetCardUid = new byte[]{ 
         (byte)0xFF, (byte)0xCA, (byte)0x00, (byte)0x00, (byte)0x00}; 

      ResponseAPDU respApdu = channel.transmit(
               new CommandAPDU(cmdApduGetCardUid)); 

      if(respApdu.getSW1() == 0x90 && respApdu.getSW2() == 0x00){ 

       byte[] baCardUid = respApdu.getData(); 

       System.out.print("Card UID = 0x"); 
       for(int i = 0; i < baCardUid.length; i++){ 
        System.out.printf("%02X ", baCardUid [i]); 
       } 
      } 

     card.disconnect(false); 

     } catch (CardException e) { 
      e.printStackTrace(); 
     } 
    } 

}

我使用eclipse IDE在Mac機上進行開發。當我運行這個代碼時,它給了我例外,因爲它不能讀取終端。我有一個USB讀卡器,並且還插入了智能卡。 你能指出我究竟在哪裏出錯嗎? 在此先感謝。

+0

如果能夠與讀者一起工作,您是否嘗試過其他任何應用程序?也許你只需要安裝驅動程序。 – jariq

+0

我在Netbeans及其工作的Windows機器上嘗試了相同的代碼。所以問題在於我的環境。 USB驅動程序已正確安裝,並且它也顯示在連接的設備列表中。我現在應該怎麼做 ? –

+0

你使用的是什麼版本的OS X和Java? – jariq

回答

2

它可能與您的問題無關,但包javax.smartcardio似乎在64位版本的java7的Mac OS X上被嚴重破壞。你可以在這個blog post和這個bug report找到更多的信息。您也可以看看試圖解決javax.smartcardio軟件包問題的開源項目jnasmartcardio