java讀取(華視)刷卡機的刷卡資訊

楊小豬發表於2018-08-31

需求:刷卡機插在電腦上,使用java程式碼讀取身份證資訊

實現:使用java Swing開發java客戶端小程式,並生成可執行的exe檔案。

使用工具及需要的jar:因為刷卡機的開發包是dll檔案,dll檔案裡寫的刷卡機程式的初始化,讀卡等介面,需要先呼叫dll檔案,才能使用其介面。

jna.jar ----用來讀取dll檔案的jar

需要的dll檔案:

這些檔案需要放到jdk的jre的bin目錄下,且只支援32位的jdk。

exe4j ---- 把java程式做成可執行的exe軟體的工具。

 

#############################################程式碼部分#########################################

//身份證資訊類
public class IdReadDomain {
   private String Name;
   private String Gender;
   private String Folk;
   private String BirthDay;
   private String Code;
   private String Address;
   private String Agency;
   private String ExpireStart;
   private String ExpireEnd;
   private String Photo;

 

//讀取dll檔案裡介面

public class SDTIDread {
   
static{
      System.loadLibrary("libSDTJNIidcard"); //libSDTJNIidcard位dll檔名稱
   }
   public static native int InitComm(); //初始化方法

   public static native int Authenticate(); //身份證認證方法 用來判斷是否放置了身份證
    
   public static native int CloseComm(); //關閉介面
   
   public static native IdReadDomain idReadDomain();
   
}

所需的c++編寫的jni指令碼檔案,裡面定義了dll裡介面的名稱和呼叫位置

例:Java_com_zax_SDTIDread_InitComm --- com_zax為包名,SDTIDread介面類,InitComm介面名:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zax_SDTIDread */

#ifndef _Included_com_zax_SDTIDread
#define _Included_com_zax_SDTIDread
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_zax_SDTIDread
 * Method:    InitComm
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_zax_SDTIDread_InitComm
  (JNIEnv *, jclass);

/*
 * Class:     com_zax_SDTIDread
 * Method:    Authenticate
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_zax_SDTIDread_Authenticate
  (JNIEnv *, jclass);

/*
 * Class:     com_zax_SDTIDread
 * Method:    CloseComm
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_zax_SDTIDread_CloseComm
  (JNIEnv *, jclass);

/*
 * Class:     com_zax_SDTIDread
 * Method:    idReadDomain
 * Signature: ()Lcom/zax/IdReadDomain;
 */
JNIEXPORT jobject JNICALL Java_com_zax_SDTIDread_idReadDomain
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

測試類:

public static void main(String[] args) {
      String result = "";
      //HttpRequest request = new HttpRequest();
      //初始化埠檢查機器是否存在
      int init = SDTIDread.InitComm();
      if (init <= 0) {
         System.out.println("裝置沒連線不是有效裝置");
         return;
      } else {
         if (SDTIDread.Authenticate() > 0) {
            //檢查卡片  讀取資訊
            IdReadDomain test = SDTIDread.idReadDomain();
            System.out.println("姓名:" + test.getName());
            System.out.println("性別:" + test.getGender());
            System.out.println("民族:" + test.getFolk());
            System.out.println("出生:" + test.getBirthDay());
            System.out.println("身份證號碼:" + test.getCode());
            System.out.println("住址:" + test.getAddress());
            System.out.println("簽發單位:" + test.getAgency());
            System.out.println("有效期開始:" + test.getExpireStart());
            System.out.println("有效期結束:" + test.getExpireEnd());
            //System.out.println(Base64.PhotoJpg());
            //System.out.println(Base64.PhotoBmp());
//          System.err.println(Base64.PhotoCardJpg());
//          SDTIDread.CloseComm();//關閉埠
         } else {
            System.out.println("沒有檢測到卡片");
            return;
         }
      }
   }

結果會在控制檯列印出身份證資訊。

接下來,新建刷卡類:

public class StartShuaKa {

    public static void main(String[] args) {
        JFrame jf = new JFrame("刷卡程式");
        jf.setSize(600, 600);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //佈局
        JPanel panel = new JPanel();

        //文字顯示
        JLabel label = new JLabel("程式開啟.....");

        /**
         * 啟動執行緒
         * */
        StartThread startThread =new StartThread();
        Thread thread =new Thread(startThread);
        thread.start();

        panel.add(label);
        jf.setContentPane(panel);
        jf.setVisible(true);
    }
}

在main方法中使用swing佈局,生成exe檔案時候,啟動的是main方法,所以把邏輯寫線上程類裡,在啟動main方法時,執行緒自動呼叫StartThread類裡的邏輯。

 

執行緒類:

public class StartThread implements Runnable {

    @Override
    public void run() {
        String url ="*************"; //業務需要呼叫的介面
        while (sdktest.Init()>0){  //定義的初始化方法
            while (sdktest.auth()){
                String param ="idnumber="+sdktest.getInfo().getCode();
                String result = HttpRequest.sendPost(url,param);
                JSONObject jsonObject = JSONObject.fromObject(result);
                String msg = (String) jsonObject.get("msg");
                System.err.println("身份證號:"+sdktest.getInfo().getCode() +" "+ msg);
            }
        }
    }
}

結果:

開啟後,只要刷卡就會展示刷卡資訊。

 

相關文章