python บัตรปชช
https://gist.github.com/bouroo/8b34daf5b7deed57ea54819ff7aeef6e
https://linuxhint.com/install-python-pip-ubuntu-22-04/
pip3 install resize-image
pip3 install xlsxwriter
pip3 install pypng
pip3 install pyqrcode
if no beep
sudo apt install beep
First run sudo modprobe pcspkr and then beep should work.
tk.tk().bell()
print('\007')
git clone urlxxx
git log
git pull
git diff
git status -s
git add filexxx
git commit -m "xxxxxxxx"
git push origin master
if git pull error
git reset --hard HEAD and then git pull again
sudo apt-get -y install python3-pip
python2 -m pip install xxxx
python3 -m pip install xxxx
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py
python --version # (this will reflect your choice, see above) python3 --version $(head -1 `which pip` | tail -c +3) --version $(head -1 `which pip3` | tail -c +3) --version
sudo apt-get install python-tk
sudo apt-get install python3-tk
sudo apt install libpython3.8-dev python3.8-dev
sudo apt install libpcsclite-dev
pip3 install --upgrade pyscard
sudo apt-get install pcscd python-pyscard
sudo apt-get install python3-pyscard
sudo apt-get install python-pip
pip install reportlab
sudo apt install python-testresources
sudo apt-get install python-mysqldb
sudo apt-get install python3-mysql.connector
sudo apt-get install python-mysql.connector
pip install --user mysql-connector-python
sudo apt-get install python-imaging python-imaging-tk
sudo apt install python-pil # for python 2.X
and/or...
python3 -m pip install reportlab
python3 -m pip install pyscard
python3 -m pip install Pillow
or
sudo apt install python3-pil # for python 3.X including python3.6
python3.7 -m pip install pillow
sudo apt install python3-pil.imagetk
pip install pyqrcode --user
pip install pypng --user
pip3 install pyqrcode --user
pip3 install pypng --user
how to downgrade pip # pip10 still bug dont upgrade pip
python -m pip install pip==9.0.1
if no module configparser
pip install configparser --user
After updating pip using pip install -U pip,
$pip --version error
bash: /home/kri/.local/bin/pip: No such file or directory
$type pip
pip is hashed (/home/kri/.local/bin/pip)
to repair
$ hash -r
When the cache is clear, pip is working again.
If you're using Ubuntu 16.04 LTS, you'll need to use a PPA:
sudo add-apt-repository ppa:jonathonf/python-3.6 # (only for 16.04 LTS)
Then, run the following (this works out-of-the-box on 16.10 and 17.04):
sudo apt update
sudo apt install python3.6 sudo apt install python3.6-dev sudo apt install python3.6-venv wget https://bootstrap.pypa.io/get-pip.py sudo python3.6 get-pip.py sudo ln -s /usr/bin/python3.6 /usr/local/bin/python3 sudo ln -s /usr/local/bin/pip /usr/local/bin/pip3 # Do this only if you want python3 to be the default Python# instead of python2 (may be dangerous, esp. before 2020):# sudo ln -s /usr/bin/python3.6 /usr/local/bin/python
python --version # (this will reflect your choice, see above) python3 --version $(head -1 `which pip` | tail -c +3) --version $(head -1 `which pip3` | tail -c +3) --version
#python camera install
python -m pip install numpy
python -m pip install opencv-python
$ sudo apt-get update
$ sudo apt-get install build-essential cmake
$ sudo apt-get install libopenblas-dev liblapack-dev
$ sudo apt-get install libx11-dev libgtk-3-dev
$ sudo apt-get install python python-dev python-pip
$ sudo apt-get install python3 python3-dev python3-pip
python -m pip install dlib
python -m pip install face_recognition
python -m pip install matplotlib
python -m pip install scipy
python -m pip install scikit-image # แทน skimage
#! /usr/bin/env python
# Jane.
# 2013-11-08 (Y-m-d)
# apt-get install pcscd python-pyscard
from smartcard.System import readers
import binascii
# Thailand ID Smartcard
# define the APDUs used in this script
# Reset
SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]
# CID
COMMAND1 = [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d]
COMMAND2 = [0x00, 0xc0, 0x00, 0x00, 0x0d]
# Fullname Thai + Eng + BirthDate + Sex
COMMAND3 = [0x80, 0xb0, 0x00, 0x11, 0x02, 0x00, 0xd1]
COMMAND4 = [0x00, 0xc0, 0x00, 0x00, 0xd1]
# Address
COMMAND5 = [0x80, 0xb0, 0x15, 0x79, 0x02, 0x00, 0x64]
COMMAND6 = [0x00, 0xc0, 0x00, 0x00, 0x64]
# issue/expire
COMMAND7 = [0x80, 0xb0, 0x01, 0x67, 0x02, 0x00, 0x12]
COMMAND8 = [0x00, 0xc0, 0x00, 0x00, 0x12]
# get all the available readers
r = readers()
print "Available readers:", r
reader = r[0]
print "Using:", reader
connection = reader.createConnection()
connection.connect()
# Reset
data, sw1, sw2 = connection.transmit(SELECT)
print data
print "Select Applet: %02X %02X" % (sw1, sw2)
data, sw1, sw2 = connection.transmit(COMMAND1)
print data
print "Command1: %02X %02X" % (sw1, sw2)
# CID
data, sw1, sw2 = connection.transmit(COMMAND2)
print data
for d in data:
print chr(d),
print "Command2: %02X %02X" % (sw1, sw2)
# Fullname Thai + Eng + BirthDate + Sex
data, sw1, sw2 = connection.transmit(COMMAND3)
print data
print "Command3: %02X %02X" % (sw1, sw2)
data, sw1, sw2 = connection.transmit(COMMAND4)
print data
for d in data:
print unicode(chr(d),"tis-620"),
print "Command4: %02X %02X" % (sw1, sw2)
# Address
data, sw1, sw2 = connection.transmit(COMMAND5)
print data
print "Command5: %02X %02X" % (sw1, sw2)
data, sw1, sw2 = connection.transmit(COMMAND6)
print data
for d in data:
print unicode(chr(d),"tis-620"),
print "Command6: %02X %02X" % (sw1, sw2)
# issue/expire
data, sw1, sw2 = connection.transmit(COMMAND7)
print data
print "Command7: %02X %02X" % (sw1, sw2)
data, sw1, sw2 = connection.transmit(COMMAND8)
print data
for d in data:
print unicode(chr(d),"tis-620"),
print "Command8: %02X %02X" % (sw1, sw2)
ในการตรวจสอบเลขที่บัตรประชาชนนั้นทำได้โดยการใช้ Check Digit โดยใช้ตัวเลขหลักสุดท้ายในการตรวจสอบ Algorithm ของวิธีการใช้ Check Digit มีดังนี้
ตัวเลขบนบัตรประชาชนจะมีทั้งหมด 13 หลัก นำเลขใน 12 หลักแรก มาคูณกับเลขประจำตำแหน่ง (เลขประจำหลักได้แก่ 13 บวก 1 ลบด้วยตำแหน่งที่) จะได้ตัวเลขประจำตำแหน่งดังนี้
หลังจากนั้นเอาผลคูณของทั้ง 12 หลักมารวมกัน แล้วหารเอาเศษด้วย 11
เอาเศษที่ได้จากการหารในข้อ 2 มาลบด้วย 11 เท่านี้ก็ได้เลขที่เป็น Check Digit แล้ว (ถ้าผลจากข้อ 2 ได้ 10 ให้เอาเลขหลักหน่วยเป็น Check Digit ก็คือ 0 นั่นเอง)
ตัวอย่าง 1-2345-67890-12-1
นำไปคูณเลขประจำตำแหน่ง : (1*13)+(2*12)+(3*11)+(4*10)+(5*9)+(6*8)+(7*7)+(8*6)+(9*5)+(0*4)+(1*3)+(2*2) = 352
หารเอาเศษด้วย : 11 352%11= 0
นำ 11 ตั้งแล้วลบเศษที่ได้จากการหารในข้อ 2 : 11 – 0 = 11 (เอาเลขหลักหน่วย) ดังนั้น Check Digit คือ 1
จะได้ : 1-2345-67890-12-1
#!/usr/bin/env python
# bouroo
# 18.08.2017
# sudo apt-get -y install pcscd python-pyscard python-imaging
import os
import io
import Image
import binascii
from smartcard.System import readers
from smartcard.util import HexListToBinString, toHexString, toBytes
# Thailand ID Smartcard
# tis-620 to utf-8
def thai2unicode(data):
result = ''
if isinstance(data, list):
for d in data:
result += unicode(chr(d),"tis-620")
else :
result = data.decode("tis-620").encode("utf-8")
return result.strip();
def getData(cmd, req = [0x00, 0xc0, 0x00, 0x00]):
data, sw1, sw2 = connection.transmit(cmd)
data, sw1, sw2 = connection.transmit(req + [cmd[-1]])
return [data, sw1, sw2];
# define the APDUs used in this script
# https://github.com/chakphanu/ThaiNationalIDCard/blob/master/APDU.md
# Check card
SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08]
THAI_CARD = [0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]
# CID
CMD_CID = [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d]
# TH Fullname
CMD_THFULLNAME = [0x80, 0xb0, 0x00, 0x11, 0x02, 0x00, 0x64]
# EN Fullname
CMD_ENFULLNAME = [0x80, 0xb0, 0x00, 0x75, 0x02, 0x00, 0x64]
# Date of birth
CMD_BIRTH = [0x80, 0xb0, 0x00, 0xD9, 0x02, 0x00, 0x08]
# Gender
CMD_GENDER = [0x80, 0xb0, 0x00, 0xE1, 0x02, 0x00, 0x01]
# Card Issuer
CMD_ISSUER = [0x80, 0xb0, 0x00, 0xF6, 0x02, 0x00, 0x64]
# Issue Date
CMD_ISSUE = [0x80, 0xb0, 0x01, 0x67, 0x02, 0x00, 0x08]
# Expire Date
CMD_EXPIRE = [0x80, 0xb0, 0x01, 0x6F, 0x02, 0x00, 0x08]
# Address
CMD_ADDRESS = [0x80, 0xb0, 0x15, 0x79, 0x02, 0x00, 0x64]
# Photo_Part1/20
CMD_PHOTO1 = [0x80, 0xb0, 0x01, 0x7B, 0x02, 0x00, 0xFF]
# Photo_Part2/20
CMD_PHOTO2 = [0x80, 0xb0, 0x02, 0x7A, 0x02, 0x00, 0xFF]
# Photo_Part3/20
CMD_PHOTO3 = [0x80, 0xb0, 0x03, 0x79, 0x02, 0x00, 0xFF]
# Photo_Part4/20
CMD_PHOTO4 = [0x80, 0xb0, 0x04, 0x78, 0x02, 0x00, 0xFF]
# Photo_Part5/20
CMD_PHOTO5 = [0x80, 0xb0, 0x05, 0x77, 0x02, 0x00, 0xFF]
# Photo_Part6/20
CMD_PHOTO6 = [0x80, 0xb0, 0x06, 0x76, 0x02, 0x00, 0xFF]
# Photo_Part7/20
CMD_PHOTO7 = [0x80, 0xb0, 0x07, 0x75, 0x02, 0x00, 0xFF]
# Photo_Part8/20
CMD_PHOTO8 = [0x80, 0xb0, 0x08, 0x74, 0x02, 0x00, 0xFF]
# Photo_Part9/20
CMD_PHOTO9 = [0x80, 0xb0, 0x09, 0x73, 0x02, 0x00, 0xFF]
# Photo_Part10/20
CMD_PHOTO10 = [0x80, 0xb0, 0x0A, 0x72, 0x02, 0x00, 0xFF]
# Photo_Part11/20
CMD_PHOTO11 = [0x80, 0xb0, 0x0B, 0x71, 0x02, 0x00, 0xFF]
# Photo_Part12/20
CMD_PHOTO12 = [0x80, 0xb0, 0x0C, 0x70, 0x02, 0x00, 0xFF]
# Photo_Part13/20
CMD_PHOTO13 = [0x80, 0xb0, 0x0D, 0x6F, 0x02, 0x00, 0xFF]
# Photo_Part14/20
CMD_PHOTO14 = [0x80, 0xb0, 0x0E, 0x6E, 0x02, 0x00, 0xFF]
# Photo_Part15/20
CMD_PHOTO15 = [0x80, 0xb0, 0x0F, 0x6D, 0x02, 0x00, 0xFF]
# Photo_Part16/20
CMD_PHOTO16 = [0x80, 0xb0, 0x10, 0x6C, 0x02, 0x00, 0xFF]
# Photo_Part17/20
CMD_PHOTO17 = [0x80, 0xb0, 0x11, 0x6B, 0x02, 0x00, 0xFF]
# Photo_Part18/20
CMD_PHOTO18 = [0x80, 0xb0, 0x12, 0x6A, 0x02, 0x00, 0xFF]
# Photo_Part19/20
CMD_PHOTO19 = [0x80, 0xb0, 0x13, 0x69, 0x02, 0x00, 0xFF]
# Photo_Part20/20
CMD_PHOTO20 = [0x80, 0xb0, 0x14, 0x68, 0x02, 0x00, 0xFF]
# get all the available readers
r = readers()
print "Available readers:", r
reader = r[0]
print "Using:", reader
connection = reader.createConnection()
connection.connect()
atr = connection.getATR()
print "ATR: " + toHexString(atr)
if (atr[0] == 0x3B & atr[1] == 0x67):
req = [0x00, 0xc0, 0x00, 0x01]
else :
req = [0x00, 0xc0, 0x00, 0x00]
# Check card
data, sw1, sw2 = connection.transmit(SELECT + THAI_CARD)
print "Select Applet: %02X %02X" % (sw1, sw2)
# CID
data = getData(CMD_CID, req)
cid = thai2unicode(data[0])
print "CID: " + cid
# TH Fullname
data = getData(CMD_THFULLNAME, req)
print "TH Fullname: " + thai2unicode(data[0])
# EN Fullname
data = getData(CMD_ENFULLNAME, req)
print "EN Fullname: " + thai2unicode(data[0])
# Date of birth
data = getData(CMD_BIRTH, req)
print "Date of birth: " + thai2unicode(data[0])
# Gender
data = getData(CMD_GENDER, req)
print "Gender: " + thai2unicode(data[0])
# Card Issuer
data = getData(CMD_ISSUER, req)
print "Card Issuer: " + thai2unicode(data[0])
# Issue Date
data = getData(CMD_ISSUE, req)
print "Issue Date: " + thai2unicode(data[0])
# Expire Date
data = getData(CMD_EXPIRE, req)
print "Expire Date: " + thai2unicode(data[0])
# Address
data = getData(CMD_ADDRESS, req)
print "Address: " + thai2unicode(data[0])
# PHOTO
photo = getData(CMD_PHOTO1, req)[0]
photo += getData(CMD_PHOTO2, req)[0]
photo += getData(CMD_PHOTO3, req)[0]
photo += getData(CMD_PHOTO4, req)[0]
photo += getData(CMD_PHOTO5, req)[0]
photo += getData(CMD_PHOTO6, req)[0]
photo += getData(CMD_PHOTO7, req)[0]
photo += getData(CMD_PHOTO8, req)[0]
photo += getData(CMD_PHOTO9, req)[0]
photo += getData(CMD_PHOTO10, req)[0]
photo += getData(CMD_PHOTO11, req)[0]
photo += getData(CMD_PHOTO12, req)[0]
photo += getData(CMD_PHOTO13, req)[0]
photo += getData(CMD_PHOTO14, req)[0]
photo += getData(CMD_PHOTO15, req)[0]
photo += getData(CMD_PHOTO16, req)[0]
photo += getData(CMD_PHOTO17, req)[0]
photo += getData(CMD_PHOTO18, req)[0]
photo += getData(CMD_PHOTO19, req)[0]
photo += getData(CMD_PHOTO20, req)[0]
data = HexListToBinString(photo)
f = open(cid + ".jpg", "wb")
f.write(data)
f.close
รหัสประเทศไทยตามมาตรฐาน ISO 3166 คือ 764 ครับ หรือถ้าเป็นตัวอักษร 2 หลักก็คือ TH
และแบบตัวอักษร 3 หลักคือ THA
นอกจากนี้ ISO 3166-2:TH ยังระบุรหัสจังหวัดไว้ด้วย ซึ่งก็สอดคล้องกับรหัสของกระทรวง
มหาดไทยตาม #2 เช่น
TH-10 = กรุงเทพ
TH-55 = น่าน
ประเภทใบอนุญาต
Type of Driving Licence
รวมใบอนุญาตทั้งสิ้น
Grand Total
ก. รวมใบอนุญาตขับรถตามกฎหมายว่าด้วยรถยนต์
Total Driving Licence under Motor Vehicle Act
1. ใบอนุญาตขับรถยนต์ส่วนบุคคลชั่วคราว Private Automobile (Temporary)
2. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคลชั่วคราว Private Motor Tricycle (Temporary)
3. ใบอนุญาตขับรถจักรยานยนต์ชั่วคราว Motorcycle (Temporary)
4. ใบอนุญาตขับรถยนต์ส่วนบุคคลหนึ่งปี Private Automobile (One Year)
5. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคลหนึ่งปี Private Motor Tricycle (One Year)
6. ใบอนุญาตขับรถจักรยานยนต์หนึ่งปี Motorcycle (One Year)
7. ใบอนุญาตขับรถยนต์ส่วนบุคคล Private Automobile (Five Years)
8. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคล Private Motor Tricycle (Five Years)
9. ใบอนุญาตขับรถจักรยานยนต์ Motorcycle (Five Years)
10. ใบอนุญาตขับรถยนต์ส่วนบุคคลตลอดชีพ Private Automobile (Life)
11. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคลตลอดชีพ Motor Tricycle (Life)
12. ใบอนุญาตขับรถจักรยานยนต์ตลอดชีพ Motorcycle (Life)
13. ใบอนุญาตขับรถยนต์สาธารณะ Public Automobile
14. ใบอนุญาตขับรถยนต์สามล้อสาธารณะ Public Motor Tricycle
15. ใบอนุญาตขับรถจักรยานยนต์สาธารณะ Public Motorcycle
16. ใบอนุญาตขับรถระหว่างประเทศ International Driving Licence
17. ใบอนุญาตขับรถบดถนน Tractor
18. ใบอนุญาตขับรถแทรกเตอร์ Tractor Driving Licence
19. ใบอนุญาตขับรถใช้งานเกษตรกรรม Farm Vehicle Driving Licence
20. ใบอนุญาตขับรถอื่นๆ Others Driving Licence
ข. รวมใบอนุญาตผู้ประจำรถตามกฎหมายว่าด้วยการขนส่งทางบก
Total Transport Personnel Licence under Land Transport Act
1. ผู้ขับรถ Driver Licence
แยกเป็น - ชนิดที่ 1 Truck & Bus (Class I)
- ชนิดที่ 2 Truck & Bus (Class II)
- ชนิดที่ 3 Truck & Bus (Class III)
- ชนิดที่ 4 Truck & Bus (Class IV)
2. นายตรวจ Inspector Licence
3. ผู้เก็บค่าโดยสาร Conductor Licence
4. ผู้บริการ Bus Hostess
ค. รวมใบอนุญาตขับขี่ล้อเลื่อน (Total Driving Licence under Non Motorized Vehicle Act)
ชนิดของใบขับขี่ตามกฎหมายว่าด้วยรถยนต์
กำลังหัดใช้ Python 3 ใน Linux mint อ่านชื่อภาษาไทยจากบัตรประชาชนทีละ byte ผ่านเครื่องอ่าน smart card แต่มันเป็น single byte ตามคำสั่งด้านล่าง โดยส่ง item เป็นตำแหน่งชื่อภาษาไทย ปัญหาตรง result มันไม่ใช่ utf-8 ครับ
def readSmatcard(self, item):
response, sw1, sw2 = self.cardservice.connection.transmit( item )
if not sw1 == 0x61:
return 'n/a'
GET_RESPONSE = [0X00, 0XC0, 0x00, 0x00 ]
apdu = GET_RESPONSE + [sw2]
response, sw1, sw2 = self.cardservice.connection.transmit( apdu )
result = ''
for i in response:
result += chr(i)
return result.strip()
ค่าที่อ่านได้จากบัตรเป็นอย่างไรครับ เช่น ก เท่ากับ 161 หรือเปล่า ถ้าใช่ก็แปลว่าค่าที่อ่านออกมาเป็น tis-620 หรือ iso-8859-11
วิธีแปลงเป็น unicode string ให้สร้าง bytearray จากค่าที่อ่านได้ทั้งหมดก่อน จากนั้นก็ decode ด้วย encoding 'thai' ค่าที่ได้จะเป็น unicode string แล้วครับ ตัวอย่าง
สร้าง bytearray ที่ a[0] = 0xA1 หรือตัว ก ตาม tis-620
>>> a = bytearray.fromhex('a1')
>>> a
bytearray(b'\xa1')
แปลง bytearray a เป็น string ด้วยคำสั่ง decode
>>> b = a.decode('thai')
b เป็น string 'ก'
>>> b
'ก'
b เป็น unicode (b[0] เท่ากับ 3585 หรือ 0x0E01 ซึ่งเป็นรหัส ก ตาม unicode)
>>> ord(b)
3585
แต่ถ้าอ่าน byte ออกมาเป็น encoding แบบอื่น ก็ทำแบบเดียวกันครับ จับมาเรียงใส่ bytearray แล้วก็ decode ออกมาด้วย encoding แบบนั้นๆ
ผมเขียนเรื่องนี้สำหรับเป็น guideline สำหรับคนที่อยากอ่านข้อมูลในบัตรประชาชนนะครับ
ข้อมูลทั้งหมดได้มาจากคุณพุฒิพงศ์ ซึ่งเป็นคนพัฒนาโปรแกรม นี้ ครับ
ผมเมลไปถามแกหน้าด้าน ๆ เลยครับว่าทำยังไง แกก็ตอบมาแบบละเอียดเลยครับ
เลยไหน ๆ ก็ไหน ๆ ละขอเขียนทิ้งไว้ก็แล้วกันครับเผื่อมีคนอยากทราบวิธี
ผมใช้ lib ของ python pyscard ครับ วิธีการใช้ดูจาก documentation เลยครับ
ตัวอย่างเป็นการอ่านข้อมูลในส่วน public ของ smart card
# -*- coding: cp874 -*-
from smartcard.CardConnection import CardConnection
from smartcard.CardType import AnyCardType
from smartcard.CardRequest import CardRequest
from smartcard.util import toHexString, toBytes
import ธรรมดาครับ
cardtype = AnyCardType()
cardrequest = CardRequest( timeout=1, cardType=cardtype )
cardservice = cardrequest.waitforcard()
cardservice.connection.connect()
เชื่อมต่อไปยัง reader ดูว่ามีการ์ดเสียบอยู่นะ
SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08]
THAI_ID_CARD = [0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]
REQ_CID = [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d]
REQ_THAI_NAME = [0x80, 0xb0, 0x00, 0x11, 0x02, 0x00, 0x64]
REQ_ENG_NAME = [0x80, 0xb0, 0x00, 0x75, 0x02, 0x00, 0x64]
REQ_GENDER = [0x80, 0xb0, 0x00, 0xE1, 0x02, 0x00, 0x01]
REQ_DOB = [0x80, 0xb0, 0x00, 0xD9, 0x02, 0x00, 0x08]
REQ_ADDRESS = [0x80, 0xb0, 0x15, 0x79, 0x02, 0x00, 0x64]
REQ_ISSUE_EXPIRE = [0x80, 0xb0, 0x01, 0x67, 0x02, 0x00, 0x12]
DATA = [REQ_CID,REQ_THAI_NAME,REQ_ENG_NAME,REQ_GENDER,REQ_DOB,
REQ_ADDRESS,REQ_ISSUE_EXPIRE]
ตรงนี้เป็นคำสั่งในการขอข้อมูลครับ คือ ขั้นตอนการขอข้อมูลจากการ์ดจะเป็น
1. ฉันจะอ่านบัตรประชาชนนะนายใช่บัตรประชาชนรึเปล่า
2. บัตรตอบมาว่าใช่หรือไม่
3. โอเค ฉันอยากได้ข้อมูลเลข 13 หลักที่มีความยาว x
4. บัตรตอบกลับมาว่าฉันมีข้อมูลนี้ ยาว x
5. ขอดูข้อมูลหน่อยละกัน
6. บัตรส่งข้อมูลให้
apdu = SELECT+THAI_ID_CARD
f = open(‘temp.txt’,’w’)
response, sw1, sw2 = cardservice.connection.transmit( apdu )
#print ‘response: ‘, response, ‘ status words: ‘, “%x %x” % (sw1, sw2)
อันนี้เป็นข้อ 1-2 ครับ ดูตรง sw1 กับ sw2 ครับ ถ้าโอเคจะตอบกลับมาเป็น
0x90 xx หรือ 0x61 xx ซึ่ง 90 คือโอเค ส่วน 61 คือ โอเคแต่มีข้อมูล xx ไบต์นะ
#print ‘response: ‘, response, ‘ status words: ‘, “%x %x” % (sw1, sw2)
for d in DATA:
response, sw1, sw2 = cardservice.connection.transmit( d )
print sw1
if sw1 == 0x61:
ไล่ขอข้อมูลใน list DATA ส่วนนี้สังเกตว่าบัตรตอบกลับมาว่า 0x61 มีข้อมูลอีก xx นะ
เริ่มจาก cid
GET_RESPONSE = [0X00, 0XC0, 0x00, 0x00 ]
apdu = GET_RESPONSE + [sw2]
ตรงนี้ขอดูข้อมูลที่บอกว่ามีหน่อย
print ‘sending ‘ + toHexString(apdu)
response, sw1, sw2 = cardservice.connection.transmit( apdu )
print ‘response: ‘, toHexString(response), ‘ status words: ‘, “%x %x” % (sw1, sw2)
result = “”
for i in response:
result = result+chr(i)
f.write(result.strip()+”\n”)
ส่วนนี้แค่ไล่อ่านจนครบทุกข้อมูล จริง ๆ จะมีรูปภาพอีกครับแต่ไม่ได้ทำไว้เพราะอายุบัตรค่อนข้างนาน
รูปในบัตรจะดูห่างจากตัวจริงเยอะไป
#apdu บัตรปชช
Get response 0x00, 0xC0, 0x00, 0x00 + Len in hex
INS 0xB0 | Read Bin INS 0xC0 | Get response
SELECT FILE CLA = 0X00 INS = 0XA4 P1 = 0x04 | Direct selection by DF name (data field=DF name) P2 = 0x00 Lc = 0x08 ( len of DF Name )
Thailand Personal DF Name 0xA0, 0X00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01