一个在奔跑线上
不断努力奋斗的PHP开发程序猿

华视身份证读卡机Python二次开发

最近项目中用到华视身份证读卡机,那么本篇文章就是根据Python代码来实现对华视身份证读卡机中读卡操作。

华视身份证阅读器SDK手册

下面是官方提供的SDK使用手册,我就不描述到本篇文章中了,相信大家如果需要是肯定有下面这个文档。以及所需要的dll文件的。

代码二次开发说明

下面会有我开发的代码,因为我还做了日志记录功能,如果大家不需要可以根据下面代码进行修改。

一些需要加载的函数库

  1. ctypes 【调用dll需要使用】
  2. os【获取当前电脑用户名】
  3. base64【将获取的头像转为bs64格式,不想转也可以】
  4. time【循环调用方法,读取身份证】

下面代码只是我用根据我项目所需要的情况写的Python代码,仅供参考。

readCard 方法 就是我编写的主要方法

  1. 第一步 初始化端口CVR_InitComm(iPort)【我是USB读卡设备使用的端口1001】
  2. 判断端口是否打开成功,不成功1s后返回循环
  3. 第二步 开始卡认证CVR_Authenticate()【找卡操作】
  4. 判断找卡是否成功,不成功1s后返回循环
  5. 第三步 读卡操作CVR_Read_Content(4)【我这里使用的参数是4详情请看文档】
  6. 判断是否读卡成功,不成功1s后返回循环
  7. 第四步 读卡成功,记录日志以及打开读取到的身份信息文件读取到数组中【日志记录你们可以不使用】
  8. 最终的数据就是 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)

赞(23) 打赏
未经允许不得转载:只缘余生 » 华视身份证读卡机Python二次开发

评论 抢沙发

8 + 2 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏