Thursday, April 11, 2019

Library for Java use SmartCard Reader on Rasberry Pi 3 Model B+

  • OS:Rasbian for Rasberry Pi 3 Model B+
  • ติดตั้ง library เพิ่มให้ Java เราใช้งาน SmartCard Reader บน Rasberry ได้
Step
sudo apt-get update
sudo apt-get install libusb-dev
sudo apt-get install pcscd  // ตัวนี้สำคัญเพราะเป็น service ที่ใช้กับพวก Reader  ต่างๆ
sudo apt-get install libpcsclite1
sudo apt-get install libpcsclite-dev
  • เพิ่มเติมสำหรับตรวจสอบ Reader  เรา
sudo apt-get install pcsc-tools
  • ใช้คำสั่ง pcsc_scan เพื่อทดสอบว่า linux เราพบอุปกรณ์ SmartCard Reader หรือเปล่า
PC/SC device scanner
V 1.4.18 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.7.4
Using reader plug'n play mechanism
Scanning present readers...
0: OMNIKEY CardMan 3x21 00 00

Tue Sep 11 15:44:49 2012
Reader 0: OMNIKEY CardMan 3x21 00 00
  Card state: Card inserted, 
  ATR: <some hexa codes>
  ...
  • สำหรับตรวจสอบ library ที่ pcsc_scan ใช้ คำสั่ง
ldd -r /usr/bin/pcsc_scan
  • เราจะพบพาธ library ที่สำคัญ เพราะ Java เราต้องใช้ตัวนี้ด้วย libpcsclite.so.1 (ซึ่งตัวนี้จะเป็น shortcut ชี้ไปยัง libpcsclite.so.1.0.0 อีกทีอ้างอิงบน Rasbian)
  • ให้เราเปิดไฟล์ /etc/rc.local (for all user) หรือ /home/user/.bashrc (for one user) พิมพ์คำสั่งตั้งพาธสำหรับ Java ซะหน่อยให้พบ library ตัวนี้ 
  • ตัวอย่างจากอ้างอิง 
export _JAVA_OPTIONS="-Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1"
export JAVA_OPTS="-Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1"
  • ประยุกค์ใช้กับ Rasbian บน Rasberry เราจะได้เป็นแบบนี้ (ใช้อันใดอันหนึ่งพอ)
export _JAVA_OPTIONS="-Dsun.security.smartcardio.library=/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1"
export JAVA_OPTS="-Dsun.security.smartcardio.library=/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1"
  • ผู้เขียนใช้แค่ export _JAVA_OPTIONS ใน .bashrc สำหรับ user เท่านั้น
  • หรืออยากใช้แบบเฉพาะตอน รันขณะนั้น ก็ได้
java -Dsun.security.smartcardio.library=/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1 File.java
  • ถ้าเป็น Ubuntu Mate for Rasberry Pi 3 ไม่ต้อง export path java ไปที่ libpcsclite1.so นะมันคงเห็นพาธนี้แล้วตั้งแต่ลง Java แต่สำหรับ Rasbian ไม่ใช่ต้อง export แบบ global (/etc/rc.local) หรือ เฉพาะ user ก็ (/home/user/.bashrc)
  • หรือจะเขียนโค้ด Load library ก่อนทุกครั้งก็ได้เช่นกัน javax.smartcardio library

      try {
            String comm[] = { "find", "/usr", "/lib", "-name",
                    "libpcsclite.so.1" };
            Process p = Runtime.getRuntime().exec(comm);

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));

            while ((line = reader.readLine()) != null && !line.equals("")) {
                if (line.contains("libpcsclite.so.1")) {
                System.setProperty("sun.security.smartcardio.library",line);
                    break;
                }

            }
            p.waitFor();

        } catch (Exception e) {

            e.printStackTrace();
        }
Add

  • สำหรับ Ubuntu Desktop ทดสอบบน 18.04 แต่ OpenJDK 10 ไม่พบ javax.smartio 
  • ต้องใช้ OpenJDK 11 หว่า สงสัย 10 ต้อง export path แน่ๆ เลย ลง libusb-de pcscd libpcsclite1 libpcsclite-dev แล้ว ไม่ต้อง set path libpcsclite.so.1 น่ะมันมองเห็นเลย 
  • และ Ubuntu - Mate for Rasberry ก็ไม่ต้อง export เหมือนกันนะ
  • แต่ Rasbian ต้อง export path สำหรับ libpcsclite.so.1 นะ จำได้
Ref

No comments:

Post a Comment