Smart Card Reader | JAVA

การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ดในภาษา Java

สำหรับนักพัฒนาที่ต้องการเชื่อมต่อเครื่องอ่าน Smart Card Reader ด้วยภาษา Java สามารถเริ่มต้นได้ผ่านไลบรารี javax.smartcardio ซึ่งอยู่ใน Java Standard Edition โดยแนวทางนี้ช่วยให้โปรแกรมสามารถตรวจจับเครื่องอ่าน, รอการ์ดถูกเสียบ, เชื่อมต่อกับการ์ด และส่งคำสั่ง APDU เพื่อรับข้อมูลจากสมาร์ทการ์ดได้อย่างเป็นระบบ

ภาพรวมการทำงาน

โครงสร้างการเชื่อมต่อใน Java เริ่มจากการสร้าง TerminalFactory เพื่อดึงรายการเครื่องอ่านการ์ดที่มีอยู่ในระบบ จากนั้นเลือกเครื่องอ่านที่ต้องการใช้งาน ตรวจสอบว่ามีการ์ดอยู่ในช่องอ่านหรือไม่ แล้วจึงเปิดการเชื่อมต่อกับการ์ดผ่าน Card และ CardChannel ก่อนส่งคำสั่ง APDU ไปยังการ์ดเพื่ออ่านค่าที่ต้องการ

แนวทางนี้เหมาะกับงานยืนยันตัวตน, งานลงทะเบียน, งานอ่านข้อมูลบัตร, หรืองานพัฒนาระบบเฉพาะทางที่ต้องใช้งานร่วมกับ Smart Card Reader บนเครื่องคอมพิวเตอร์

องค์ประกอบสำคัญ

TerminalFactoryใช้สร้างจุดเริ่มต้นสำหรับค้นหาเครื่องอ่านการ์ดที่เชื่อมต่ออยู่ในระบบ
CardTerminalใช้แทนตัวเครื่องอ่านการ์ดแต่ละตัว และตรวจสอบสถานะการ์ดในเครื่องอ่าน
Card / CardChannelใช้เชื่อมต่อกับการ์ดและเป็นช่องทางในการส่งคำสั่ง APDU
APDU Commandใช้สื่อสารกับสมาร์ทการ์ด เช่น อ่านข้อมูล ทดสอบการตอบสนอง หรือเลือกแอปพลิเคชันบนการ์ด

ขั้นตอนการเชื่อมต่อกับ Smart Card Reader

1

สร้าง TerminalFactory

เริ่มต้นด้วยการเรียกใช้งาน TerminalFactory เพื่อค้นหาเครื่องอ่านการ์ดที่พร้อมใช้งานในระบบ

TerminalFactory factory = TerminalFactory.getDefault();
2

ดึงรายการเครื่องอ่านการ์ด

เมื่อได้ factory แล้ว สามารถเรียกดูรายการของเครื่องอ่านทั้งหมดผ่าน terminals().list() และตรวจสอบว่าระบบพบอุปกรณ์หรือไม่

List<CardTerminal> terminals = factory.terminals().list();
3

รอให้มีการ์ดในเครื่องอ่าน

หลังเลือกเครื่องอ่านที่ต้องการใช้งานแล้ว โปรแกรมสามารถรอจนกว่าจะมีการ์ดถูกเสียบเข้ามาในเครื่องอ่าน ก่อนเริ่มต้นการเชื่อมต่อจริง

terminal.waitForCardPresent(1000)
4

เชื่อมต่อกับการ์ดและส่ง APDU

เมื่อตรวจพบการ์ดแล้ว โปรแกรมจะเชื่อมต่อกับการ์ดผ่าน terminal.connect("*") จากนั้นดึง Basic Channel เพื่อส่งคำสั่ง APDU และรับผลตอบกลับจากการ์ด

ResponseAPDU response = channel.transmit(command);

ตัวอย่างโค้ด Java สำหรับเชื่อมต่อเครื่องอ่านและส่งคำสั่ง 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(); CommandAPDU command = new CommandAPDU(new byte[] { (byte)0x00, (byte)0x84, (byte)0x00, (byte)0x00, (byte)0x08 }); 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(); } }

ตัวอย่างคำสั่ง APDU ในบทความนี้

GET CHALLENGE

เป็นตัวอย่างคำสั่ง APDU ที่ใช้ทดสอบการสื่อสารกับการ์ด และให้การ์ดตอบข้อมูลกลับมา

00 84 00 00 08

ผลลัพธ์ที่ได้รับ

ข้อมูลตอบกลับจากการ์ดสามารถนำมาแปลงเป็นเลขฐานสิบหกด้วยฟังก์ชันช่วย เช่น bytesToHex()

System.out.println(bytesToHex(responseData));

ข้อควรทราบก่อนพัฒนาระบบจริง

  • หากนำไปอ่านบัตรประชาชนไทย ข้อมูลบางส่วนอาจต้องแปลง encoding ให้เหมาะสมเพื่อให้แสดงผลภาษาไทยได้ถูกต้อง
  • คำสั่ง APDU ที่ใช้กับการ์ดแต่ละประเภทอาจแตกต่างกัน ควรอ้างอิงเอกสารของบัตรหรือระบบที่ใช้งานจริง
  • ควรมีการตรวจสอบกรณีไม่พบเครื่องอ่าน, ไม่พบการ์ด, หรือการ์ดตอบกลับผิดรูปแบบ เพื่อให้โปรแกรมทำงานได้เสถียรยิ่งขึ้น
  • หากเป็นงานองค์กร ควรออกแบบส่วนจัดการสถานะอุปกรณ์และข้อผิดพลาดเพิ่มเติมนอกเหนือจากตัวอย่างพื้นฐาน

กำลังมองหา Smart Card Reader สำหรับพัฒนาโปรแกรม?

The Compete พร้อมให้คำแนะนำด้านเครื่องอ่านบัตรสมาร์ทการ์ด, อุปกรณ์ที่เหมาะกับการพัฒนาโปรแกรม และการประยุกต์ใช้งานในระบบยืนยันตัวตน, ระบบอ่านบัตร และระบบเฉพาะทางขององค์กร

Visitors: 121,557