C#如何读取身份证阅读器
不同的身份证读卡器,其动态库不一样,新中新二代身份证阅读器,型号:DKQ-A16D,eg:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
namespace Zbsoft.XzxCardReader
{
/// <summary>
/// 新中新二代身份证阅读器,型号:DKQ-A16D
/// </summary>
public static class Reader
{
/// <summary>
/// 图片格式
/// </summary>
public enum PhotoType {Bmp = 0, Jpeg = 1, Base64 = 2}
/// <summary>
/// 图片命名格式
/// </summary>
public enum PhotoNameType {
/// <summary>
/// 临时,以当前时间命名
/// </summary>
Dt = 0,
/// <summary>
/// 姓名
/// </summary>
Name = 1,
/// <summary>
/// 身份证号
/// </summary>
CardNo = 2,
/// <summary>
/// 姓名_身份证号
/// </summary>
Name_CardNo = 3 }
/// <summary>
/// 日期格式
/// </summary>
public enum DateFormat
{
/// <summary>
/// YYYYMMDD
/// </summary>
YMD = 0,
/// <summary>
/// YYYY年MM月DD日
/// </summary>
YnMyD = 1,
/// <summary>
/// YYYY.MM.DD
/// </summary>
YdMdD = 2,
/// <summary>
/// YYYY-MM-DD
/// </summary>
YgMgD = 3,
/// <summary>
/// YYYY/MM/DD
/// </summary>
YxgMxgD = 4
}
static int nPort = 0;//端口
static string sPhotoPath = "";//图片文件夹
static PhotoType sPhotoType = PhotoType.Bmp;//图片文件格式
static PhotoNameType sPhotoNameType = PhotoNameType.CardNo;//图片文件命名格式
static DateFormat nDateFormat = DateFormat.YgMgD;//日期格式
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct IDCardData
{
//结构中使用的字串,[]类似限定说明 说明此公共结构传输到非托管代码时封装定义
/// <summary>
/// 姓名
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Name;
/// <summary>
/// 性别
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string Sex;
/// <summary>
/// 名族
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Nation;
/// <summary>
/// 出生日期
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
public string Born;
/// <summary>
/// 住址
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
public string Address;
/// <summary>
/// 身份证号
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
public string IDCardNo;
/// <summary>
/// 发证机关
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string GrantDept;
/// <summary>
/// 有效开始日期
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
public string UserLifeBegin;
/// <summary>
/// 有效截止日期
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
public string UserLifeEnd;
/// <summary>
/// 保留
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
public string reserved;
/// <summary>
/// 照片路径
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string PhotoFileName;
}
/************************端口类API *************************/
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi)]
public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)]
public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)]
public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)]
public static extern int Syn_OpenPort(int iPort);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)]
public static extern int Syn_ClosePort(int iPort);
/**************************SAM类函数 **************************/
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)]
public static extern int Syn_ResetSAM(int iPort, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi)]
public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)]
public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]
public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);
/*************************身份证卡类函数 ***************************/
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]
public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi)]
public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen);
//[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
//public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadBaseMsg(int iPort, IntPtr pucCHMsg, ref uint puiCHMsgLen, IntPtr pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)]
public static extern int Syn_GetBmp(string Wlt_File, int iPort);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)]
public static extern int Syn_FindReader();
/***********************设置附加功能函数 ************************/
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi)]
public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi)]
public static extern int Syn_SetPhotoType(int iType);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi)]
public static extern int Syn_SetPhotoName(int iType);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)]
public static extern int Syn_SetSexType(int iType);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi)]
public static extern int Syn_SetNationType(int iType);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi)]
public static extern int Syn_SetBornType(int iType);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi)]
public static extern int Syn_SetUserLifeBType(int iType);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi)]
public static extern int Syn_SetUserLifeEType(int iType, int iOption);
=========================
/// <summary>
/// 自动查询读卡器
/// </summary>
/// <param name="err">错误信息</param>
/// <returns></returns>
public static bool FindDrivers(out string err)
{
int i = 0;
err = "";
try
{
i = Syn_FindReader();
}
catch (Exception e)
{
err = e.ToString();
return false;
}
if (i > 0)
{
nPort = i;
}
else
{
nPort = 0;
return false;
}
return true;
}
/// <summary>
/// 读取身份证信息,包含图片,反复读取会出错
/// </summary>
/// <returns></returns>
public static bool ReadCardAll(out IDCardData CardMsg, out string errStr)
{
errStr = "";
CardMsg = new IDCardData();
int nRet;
byte[] pucIIN = new byte[4];
byte[] pucSN = new byte[8];
if (nPort == 0)
{
if (!FindDrivers(out errStr))
{
if (string.IsNullOrEmpty(errStr))
errStr = "没有找到读卡器";
return false;
}
if (string.IsNullOrEmpty(sPhotoPath))
{
if (!System.IO.Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "CardImg"))
System.IO.Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "CardImg");
sPhotoPath = AppDomain.CurrentDomain.BaseDirectory + "CardImg";
}
nRet = Syn_SetPhotoType((int)sPhotoType);
byte[] cPath = new byte[255];
cPath = System.Text.Encoding.Default.GetBytes(sPhotoPath);
nRet = Syn_SetPhotoPath(2, ref cPath[0]);
nRet = Syn_SetPhotoName((int)sPhotoNameType);
nRet = Syn_SetBornType((int)nDateFormat);
nRet = Syn_SetUserLifeBType((int)nDateFormat);
nRet = Syn_SetUserLifeEType((int)nDateFormat, 1);
nRet = Syn_SetNationType(2);//民族:0=卡内存储的数据,1=解释之后的数据,2=解释之后+“族”
}
if (Syn_OpenPort(nPort) == 0)
{
if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
{
nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
nRet = Syn_ReadMsg(nPort, 0, ref CardMsg);
if (nRet == 0)
{
return true;
}
else
{
errStr = "读取身份证信息错误";
}
}
}
else
{
errStr = "打开端口失败";
return false;
}
return false;
}
/// <summary>
/// 读取身份证基本信息
/// </summary>
/// <param name="CardMsg"></param>
/// <param name="errStr"></param>
/// <returns></returns>
public static bool ReadCard(out ZbsoftInterface.IDCardData CardMsg,
out string errStr)
{
CardMsg = new ZbsoftInterface.IDCardData();
errStr = "";
int nRet;
byte[] pucIIN = new byte[4];
byte[] pucSN = new byte[8];
#region 获取读卡器
if (nPort == 0)
{
if (!FindDrivers(out errStr))
{
if (string.IsNullOrEmpty(errStr))
errStr = "没有找到读卡器";
return false;
}
}
#endregion
if (Syn_OpenPort(nPort) == 0)
{
if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
{
nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
string cardMsg = new string(' ', 256); //身份证基本信息返回长度为256
string imgMsg = new string(' ', 1024); //身份证图片信息返回长度为1024
IntPtr msg = Marshal.StringToHGlobalAnsi(cardMsg); //身份证基本信息
IntPtr img = Marshal.StringToHGlobalAnsi(imgMsg); //身份证图片
try
{
uint mLen = 0;
uint iLen = 0;
nRet = Syn_ReadBaseMsg(nPort, msg, ref mLen, img, ref iLen, 0);
if (nRet == 0)
{
string card = Marshal.PtrToStringUni(msg);
char[] cartb = card.ToCharArray();
CardMsg.Name = (new string(cartb, 0, 15)).Trim();
CardMsg.Sex = new string(cartb, 15, 1);
CardMsg.Nation = new string(cartb, 16, 2);
CardMsg.Born = new string(cartb, 18, 8);
CardMsg.Address = (new string(cartb, 26, 35)).Trim();
CardMsg.IDCardNo = new string(cartb, 61, 18);
CardMsg.GrantDept = (new string(cartb, 79, 15)).Trim();
CardMsg.UserLifeBegin = new string(cartb, 94, 8);
CardMsg.UserLifeEnd = new string(cartb, 102, 8);
return true;
}
else
{
errStr = "读取身份证信息错误";
}
}
catch (Exception e) { errStr = e.Message; }
finally
{
Marshal.FreeHGlobal(msg);
Marshal.FreeHGlobal(img);
}
}
else
{
errStr = "SetMaxRFByte出错";
}
}
else
{
errStr = "打开端口失败";
}
return false;
}
}
}
C#如何读取身份证阅读器相关推荐
- 二代身份证读取 中控ID180 二三代身份证阅读器 Vue版本
二代身份证读取 中控ID180 二三代身份证阅读器 Vue版本 设备 设备名称:台式身份证阅读机 产品型号:ID180 设备驱动和文档 链接:https://pan.baidu.com/s/1nAYk ...
- VUE实现华视身份证阅读器读取身份证信息
VUE实现华视身份证阅读器读取身份证信息 话不多上直接上代码,写的不怎么规范多多包涵,我是在模态框实现的,在这里就只提供模态框代码. 最后附上华视身份证阅读器安装文件和浏览器插件链接: [https: ...
- VUE实现华视身份证阅读器读取身份证信息(本文分两种情况,第一中是点击按钮读取信息,一种是自动读取信息)
本文是用了vue+element来实现华视身份证读卡器读取身份信息的,当然在开发之前要做好前提准备,就是厂家提供对应设备的api和安装对应的驱动.本文通过两种方法来实现读取信息,第一种是点击按钮读取信 ...
- VUE整合信通身份证阅读器返回读取到的数据或将身份证图片返回
需求:身份证阅读器在浏览器上接入读取身份证信息 JAVA后端身份证图片合成https://blog.csdn.net/Ajie246862/article/details/125259692 1. 身 ...
- 公安部身份证阅读器模块SAM通讯协议
公安部身份证阅读器模块SAM通讯协议 图为:公安部身份证阅读器SAM模块照片 图为:东信新一代小身份证SAM模块 支持Windows.Android.Linux.ARM.单片机等各系统二次开发. 一. ...
- 华视100UC 身份证阅读器 Java
华视100UC 身份证阅读器 Java 哪位大佬有64位可用的dll文件,施舍给小弟吧,万分感谢 功能 环境 个人想法(有不对的地方希望大佬指正) 对于dll文件的想法 目录结构 1. pom.xml ...
- python能调用身份证读卡器吗_最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册...
最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册 1.定义 应用函数开发包含下列文件: termb.dll API函数的动态联接库 sdtapi.dll 内部动态库 ...
- JNA二次开发华视身份证阅读器
JNA二次开发华视身份证阅读器 前言 添加依赖 SDK资料 编写代码 遇到的问题(坑) 前言 这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative,其中JNA调用 ...
- 华视身份证阅读器SDK使用手册
华视身份证阅读器SDK使用手册 V1.33 华视电子读写设备有限公司 2008年07月11日 概述 本手册是操作身份证阅读器动态库应用函数的定义格式.调用方法和返回值的说明.在使用前,请确认授权文件 ...
最新文章
- 【实习招聘】字节跳动智能创作AutoML团队招聘
- CentOS Linux下VNC Server远程桌面配置详解
- 十大经典排序算法之冒泡排序及其优化
- 使用Symantec Altiris 来监控 Dell 服务器 的 硬件
- C++ STL string的输出
- 如何编译sqlite-3.5.9
- keepalived架设简单高可用的nginx的web服务器 ----那些你不知道的秘密
- Day003 20210208
- 小米Mi 11手机电路原理图+主板元件位号图
- 凸优化理论基础3——凸集和凸锥重要例子
- 计算机学硕答辩,东南大学计算机硕士毕业答辩基本流程(参考).doc
- conda upgrade --all 中途退出后失败如何解决
- xsy3320 string
- java实现word文件合并
- 获取IP地址信息的API合集
- 加拿大:国家资助研究项目IRAP已自主研发区块链浏览器
- 证券公司信用风险管理体系—以平安证券为例-课后检验-满分
- 高端机市场卡位战:iQOO能否博得一席之地?
- Java将下划线大写方式命名的字符串转换为驼峰式
- 纯电阻电路的分析方法——结点电压法