
發(fā)現酒店、網(wǎng)吧、公家單位好多都是使用的這種藍色的身份證讀取盒子,所以我研究了一下也寫(xiě)個(gè)Python示例
網(wǎng)上搜了搜關(guān)于這款機器的SDK,基本上全是C#的帖子
首先,先安裝他們的驅動(dòng),我使用的是USB驅動(dòng),在他們官網(wǎng)上下載了動(dòng)態(tài)鏈接庫,實(shí)際上就是使用SynIDCardAPI.dll這個(gè)庫。
下面,我們來(lái)調用一下他們提供的接口(接口文檔就不提供了,可以去他們官網(wǎng)下載后觀(guān)摩),下面是我的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) #開(kāi)始找卡
- pucSN = ctypes.create_string_buffer(128)
- dll.Syn_SelectIDCard(iPort, pucSN, 1) #選擇卡
- cPhotopath = ctypes.create_string_buffer(255)
- dll.Syn_SetPhotoPath(1, cPhotopath) #這一步很重要,他們默認把身份證頭像存在了C盤(pán)根目錄,導致win7下面調用會(huì )導致python崩潰,原因是沒(méi)有管理員權限,這里1參數可以換到當前目錄即可
- #下面調用他們的最終讀取函數Syn_ReadMsg,第三個(gè)參數是一個(gè)結構體,Python本身沒(méi)有C/C++那樣的結構體,但是可以通過(guò)ctypes的Structure來(lái)解決
- 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), #發(fā)證機關(guān)
- ('UserLifeBegin', c_char * 18), #有效開(kāi)始日期
- ('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 #這里就返回的是身份證信息,我這里以雙豎線(xiàn)分隔拼成字符串了
- else:
- print "None"
說(shuō)實(shí)話(huà),他們的接口壓根就沒(méi)有考慮什么PHP、Python這類(lèi)語(yǔ)言,一點(diǎn)都不方便,給C#卻提供了很多示例,真心操蛋!
留帖為了方便我以后查看,也給學(xué)習Python的童鞋們一個(gè)希望,讀取身份證類(lèi)似的C/S架構軟件也可以使用wxPython進(jìn)行開(kāi)發(fā)。
聯(lián)系客服