ตั้งรางวัลให้กับผู้แชร์โค้ด สำหรับอ่านบัตรประจำตัวประชาชน, Reward for whom, build B4X library to read data from Smart Card Reader

Songwut K.

Member
Licensed User
เพื่อกระตุ้นอุตสาหกรรมซอฟต์แวร์ในประเทศไทย ให้สามารถพัฒนาธุรกิจในหลายๆ ด้าน เช่น โรงแรม ที่พัก ผู้ให้บริการ WiFi ฯลฯ
ให้มีความสะดวกในการรองรับลูกค้า โดยไม่ต้องถ่ายบัตรประจำตัว หรือให้พนักงานคีย์ข้อมูลเข้าด้วยตนเอง

ก็ควรมีระบบที่เสียบบัตรประชาชน แล้วพิมพ์แบบฟอร์มพร้อมกรอกข้อมูลลูกค้าออกมาพร้อมกันเลย

พวกเรานักพัฒนา B4X จำเป็นอย่างยิ่งที่จะต้องมี Library ที่รองรับ B4X ให้สามารถใช้งานกับ Hardware อ่านบัตรประจำตัวประชาชน ตามมาตรฐาน ISO 7816 Class A, AB และ C

จึงอยากขอเชิญชวนท่านผู้มีความสามารถ ช่วยแกะ Library อ่านบัตรประจำตัวประชาชน จาก github เพื่อดัดแปลงให้ใช้กับ B4X ได้


ขอเชิญทุกท่าน ช่วยกันลงขันคนละเล็กละน้อย บริจาคให้รางวัลสำหรับผู้สร้าง Library ติดต่อกับเครื่องอ่านบัตรประจำตัวประชาชน



Screenshot from 2023-10-24 16-18-15.png
 

Theera

Well-Known Member
Licensed User
Longtime User
เพื่อกระตุ้นอุตสาหกรรมซอฟต์แวร์ในประเทศไทย ให้สามารถพัฒนาธุรกิจในหลายๆ ด้าน เช่น โรงแรม ที่พัก ผู้ให้บริการ WiFi ฯลฯ
ให้มีความสะดวกในการรองรับลูกค้า โดยไม่ต้องถ่ายบัตรประจำตัว หรือให้พนักงานคีย์ข้อมูลเข้าด้วยตนเอง

ก็ควรมีระบบที่เสียบบัตรประชาชน แล้วพิมพ์แบบฟอร์มพร้อมกรอกข้อมูลลูกค้าออกมาพร้อมกันเลย

พวกเรานักพัฒนา B4X จำเป็นอย่างยิ่งที่จะต้องมี Library ที่รองรับ B4X ให้สามารถใช้งานกับ Hardware อ่านบัตรประจำตัวประชาชน ตามมาตรฐาน ISO 7816 Class A, AB และ C

จึงอยากขอเชิญชวนท่านผู้มีความสามารถ ช่วยแกะ Library อ่านบัตรประจำตัวประชาชน จาก github เพื่อดัดแปลงให้ใช้กับ B4X ได้


ขอเชิญทุกท่าน ช่วยกันลงขันคนละเล็กละน้อย บริจาคให้รางวัลสำหรับผู้สร้าง Library ติดต่อกับเครื่องอ่านบัตรประจำตัวประชาชน



View attachment 147159
ช่วยอธิบายโค้ดในภาษา javaให้หน่อยได้ไหม บางทีเราอาจแปลง โดยใช้คำสั่ง inline()ได้
 

Theera

Well-Known Member
Licensed User
Longtime User
ไม่ถนัด Java เหมือนกันครับ เลยต้องใช้ B4A
ปัญหาคือ มาตรฐานตัวอ่านบัตรประชาชนด้วยรึเปล่า บางอันอ่านด้วยซอฟต์แวร์อีกตัวหนึ่งไม่ได้ เหมือนมีข้อจำกัดอะไรบ้างอย่าง
 

Theera

Well-Known Member
Licensed User
Longtime User
ผมเห็นคนหนึ่งที่เขามีประสบการณ์การเขียนโปรแกรมอ่านบัตรประชาชนสำเร็จ ถ้าเขายอมแบ่งปันsourcecode ซึ่งเขียนด้วย vb.net ก็น่าทำได้ เขาน่าชื่อ สมพล อยู่กลุ่มในกลุ่ม B4A Thailand ด้วยครับ น่าติดต่อคนนั้นดูครับ เราอาจหาทางเขียนไลบารี่ขึ้นมาได้ ปัญหาคือนักโปรแกรมเมอร์ชาวไทย มักแตกแยก ไม่สามัคคีกัน ทำให้การพัฒนาล่าช้า
 

sanongpost

New Member
การอ่าน Thai ID card จะขึ้นอยู่กับ ประเภทของ connectivity
-USB
-bult-in such in POS

Library ก็จะต่างกันไปตามผู้ผลิต แต่อิ่ง standard protocol, ต้องเข้าใจ command code ถ้าไม่ใช้ lib

ทำแล้ว
-.NET C#
-Android POS machine (Java)
 

Theera

Well-Known Member
Licensed User
Longtime User
sanongpost เคยเขียนใช้งานมาก่อนรึเปล่าครับ เราจะเข้าใช้ภาษาJava ไหม จะได้ช่วยกันสร้างมันขึ้นมาครับ มีซอร์สโค้ดที่สมบูรณ์บ้างไหมครับ
 

sanongpost

New Member
sanongpost เคยเขียนใช้งานมาก่อนรึเปล่าครับ เราจะเข้าใช้ภาษาJava ไหม จะได้ช่วยกันสร้างมันขึ้นมาครับ มีซอร์สโค้ดที่สมบูรณ์บ้างไหมครับ
ยังไงนะครับ ผมมี c#, Java code
แต่ก่อนจะใช้อุปกรณ์พวกนี้ต้องเข้าก่อนว่า hardware ที่ใช้ต่อยังไง external หรือ OEM
ณ ตอนนี้ก็กำลังทำอ่าน ID card แบบ OEM ของ Handheld POS (android) อยู่
 

Theera

Well-Known Member
Licensed User
Longtime User
ยังไงนะครับ ผมมี c#, Java code
แต่ก่อนจะใช้อุปกรณ์พวกนี้ต้องเข้าก่อนว่า hardware ที่ใช้ต่อยังไง external หรือ OEM
ณ ตอนนี้ก็กำลังทำอ่าน ID card แบบ OEM ของ Handheld POS (android) อยู่
ผมซื้อ card reader ใน lazada ราคา 250 บาท(นานมาแล้ว) ไม่รู้ใช้งานได้หรือเปล่าครับ อยากขอซอร์สโค้ดมาทดสอบได้หรือเปล่าครับ
ก่อนอื่นต้องทดสอบภาษา Java ให้ได้ว่าทำงานอย่างไร
 

sanongpost

New Member
smartcard reader ความยากจะอยู่ที่
-connectivity: usb or direct or built-in.
-ต้องเข้าใจ protocol apdu command set ซึ่งจะเหมือน พวก modem แต่เราจะอิง sdk ที่ทาง product เขามีให้

ถ้าซื้อมาต้องถามเขาว่ามี sdk ให้ป่าว ถ้าไม่มีก็ต้องลองผิดลองถูกเอา
std lib น่าจะมีให้ลองนำมาใช้นะ
 

Theera

Well-Known Member
Licensed User
Longtime User
ลองใช้ Code นี้ดูครับ (แต่ยังเขียนโค้ดผิดอยู่) อาจมีหนทาง

B4X:
#If JAVA
import java.util.List;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;

public class Main {
    
    public static String toString(byte[] bytes) {
        StringBuilder sbTmp = new StringBuilder();
        for(byte b : bytes){
                sbTmp.append(String.format("%X", b));
        }
        return sbTmp.toString();
    }
    
    public static void main(String[] args) {
        try {
                // Show the list of available terminals
                // On Windows see HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\Readers
                TerminalFactory factory = TerminalFactory.getDefault();
                List terminals = factory.terminals().list();
                System.out.println("Terminals count: " + terminals.size());
                System.out.println("Terminals: " + terminals);

                // Get the first terminal in the list
                CardTerminal terminal = (CardTerminal) terminals.get(0);

                // Establish a connection with the card using
                // "T=0", "T=1", "T=CL" or "*"
                Card card = terminal.connect("*");
                System.out.println("Card: " + card);

                // Get ATR
                byte[] baATR = card.getATR().getBytes();
                System.out.println("ATR: " + Main.toString(baATR) );

                // Select Card Manager
                // - Establish channel to exchange APDU
                // - Send SELECT Command APDU
                // - Show Response APDU
                CardChannel channel = card.getBasicChannel();

                //SELECT Command
                // See GlobalPlatform Card Specification (e.g. 2.2, section 11.9)
                // CLA: 00
                // INS: A4
                // P1: 04 i.e. b3 is set to 1, means select by name
                // P2: 00 i.e. first or only occurence
                // Lc: 08 i.e. length of AID see below
                // Data: A0 00 00 00 03 00 00 00
                // AID of the card manager,
                // in the future should change to A0 00 00 01 51 00 00
                // อ่านค่า Select
                byte[] baCommandAPDU = {
                    (byte) 0x00, (byte) 0xA4, (byte) 0x04,
                    (byte) 0x00, (byte) 0x08, (byte) 0xA0,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x54, (byte) 0x48, (byte) 0x00,
                    (byte) 0x01
                };
                System.out.println("APDU <<<: " + Main.toString(baCommandAPDU));

                ResponseAPDU r = channel.transmit(new CommandAPDU(baCommandAPDU));
                System.out.println("APDU >>>: " + Main.toString(r.getBytes()));
                // อ่านเลขบัตรประชาชน
                byte[] command_idcard = {
                    (byte) 0x80, (byte) 0xb0, (byte) 0x00,
                    (byte) 0x04, (byte) 0x02, (byte) 0x00,
                    (byte) 0x0d
                };
                System.out.println("APDU <<<:: " + Main.toString(command_idcard));

                ResponseAPDU response_command_idcard = channel.transmit(new CommandAPDU(command_idcard));
                System.out.println("APDU >>>: " + Main.toString(response_command_idcard.getBytes()));

                byte response[] = response_command_idcard.getData();
                for (int i=0; i < response.length; i++)
                System.out.print((char)response);
                System.out.println();

                // Disconnect
                // true: reset the card after disconnecting card.
                card.disconnect(true);

        }
        catch(CardException ex)  {
        }
    }
    
}
#End If
 
Last edited:

chakkaran

New Member
พอดีค้นมาเจอครับ เลยเพิ่งรู้จัก b4x น่าสนใจครับ แล้วตอนนี้มีไลบารี่อ่านบ้ตรประชาชนหรือยังครับ
 

Theera

Well-Known Member
Licensed User
Longtime User
พอดีค้นมาเจอครับ เลยเพิ่งรู้จัก b4x น่าสนใจครับ แล้วตอนนี้มีไลบารี่อ่านบ้ตรประชาชนหรือยังครับ
เขียนภาษาจาวาเป็นไหม ตอนนี้ทำงานหรือเรียนอยู่ที่ไหน
 

chakkaran

New Member
เขียนภาษาจาวาเป็นไหม ตอนนี้ทำงานหรือเรียนอยู่ที่ไหน
เป็นฟรีแลนซ์ครับ java ได้เล็กน้อยแค่แก้ไขนะครับ แต่เคยเขียน vb มาก่อน เห็นว่า b4x ใช้ภาษา basic ผมเข้าใจเรื่องอ่านบัตรประชาขน เคยเขียนแปลงจาก Delphi เป็น php ก็เลยลองๆถามนะครับ คิดว่าผมเขียนไลบารี่สำหรับ b4x น่าจะได้อยู่
 

Theera

Well-Known Member
Licensed User
Longtime User
เป็นฟรีแลนซ์ครับ java ได้เล็กน้อยแค่แก้ไขนะครับ แต่เคยเขียน vb มาก่อน เห็นว่า b4x ใช้ภาษา basic ผมเข้าใจเรื่องอ่านบัตรประชาขน เคยเขียนแปลงจาก Delphi เป็น php ก็เลยลองๆถามนะครับ คิดว่าผมเขียนไลบารี่สำหรับ b4x น่าจะได้อยู่
ส่วนตัวผมไม่เก่งการเขียนโปรแกรมเลย เข้ามานี่เพื่อศึกษาการเขียนโค้ด และพยายามแนะนำ B4X ให้แก่โปรแกรมเมอร์คนไทย ให้หันมาเรียนภาษานี้กันเยอะๆ
 

Eric Baker

Member
Licensed User
Longtime User
ผมเพิ่งสั่งซื้อเครื่องอ่านบัตร "USB SmartFold" ผมจะดูว่าผมสามารถทำอะไรได้บ้างเพื่ออ่านบัตรประจำตัวของไทยและ B4J ขอโทษด้วยนะครับ ภาษาไทยของผมไม่ค่อยดีเท่าไหร่ครับ
 

ofc500k

New Member
Licensed User
Longtime User
B4A อ่านบัตรประชาชนได้จริงครับ ผมใช้อยู่ แต่ code ไม่สามารถเปิดเผยได้ครับเพราะทำกันเป็นทีม
 
Top