Eclipse下Java Card開發總結
近來專案要做CPU卡的開發,如果用真實的CPU卡測試,多次操作錯誤後卡會被鎖死,既浪費資源也不利於開發。因此想到是否有模擬的智慧卡操作呢,網上一搜還真有,用Java模擬智慧卡,叫做“Java Card”開發。
-
環境搭建
網上介紹的資料比較亂,大體歸納起來主要是給Eclipse安裝兩個外掛: JCOP和JCDE外掛。關於這兩個外掛的安裝可以參考博文“JavaCard開發環境搭建” https://blog.csdn.net/jiangbo1984/article/details/50920926
這裡需要說明的是這兩個外掛對應的是兩種開發方式,使用其中一種即可,也可以兩種都安裝。其中的eclipse-jcde-0.2.zip可以使用在新版本的JDK和Eclipse上(我的64位JDK1.8和Eclipse-Mars測試是沒問題的,關於這種方式在以後的文章裡再介紹)。
對於下載的JCOP Tools外掛,使用就比較悲劇了,按照網上的文章介紹,把下載的com.ibm.bluez.jcop.eclipse_3.1.2.zip檔案解壓後,plugins目錄下的com.ibm.bluez.jcop.eclipse_3.1.2資料夾拷貝到Eclipse的plugins目錄下,features目錄下的com.ibm.bluez.jcop.eclipse_3.1.2資料夾拷貝到Eclipse的features目錄下,再把com.ibm.bluez.jcop.eclipse.prefs檔案拷貝到工作空間workspace.metadata.plugins\org.eclipse.core.runtime.settings目錄下,然後開啟Eclipse軟體,並沒有看到新建工程裡有Java Card型別。按照網上說的開啟命令列,在Eclipse所在目錄,輸入命令“eclipse -clean”啟動,結果發現外掛還是沒有顯示:
想起來網上說的必須得使用JDK1.5,便決定換JDK1.5試試,下載網址:https://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase5-419410.html
這裡下載的是32位版本jdk-1_5_0_22-windows-i586-p.exe檔案(64位的試過了也不行)。因為我電腦C盤已經安裝JDK1.8了,這裡把JDK1.5安裝到D:\Program Files (x86)\Java目錄下:
為安全起見,查詢一下java版本,沒有“64 bit”字樣就是32位的(之前就被網上坑了,說是32位版本,結果不能用,一查版本資訊是64位的):
問題又來了,新的Eclipse還不支援JDK1.5,看來這個外掛很老了,網上說新版本已經收費了。沒辦法只能下載再老點的Eclipse,juno版本正好最低要求JDK1.5,下載網址:https://www.eclipse.org/downloads/packages/release/
把下載的eclipse-jee-juno-SR2-win32.zip解壓到D盤,如果直接啟動,還是用預設的JDK1.8,這裡需要指定使用JDK1.5啟動,修改eclipse.ini檔案,注意路徑一定要對應好:
然後又按照上述步驟安裝一遍com.ibm.bluez.jcop.eclipse_3.1.2外掛,結果還是顯示不了。難道Eclipse版本還是新,沒辦法,又下了一個indigo版本,檔案為eclipse-jee-indigo-SR2-win32.zip。這次再安裝一遍com.ibm.bluez.jcop.eclipse_3.1.2外掛,這次終於成功了:
真不容易啊,趕緊建立一個工程試一下吧。 -
新建工程測試
新建一個專案,選擇“Java Card Project”型別,然後輸入工程名稱:
下一步,選擇對應的配置資訊,先按預設的來吧:
再下一步,注意要選擇一個模板,否則建立的是一個空專案:
然後輸入包名和類名:
下一步,輸入Package AID和Applet AID,這個對應是卡的開發商的編號,格式有要求的,不能隨便輸入:
點選完成,系統會自動建立一個簡單的應用:
-
執行測試
執行一下吧,右鍵專案選擇Run configurations…,新建一個配置:
選擇Generic JCOPv2.2.1:
然後點選“Run”執行:
說明啟動成功了,下面輸入“/select+AID”命令選擇我們模擬的卡,這裡的AID要替換為建立工程時輸入的Applet AID:
卡選擇成功後,就可以使用“/send APDU”傳送APDU命令了。傳送什麼好呢,看CPU卡初始化時有個“選擇3F00檔案 00A40000023F00”步驟,測試一下吧:
呀,指令不被支援啊,看看程式碼裡有這行:
看來還得自己處理啊,以後有時間再說吧,今天先寫到這裡。。。