發現酒店、網吧、公家單位好多都是使用的這種藍色的身份證讀取盒子,因此我研究了一下也寫個Python示例python
網上搜了搜關於這款機器的SDK,基本上全是C#的帖子架構
首先,先安裝他們的驅動,我使用的是USB驅動,在他們官網上下載了動態連接庫,實際上就是使用SynIDCardAPI.dll這個庫。函數
下面,咱們來調用一下他們提供的接口(接口文檔就不提供了,能夠去他們官網下載後觀摩),下面是個人Python代碼:學習
#!/usr/bin/env python # -*- coding: utf-8 -*- import ctypes, sys, re from ctypes import * #由於使用的是C/C++的庫,因此咱們引用ctypes dll = ctypes.windll.LoadLibrary("SynIDCardAPI.dll") #載入庫 iPort = dll.Syn_FindUSBReader() #尋找USB,返回的貌似是什麼端口 pucIIN = ctypes.create_string_buffer(128) dll.Syn_StartFindIDCard(iPort, pucIIN, 1) #開始找卡 pucSN = ctypes.create_string_buffer(128) dll.Syn_SelectIDCard(iPort, pucSN, 1) #選擇卡 cPhotopath = ctypes.create_string_buffer(255) dll.Syn_SetPhotoPath(1, cPhotopath) #這一步很重要,他們默認把身份證頭像存在了C盤根目錄,致使win7下面調用會致使python崩潰,緣由是沒有管理員權限,這裏1參數能夠換到當前目錄便可 #下面調用他們的最終讀取函數Syn_ReadMsg,第三個參數是一個結構體,Python自己沒有C/C++那樣的結構體,可是能夠經過ctypes的Structure來解決 class IDCardData(Structure): _fields_ = [ ('Name', c_char * 32), #姓名 ('Sex', c_char * 6), #性別 ('Nation', c_char * 20), #民族 ('Born', c_char * 18), #出生日期 ('Address', c_char * 72), #住址 ('IDCardNo', c_char * 38), #身份證號 ('GrantDept', c_char * 32), #發證機關 ('UserLifeBegin', c_char * 18), #有效開始日期 ('UserLifeEnd', c_char * 18), #有效截止日期 ('reserved', c_char * 38), #保留 ('PhotoFileName', c_char * 255) #照片路徑 ] data = IDCardData() r = dll.Syn_ReadMsg(iPort, 1, byref(data)) if r == 0: reserved = (getattr(data, 'reserved') if getattr(data, 'reserved') != '' else 'None') result = getattr(data, 'Name') + "||" + getattr(data, 'Sex') + "||" + getattr(data, 'Nation') + "||" + getattr(data, 'Born') + "||" + getattr(data, 'Address') + "||" + getattr(data, 'IDCardNo') + "||" + getattr(data, 'GrantDept') + "||" + getattr(data, 'UserLifeBegin') + "||" + getattr(data, 'UserLifeEnd') + "||" + reserved + "||" + getattr(data, 'PhotoFileName') result = result.decode('gbk').encode('utf8') print result #這裏就返回的是身份證信息,我這裏以雙豎線分隔拼成字符串了 else: print "None"
說實話,他們的接口壓根就沒有考慮什麼PHP、Python這類語言,一點都不方便,給C#卻提供了不少示例,真心操蛋!code
留帖爲了方便我之後查看,也給學習Python的童鞋們一個但願,讀取身份證相似的C/S架構軟件也能夠使用wxPython進行開發。接口