การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ด (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 ที่ถูกต้อง ซึ่งอาจแตกต่างกันไปตามประเภทของการ์ด ดังนั้น ควรศึกษาคู่มือหรือเอกสารที่เกี่ยวข้องกับการ์ดที่คุณใช้งานเพื่อให้สามารถสื่อสารกับการ์ดได้อย่างถูกต้อง