
การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ด (Smart Card Reader) ในภาษา Java
สามารถทำได้โดยใช้ไลบรารี javax.smartcardio ซึ่งเป็นส่วนหนึ่งของ Java Standard Edition PROTOCOL BENCH BLOG ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการเชื่อมต่อและส่งคำสั่ง APDU ไปยังสมาร์ทการ์ด:
import javax.smartcardio.*;
import java.util.List;
public class SmartCardExample {
    public static void main(String[] args) {
        try {
            // สร้างโรงงานสำหรับเครื่องอ่านการ์ด
            TerminalFactory factory = TerminalFactory.getDefault();
            // รับรายการเครื่องอ่านการ์ดที่มีอยู่
            List<CardTerminal> terminals = factory.terminals().list();
            System.out.println("เครื่องอ่านการ์ดที่พบ: " + terminals);
            if (terminals.isEmpty()) {
                System.out.println("ไม่พบเครื่องอ่านการ์ด");
                return;
            }
            // ใช้เครื่องอ่านการ์ดเครื่องแรก
            CardTerminal terminal = terminals.get(0);
            // รอให้มีการ์ดถูกใส่เข้าไปในเครื่องอ่าน
            if (terminal.waitForCardPresent(1000)) {
                // เชื่อมต่อกับการ์ด
                Card card = terminal.connect("*");
                System.out.println("เชื่อมต่อกับการ์ด: " + card);
                // รับช่องสัญญาณพื้นฐาน
                CardChannel channel = card.getBasicChannel();
                // สร้างคำสั่ง APDU (ตัวอย่าง: GET CHALLENGE)
                CommandAPDU command = new CommandAPDU(new byte[] {
                    (byte)0x00, // CLA
                    (byte)0x84, // INS
                    (byte)0x00, // P1
                    (byte)0x00, // P2
                    (byte)0x08  // Le
                });
                // ส่งคำสั่งและรับการตอบสนอง
                ResponseAPDU response = channel.transmit(command);
                byte[] responseData = response.getData();
                System.out.println("ข้อมูลที่ได้รับ: " + bytesToHex(responseData));
                // ตัดการเชื่อมต่อกับการ์ด
                card.disconnect(false);
            } else {
                System.out.println("ไม่มีการ์ดในเครื่องอ่าน");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // ฟังก์ชันช่วยในการแปลงข้อมูลไบต์เป็นสตริงฐานสิบหก
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }
}
Code language: Java (java)ในโค้ดนี้:
- สร้าง TerminalFactoryและรับรายการของCardTerminalที่มีอยู่ในระบบ
- ตรวจสอบว่าเครื่องอ่านการ์ดมีการ์ดถูกใส่หรือไม่
- เชื่อมต่อกับการ์ดและรับ CardChannelเพื่อสื่อสารกับการ์ด
- สร้างและส่งคำสั่ง APDU เพื่อรับข้อมูลจากการ์ด
- รับและแสดงผลข้อมูลที่ได้รับจากการ์ด
- ตัดการเชื่อมต่อกับการ์ดเมื่อเสร็จสิ้น
สำหรับการอ่านข้อมูลจากบัตรประชาชนไทย (Thai National ID Card) ซึ่งมีข้อมูลในรูปแบบอักษรไทย คุณอาจต้องแปลงข้อมูลที่ได้รับให้อยู่ในรูปแบบที่ถูกต้อง เช่น การแปลงเป็น UTF-8 เพื่อให้สามารถอ่านอักษรไทยได้อย่างถูกต้อง
นอกจากนี้ ยังมีโครงการโอเพนซอร์สที่พัฒนาไลบรารีสำหรับการอ่านข้อมูลจากบัตรประชาชนไทยโดยใช้ภาษา Java ซึ่งคุณสามารถศึกษาและนำมาใช้ในโครงการของคุณได้
โปรดทราบว่าการสื่อสารกับสมาร์ทการ์ดต้องใช้คำสั่ง APDU ที่ถูกต้อง ซึ่งอาจแตกต่างกันไปตามประเภทของการ์ด ดังนั้น ควรศึกษาคู่มือหรือเอกสารที่เกี่ยวข้องกับการ์ดที่คุณใช้งานเพื่อให้สามารถสื่อสารกับการ์ดได้อย่างถูกต้อง






