using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
namespace SLUserInfoRead
{
///
/// 身份证数据对象
///
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct IDCardData
{
///
/// 姓名
///
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] //结构中使用的字串,[]类似限定说明 说明此公共结构传输到非托管代码时封装定义
public string Name;
///
/// 性别
///
[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;
/// <summary>
/// 户籍地
/// </summary>
public string DomicilePlace;
}
public class IDCardHelp
{
/************************端口类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);
/*************************身份证卡类函数 ***************************/
/// <summary>
/// 开始找卡
/// </summary>
/// <param name="iPort"></param>
/// <param name="pucIIN"></param>
/// <param name="iIfOpen"></param>
/// <returns></returns>
[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_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(int iPort, ref byte Wlt_File);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
/// <summary>
/// 查找读卡器
/// </summary>
/// <returns></returns>
[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);
}
}
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Text.RegularExpressions;
namespace SLUserInfoRead
{
///
/// 身份证类
///
public class IDCard
{
///
/// 寻找读卡器
///
/// 错误消息
/// 端口号
/// 返回端口号
public static int FindReader(ref string errMsg)
{
bool result = true;
//将读卡器读出的图片保存为 身份证号+“.jpeg”
try
{
int nRet = IDCardHelp.Syn_SetPhotoName(2);
//存为jpeg格式
nRet = IDCardHelp.Syn_SetPhotoType(1);
}
catch (Exception ex)
{
errMsg = ex.Message;
result = false;
}
if (result)
{
result = IsOutOfBrowser(ref errMsg);
}
int port = -1;
if (result)
{
port = IDCardHelp.Syn_FindReader();
if (port <= 0)
{
errMsg = "未找到身份证读卡器!";
}
}
return port;
}
/// <summary>
/// 打开端口
/// </summary>
/// <param name="port">端口号</param>
/// <param name="errMsg">错误消息</param>
/// <returns></returns>
public static int OpenPort(int port, ref string errMsg)
{
int rRct = -1;
try
{
rRct = IDCardHelp.Syn_OpenPort(port);
if (rRct != 0)
{
errMsg = "身份证读卡器端口打开失败!";
}
}
catch (Exception ex)
{
errMsg = ex.Message;
}
return rRct;
}
/// <summary>
/// 设置图片保存路径
/// </summary>
/// <param name="path">指定路径</param>
/// <param name="errMsg">错误消息</param>
/// <returns></returns>
public static bool SetPhotoPath(string path, ref string errMsg)
{
bool result = true;
try
{
byte[] cPath = System.Text.Encoding.Unicode.GetBytes(path);
int i = IDCardHelp.Syn_SetPhotoPath(2, ref cPath[0]);
result = i == 0 ? true : false;
}
catch (Exception ex)
{
errMsg = ex.Message;
result = false;
}
return result;
}
static string regPattern = "(([\\W\\w]+[省][^市]+[市])|([\\W\\w]+[省][^县]+[县])|([\\W\\w]+[自治区]+[\\W\\w]+[市])|([\\W\\w]+[^省]+[市][\\W\\w]+[市|区|县])|([\\W\\w]+[省][\\W\\w]+[自治州]))";
/// <summary>
/// 读取身份证信息
/// </summary>
/// <param name="errMsg">错误消息</param>
/// <returns></returns>
public static IDCardData GetCardInfo(ref string errMsg)
{
IDCardData cardMsg = new IDCardData();
int port = -1, nRet;
byte[] pucIIN = new byte[4];
byte[] pucSN = new byte[8];
int iifOpen = 0;
port = FindReader(ref errMsg);
if (string.IsNullOrEmpty(errMsg))
{
nRet = OpenPort(port, ref errMsg);
if (nRet == 0)
{
nRet = IDCardHelp.Syn_SetMaxRFByte(port, 80, 0);
try
{
if (nRet == 0)
{
nRet = IDCardHelp.Syn_StartFindIDCard(port, ref pucIIN[0], iifOpen);
}
if (nRet == 0)
{
nRet = IDCardHelp.Syn_SelectIDCard(port, ref pucSN[0], iifOpen);
if (nRet == 0)
{
nRet = IDCardHelp.Syn_ReadMsg(port, 0, ref cardMsg);
if (!string.IsNullOrEmpty(cardMsg.Address))
{
Regex regex = new Regex(regPattern);
cardMsg.DomicilePlace = regex.Match(cardMsg.Address).Value;
}
}
}
if (nRet != 0)
{
errMsg = "未识别到身份证卡片!";
}
IDCardHelp.Syn_ClosePort(port);
}
catch (Exception ex)
{
errMsg = ex.Message;
}
}
}
return cardMsg;
}
/// <summary>
/// 是否在浏览器外运行
/// </summary>
/// <param name="errMsg">错误消息</param>
/// <returns></returns>
private static bool IsOutOfBrowser(ref string errMsg)
{
bool result = true;
if (!Application.Current.IsRunningOutOfBrowser)
{
result = false;
errMsg = "请在浏览器外运行以获取得权限支持!";
}
return result;
}
}
}
本文提供了C#语言实现身份证读卡接口的代码示例,包括身份证数据对象结构体和身份证类。代码中包含了读取身份证信息的方法,并展示了如何处理读卡器返回的数据。
5807

被折叠的 条评论
为什么被折叠?



