python 讀取健保IC卡資訊
關於讀取健保IC卡資訊並非只有 python 才能寫,像是 c/c++、java、c#等等...都應該可以讀取,本篇因為用到 APDU 的指令,如何使用,小弟也正在研究中,之所以會想寫這篇,正是心血來潮突然想來玩玩讀卡機,目前市面上很多種讀卡機RFID、或者是NFC....,類似的讀卡機其實可以衍申很多種應用程式,例如我們可以利用讀卡機開發門禁考勤系統、POS收營系統、悠遊卡扣款系統、或者是點名報到系統,而類似超商使用的悠遊卡讀卡機一般人未必會擁有,但有一種機器肯定是每個人都會有的那就是 "EZ100PU",自從學習 python 第一天開始,便從 web 延伸接觸底層開發,這兩年中不知不覺已經摸超過百種設備,但這項最簡單的設備,卻竟然我一直沒去注意過,所以,寫下筆記,就讓我利用 python 來玩玩 EZ100PU 讀健保IC卡。
本環境如下
acer NB
WINDOWS 7 PRO
python 2.7
swigwin-3.0.12 (請上網下載並記得放在C底下並在環境設定裡加入路徑)
pyscard-1.9.6.tar (解壓縮後就到該目錄底下並下指令python setup.py install)
範例程式
from smartcard.System import readers
# 這段為 APDU 協定所使用的命令,請自行上網查詢如何使用
SelectAPDU = [ 0x00, 0xA4, 0x04, 0x00, 0x10, 0xD1, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00 ]
ReadProfileAPDU = [ 0x00, 0xca, 0x11, 0x00, 0x02, 0x00, 0x00 ]
# 獲取所有可用的讀取器
r = readers()
print "Available readers:", r
reader = r[0]
print "Using:", reader
connection = reader.createConnection()
connection.connect()
data, sw1, sw2 = connection.transmit(SelectAPDU)
print "Select Applet: %02X %02X" % (sw1, sw2)
data, sw1, sw2 = connection.transmit(ReadProfileAPDU)
#印出資料
print "Command: %02X %02X" % (sw1, sw2)
print 'Card Number : %s' % ''.join(chr(i) for i in data[0:12])
print 'Name : %s' % ''.join(chr(i) for i in data[12:18])
print 'ID Number : %s' % ''.join(chr(i) for i in data[32:42])
print 'Birthday : %s' % ''.join(chr(i) for i in data[43:49])
print 'Sex : %s' % ''.join(chr(i) for i in data[49:50])
print 'Card Date : %s' % ''.join(chr(i) for i in data[51:57])
參考資訊
http://boywhy.blogspot.tw/2014/11/java-java.html
本環境如下
acer NB
WINDOWS 7 PRO
python 2.7
swigwin-3.0.12 (請上網下載並記得放在C底下並在環境設定裡加入路徑)
pyscard-1.9.6.tar (解壓縮後就到該目錄底下並下指令python setup.py install)
範例程式
from smartcard.System import readers
# 這段為 APDU 協定所使用的命令,請自行上網查詢如何使用
SelectAPDU = [ 0x00, 0xA4, 0x04, 0x00, 0x10, 0xD1, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00 ]
ReadProfileAPDU = [ 0x00, 0xca, 0x11, 0x00, 0x02, 0x00, 0x00 ]
# 獲取所有可用的讀取器
r = readers()
print "Available readers:", r
reader = r[0]
print "Using:", reader
connection = reader.createConnection()
connection.connect()
data, sw1, sw2 = connection.transmit(SelectAPDU)
print "Select Applet: %02X %02X" % (sw1, sw2)
data, sw1, sw2 = connection.transmit(ReadProfileAPDU)
#印出資料
print "Command: %02X %02X" % (sw1, sw2)
print 'Card Number : %s' % ''.join(chr(i) for i in data[0:12])
print 'Name : %s' % ''.join(chr(i) for i in data[12:18])
print 'ID Number : %s' % ''.join(chr(i) for i in data[32:42])
print 'Birthday : %s' % ''.join(chr(i) for i in data[43:49])
print 'Sex : %s' % ''.join(chr(i) for i in data[49:50])
print 'Card Date : %s' % ''.join(chr(i) for i in data[51:57])
參考資訊
http://boywhy.blogspot.tw/2014/11/java-java.html
您好,請問我用python3是不是無法做到讀卡的動作?
回覆刪除請問讀出來的名字時是亂碼,應該如何處理?
回覆刪除請問python3 姓名出現亂碼 怎麼處理編碼呢 已經處理一陣子還是無解
回覆刪除big5 to utf8