ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 1475|ตอบกลับ: 1

[VB.NET] แจกฟรีโค้ดการอ่านข้อมูลบัตรประชาชนจาก Smart Card Reader

[คัดลอกลิงก์]

252

กระทู้

370

โพสต์

3094

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3094



มันเป็นศาสตร์อันดำมืดมาอย่างยาวนาน เพราะแอดมินค้นหาข้อมูลหรือโค้ด VB.NET ในการติดต่อกับเครื่องอ่านบัตรประชาชน หรือ Smart Card Reader ไม่เจอเลย แอดมินเลยตัดสินใจลองสั่งซื้อเครื่องอ่านบัตรสมาร์ทการ์ดในราคา 550 บาทมาลองเล่นดู (ทั้งๆที่ไม่มีโครงการใดๆกับเครื่องอ่านบัตรเลย แฮ่ๆๆๆ+) โดยใช้ Library ของคุณ Chakphanu Komasathit (ดาวน์โหลดไฟล์ต้นฉบับ C# จาก GitHub ได้ที่นี่) ... แอดมินแปลงโค้ด C# ที่อยู่ในไฟล์ชุดตัวอย่างของผู้พัฒนาให้เป็น VB แทนครับ และเพิ่มเติมเทคนิคในการอ่านบัตรประชาชนให้ไปทำงานอยู่เบื้องหลังแทน ด้วยการใช้ BackGroundWorker นั่นหมายความว่าเราจะสามารถขยับฟอร์มไปมาได้ โดยไม่มีการหน้าจอค้างครับผม ...

แอดมินแนะนำให้ลองหายี่ห้อ WAC กะ Zoweetek ราคาสัก 2 ร้อยกว่าๆมาใช้งานดูก็น่าจะทำงานได้เหมือนกันครับ หาซื้อได้ทั้งที่ Shopee หรือ Lazada สำหรับรุ่นที่แอดมินใช้ สั่งซื้อจากที่นี่ครับ ...

DOWNLOAD FULL SOURCE CODE (VB.NET-2010)
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) โดยการใช้ .Net Framework 4.0 ได้ที่นี่ ...





การติดตั้ง Library หรือไฟล์ DLL ผ่านทาง Tools --> NuGet Package Manager --> Manage NuGet Packages for Solution ...


หรือเลือกการเบราซ์หาไฟล์ด้วยการ Add References ...


มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. ' / Special Thanks.
  2. ' / https://github.com/chakphanu/ThaiNationalIDCard

  3. Imports ThaiNationalIDCard
  4. Imports System.ComponentModel

  5. Public Class frmSmartCard

  6.     Dim bgWorker As New BackgroundWorker

  7.     Private Sub frmSmartCard_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
  8.         Select Case e.KeyCode
  9.             Case Keys.F7
  10.                 Call btnRead_Click(sender, e)
  11.             Case Keys.F10
  12.                 Me.Close()
  13.         End Select
  14.     End Sub

  15.     Private Sub frmSmartCard_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  16.         Call SetupScreen()
  17.         '// Detect Smart card reader.
  18.         If Not GetReader() Then Return
  19.         ProgressBar1.Visible = False
  20.         '// Initialized BackGroundWorker
  21.         With bgWorker
  22.             .WorkerReportsProgress = True
  23.             .WorkerSupportsCancellation = True
  24.         End With
  25.         '// *********** IMPORTANT ***********
  26.         Control.CheckForIllegalCrossThreadCalls = False
  27.         '// Add Event Handler.
  28.         AddHandler bgWorker.DoWork, AddressOf bgWorker_DoWork
  29.         AddHandler bgWorker.RunWorkerCompleted, AddressOf bgWorker_RunWorkerCompleted
  30.     End Sub

  31.     '// ตรวจสอบเครื่องอ่านบัตรว่ามีอยู่หรือไม่
  32.     Function GetReader() As Boolean
  33.         Try
  34.             Dim ID As New ThaiIDCard
  35.             Dim readers = ID.GetReaders
  36.             If readers Is Nothing Then
  37.                 Return False
  38.             Else
  39.                 Return True
  40.             End If
  41.         Catch ex As Exception
  42.             MessageBox.Show("Smart Card Reader not found.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  43.             Return False
  44.         End Try
  45.     End Function

  46.     Private Sub btnRead_Click(sender As System.Object, e As System.EventArgs) Handles btnRead.Click
  47.         Call SetupScreen()
  48.         If Not GetReader() Then Return
  49.         btnRead.Enabled = False
  50.         '/
  51.         ProgressBar1.Style = ProgressBarStyle.Marquee
  52.         ProgressBar1.Visible = True
  53.         '// BackGroundWorker
  54.         bgWorker.RunWorkerAsync()
  55.     End Sub

  56.     Private Sub bgWorker_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs)
  57.         Try
  58.             '// -------------------------------------------
  59.             '// โค้ดส่วนของการอ่านข้อมูลบัตรประชาชน
  60.             Dim ID As New ThaiIDCard
  61.             Refresh()
  62.             Dim Personal As Personal = ID.readAllPhoto
  63.             If Not IsNothing(Personal) Then
  64.                 With Personal
  65.                     txtIDCard.Text = .Citizenid
  66.                     txtPrefixThai.Text = .Th_Prefix
  67.                     txtPrefixEng.Text = .En_Prefix
  68.                     txtFirstNameThai.Text = .Th_Firstname
  69.                     txtLastnameThai.Text = .Th_Lastname
  70.                     txtFirstNameEng.Text = .En_Firstname
  71.                     txtLastnameEng.Text = .En_Lastname
  72.                     txtBirthDate.Text = Format(CDate(.Birthday.ToString), "dd/MM/yyyy")
  73.                     '// คำนวณอายุ
  74.                     If Not IsNothing(txtBirthDate.Text) Then lblAge.Text = CalcDate(txtBirthDate.Text, Now())
  75.                     '// 1 = ชาย, 2 = หญิง (นำไปแปลงค่าเพศในฟังค์ชั่นก่อน)
  76.                     txtSex.Text = CheckSex(.Sex, txtSex).ToString
  77.                     txtIssueDate.Text = Format(CDate(.Issue.ToString), "dd/MM/yyyy")
  78.                     txtExpireDate.Text = Format(CDate(.Expire.ToString), "dd/MM/yyyy")
  79.                     '// ที่อยู่
  80.                     txtHouseNo.Text = .addrHouseNo
  81.                     txtVillageNo.Text = .addrVillageNo
  82.                     txtLane.Text = .addrLane
  83.                     txtRoad.Text = .addrRoad
  84.                     txtTambol.Text = .addrTambol
  85.                     txtAmphur.Text = .addrAmphur
  86.                     txtProvince.Text = .addrProvince
  87.                     '// รูปภาพ
  88.                     picData.Image = .PhotoBitmap
  89.                 End With
  90.                 '// -------------------------------------------
  91.                 '//
  92.             ElseIf (ID.ErrorCode() > 0) Then
  93.                 MessageBox.Show(ID.Error)
  94.             Else
  95.                 MessageBox.Show("Catch All", "รายงานความผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  96.             End If
  97.         Catch ex As Exception
  98.             MessageBox.Show(ex.Message)
  99.         End Try
  100.         btnRead.Enabled = True
  101.     End Sub

  102.     '// Reading complete.
  103.     Private Sub bgWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
  104.         ProgressBar1.Visible = False
  105.         'MessageBox.Show("Done Complete.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
  106.     End Sub

  107.     Function CheckSex(ByVal sex As Byte, ByRef txt As TextBox) As String
  108.         '// เก็บค่าตัวเลขไว้ใน Tag เผื่อไว้ตอนไปเก็บลงในฐานข้อมูล [กำหนดให้ ชาย=1 หญิง=2]
  109.         txt.Tag = sex
  110.         If sex = 1 Then
  111.             CheckSex = "ชาย"
  112.         Else
  113.             CheckSex = "หญิง"
  114.         End If
  115.     End Function

  116.     '// เคลียร์หน้าจอทั้งหมด
  117.     Sub SetupScreen()
  118.         '// หรือสั่งลูปเคลียร์ TextBox Control ทั้งหมดที่มีอยู่บนฟอร์ม
  119.         For Each tb As TextBox In Me.GroupBox1.Controls.OfType(Of TextBox)()
  120.             tb.Clear()
  121.         Next
  122.         picData.Image = Nothing
  123.     End Sub

  124.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  125.         Me.Close()
  126.     End Sub

  127.     Private Sub frmSmartCard_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  128.         Me.Dispose()
  129.         GC.SuppressFinalize(Me)
  130.         Application.Exit()
  131.     End Sub

  132.     ' / --------------------------------------------------------------------------------
  133.     ' / ฟังค์ชั่นในการคำนวณหาความแตกต่างระหว่างวันเดือนปี (คำนวณหาอายุ)
  134.     ' / คัดลอกโค้ดทั้งหมดมาจาก VB6
  135.     Public Function CalcDate(sDate As Date, eDate As Date) As String
  136.         Dim vDays As Integer
  137.         Dim vMonths As Integer
  138.         Dim vYears As Integer
  139.         '/ Parameters:
  140.         '/    sDate - ค่าวันเดือนปีเกิด (หรือวันเดือนปีที่ต้องการคำนวณหา)
  141.         '/    eDate - คำนวณเทียบกับวันเดือนปีปัจจุบัน (Now())
  142.         '/ Results:
  143.         '/    vYears - เก็บค่าความแตกต่างของจำนวนปี
  144.         '/    vMonths - เก็บค่าความแตกต่างของจำนวนเดือน
  145.         '/    vDays - เก็บค่าความแตกต่างของจำนวนวัน

  146.         '/ หาความแตกต่างของจำนวนเดือน
  147.         vMonths = DateDiff("m", sDate, eDate)
  148.         vDays = DateDiff("d", DateAdd("m", vMonths, sDate), eDate)
  149.         If vDays < 0 Then
  150.             vMonths = vMonths - 1
  151.             vDays = DateDiff("d", DateAdd("m", vMonths, sDate), eDate)
  152.         End If
  153.         vYears = vMonths \ 12 ' หารตัดเศษก็จะได้จำนวนปี
  154.         vMonths = vMonths Mod 12 ' การหารเอาเศษ โดยจะมีค่าระหว่าง 0, 1, 2, ... 11 ไม่มีทางเท่ากับ หรือ มากกว่า 12
  155.         CalcDate = "อายุ: " & vYears & " ปี " & vMonths & " เดือน " & vDays & " วัน."
  156.     End Function

  157. End Class
คัดลอกไปที่คลิปบอร์ด


สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

1

กระทู้

8

โพสต์

103

เครดิต

Member

Rank: 2

เครดิต
103
โพสต์ 2020-5-4 21:58:28 | ดูโพสต์ทั้งหมด

กราบขอบพระคุณมากครับอาจารย์

0

กระทู้

1

โพสต์

54

เครดิต

Member

Rank: 2

เครดิต
54
โพสต์ 6 วันที่แล้ว | ดูโพสต์ทั้งหมด


ขอบคุณมากครับ...หามานานมากเลย ครับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2020-10-1 12:36 , Processed in 0.426520 second(s), 4 queries , File On.

Powered by Discuz! X3.3 R20170401, Rev.54

© 2001-2017 Comsenz Inc.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้