最近项目中用到华视身份证读卡机,那么本篇文章就是根据Python代码来实现对华视身份证读卡机中读卡操作。
华视身份证阅读器SDK手册
下面是官方提供的SDK使用手册,我就不描述到本篇文章中了,相信大家如果需要是肯定有下面这个文档。以及所需要的dll文件的。
代码二次开发说明
下面会有我开发的代码,因为我还做了日志记录功能,如果大家不需要可以根据下面代码进行修改。
一些需要加载的函数库
- ctypes 【调用dll需要使用】
- os【获取当前电脑用户名】
- base64【将获取的头像转为bs64格式,不想转也可以】
- time【循环调用方法,读取身份证】
下面代码只是我用根据我项目所需要的情况写的Python代码,仅供参考。
readCard 方法 就是我编写的主要方法
- 第一步 初始化端口CVR_InitComm(iPort)【我是USB读卡设备使用的端口1001】
- 判断端口是否打开成功,不成功1s后返回循环
- 第二步 开始卡认证CVR_Authenticate()【找卡操作】
- 判断找卡是否成功,不成功1s后返回循环
- 第三步 读卡操作CVR_Read_Content(4)【我这里使用的参数是4详情请看文档】
- 判断是否读卡成功,不成功1s后返回循环
- 第四步 读卡成功,记录日志以及打开读取到的身份信息文件读取到数组中【日志记录你们可以不使用】
- 最终的数据就是 self.cust_info 读取到的身份信息
Python主要代码如下
import ctypes import logging import log_config import time import requests import json import os import base64 import subprocess class CardOperator: lib_dll = None WltRS = None Termb = None cust_info = None user_name = None file_path="C:\\Users\\user_name\\AppData\\Local\\Temp\\chinaidcard\\" def __init__(self): try: self.cust_info = dict() self.lib_dll = ctypes.windll.LoadLibrary('./sdtapi.dll') self.WltRS = ctypes.windll.LoadLibrary('./WltRS.dll') self.Termb = ctypes.windll.LoadLibrary('./Termb.dll') self.headers = {'content-type': "application/json;charset=utf-8"} self.err_rs = {'status': False, 'msg': '出现异常,请查看日志'} requests.adapters.DEFAULT_RETRIES = 5 # 增加重连次数 self.request_s = requests.session() self.request_s.keep_alive = False # 关闭多余连接 # 获取电脑登录的用户名 self.user_name = os.getlogin() # 记录日志文件 logging.debug('user_name:' + self.user_name) # 修改读卡获取数据位置,将用户名赋值到地址栏 self.file_path = self.file_path.replace("user_name",self.user_name) except Exception as ex: logging.debug('初始化程序异常:\n'+str(ex)) def readCard(self): res = dict() # USB 设备端口 iPort = 1001 # 打开串口/USB while True: # 初始化连接【返回1 正确,2端口打开失败,-1未知错误,-2动态库加载失败】 iRet = self.Termb.CVR_InitComm(iPort) # 判断是否打开端口 if iRet == 1: # 开始卡认证【返回1 卡片认证成功,2寻卡失败,3选卡失败,4未连接读卡器,0动态库未加载】 ret = self.Termb.CVR_Authenticate() # 判断是否找卡成功 if ret == 1: # 开始读卡操作 # 参数【临时目录中保存的文件种类,具体看文档,这里使用4】 # 【返回1 读卡成功,0错误,读身份证失败,4错误,身份证读卡器未连接,99动态库未加载】 ret = self.Termb.CVR_Read_Content(4) # 开始读卡操作,无参数【在执行目录返回文件信息】 #ret = self.Termb.CVR_Read_FPContent() # 关闭连接【1关闭成功,2端口不合法,-1端口已关闭,-2动态库加载失败】 self.Termb.CVR_CloseComm() # 判断是否读卡成功 if ret == 1: # 读卡成功,记录日志 user_info = '' logging.debug('wz.txt:' + self.file_path + "wz.txt") logging.debug('xp.jpg:' + self.file_path + "xp.jpg") # 打开生成的基本信息文件 with open(self.file_path + "wz.txt") as file_obj: user_info = file_obj.read() # 打开生成的解密的头像数据 with open(self.file_path + "xp.jpg", 'rb') as file_obj: base64_data = base64.b64encode(file_obj.read()) # 将读取到的数据转换为数组【0名称,1性别,2民族,3出生日期,4地址,5身份证,6办理公安局,7身份证有效期】 user_info = user_info.split("\n") self.cust_info['name'] = user_info[0] self.cust_info['gender'] = user_info[1] self.cust_info['born'] = user_info[3] self.cust_info['address'] = user_info[4] self.cust_info['code'] = user_info[5] self.cust_info['photo'] = "data:image/jpg;base64," + base64_data.decode() # 读取数据成功,打印数据 print( self.cust_info) logging.debug('读取身份证成功,cust_info:' + str(self.cust_info)) else: logging.debug('读卡失败 iRet:' + str(ret)) time.sleep(1) continue else: logging.debug('卡片认证失败 iRet:' + str(ret)) time.sleep(1) continue else: logging.debug('打开端口失败,请连接设备 iRet:' + str(iRet)) time.sleep(1) continue time.sleep(1)