发现酒店、网吧、公家单位好多都是使用的这种蓝色的身份证读取盒子,因此我研究了一下也写个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进行开发。接口