同系列文章:
源代码:
YAReader.cs
/* ---------------------------------------------------------- * 文件名称:YAReader.cs * * 作者:秦建辉 * * 微信:splashcn * * 博客:http://www.firstsolver.com/wordpress/ * * 开发环境: * Visual Studio V2015 * .NET Framework 4 Client Profile * * 版本历史: * V1.0 2017年09月12日 * 银安科技二代身份证阅读器接口 ------------------------------------------------------------ */ using System.Runtime.InteropServices; namespace Com.FirstSolver.CardReader { /// <summary> /// 公司名称:内蒙古银安科技开发有限责任公司 /// 官方网址:http://www.yachina.net/ /// 产品名称:内置式居民身份证阅读机具 /// 产品型号:YADR-006 /// </summary> public class YAReader : IDCardReader { /// <summary> /// 自动检测身份证读卡器并初始化 /// </summary> /// <returns> /// true:成功 /// false:失败 /// </returns> protected override bool Initialize() { for (int i = 1001; i <= 1016; i++) { if (SDT_OpenPort(i) == 0x90) { // 打开端口成功 InnerPort = i; return true; } } return false; } /// <summary> /// 关闭读卡器 /// </summary> /// <returns> /// 0:成功 /// -1:失败 /// </returns> protected override int CloseComm() { if (SDT_ClosePort(InnerPort) == 0x90) return 0; else return -1; } /// <summary> /// 验证卡 /// </summary> /// <returns> /// 0:验卡成功 /// -1:验卡失败 /// </returns> protected override int Authenticate() { byte[] Buffer = new byte[8]; if (SDT_StartFindIDCard(InnerPort, Buffer, 0) == 0x9F) // 找卡,获取IIN { if (SDT_SelectIDCard(InnerPort, Buffer, 0) == 0x90) return 0; // 选卡,获取SN } return -1; } /// <summary> /// 读卡基本信息 /// </summary> /// <returns> /// 0:读卡成功,卡片不带指纹数据 /// 1:读卡成功,卡片带指纹数据 /// -1:读卡失败 /// </returns> protected override int ReadContent() { int puiCHMsgLen = 256; int puiPHMsgLen = 1024; if (SDT_ReadBaseMsgToFile(InnerPort, CHMsgFileName, ref puiCHMsgLen, PHMsgFileName, ref puiPHMsgLen, 0) == 0x90) { // 解密照片 if (GetBmp(PHMsgFileName, 2) == 1) return 0; } return -1; } #region DLLIMPORT /// <summary> /// 打开USB口 /// </summary> /// <param name="iPort">端口号。1001-1016为USB口,缺省的一个USB设备端口是1001</param> /// <returns> /// 0x90:打开端口成功 /// 0x01:端口打开失败/端口号不合法 /// </returns> [DllImport("sdtapi.dll")] public static extern int SDT_OpenPort(int iPort); /// <summary> /// 关闭USB口 /// </summary> /// <param name="iPort">端口号</param> /// <returns> /// 0x90:成功 /// 0x01端口号不合法 /// </returns> [DllImport("sdtapi.dll")] public static extern int SDT_ClosePort(int iPort); /// <summary> /// 开始找卡 /// </summary> /// <param name="iPort">端口号</param> /// <param name="pucIIN">输出:证/卡芯片管理号,4个字节</param> /// <param name="iIfOpen"> /// 0:表示不在该函数内部打开和关闭端口 /// 非0:表示在函数内部包含了打开端口和关闭端口函数 /// </param> /// <returns> /// 0x9f:找卡成功 /// 0x80:找卡失败 /// </returns> [DllImport("sdtapi.dll")] public static extern int SDT_StartFindIDCard(int iPort, byte[] pucIIN, int iIfOpen); /// <summary> /// 选卡 /// </summary> /// <param name="iPort">端口号</param> /// <param name="pucSN">输出:序列号,8个字节</param> /// <param name="iIfOpen"> /// 0:表示不在该函数内部打开和关闭端口 /// 非0:表示在函数内部包含了打开端口和关闭端口函数 /// </param> /// <returns> /// 0x90:选卡成功 /// 0x81:选卡失败 /// </returns> [DllImport("sdtapi.dll")] public static extern int SDT_SelectIDCard(int iPort, byte[] pucSN, int iIfOpen); /// <summary> /// 读取证/卡固定信息 /// </summary> /// <param name="iPort">端口号</param> /// <param name="pucCHMsg">存储读到的文字信息</param> /// <param name="puiCHMsgLen">文字信息长度</param> /// <param name="pucPHMsg">存储读到的照片信息</param> /// <param name="puiPHMsgLen">照片信息长度</param> /// <param name="iIfOpen"> /// 0:表示不在该函数内部打开和关闭端口 /// 非0:表示在函数内部包含了打开端口和关闭端口函数 /// </param> /// <returns> /// 0x90:成功 /// 其它:失败 /// </returns> [DllImport("sdtapi.dll")] public static extern int SDT_ReadBaseMsg(int iPort, byte[] pucCHMsg, ref int puiCHMsgLen, byte[] pucPHMsg, ref int puiPHMsgLen, int iIfOpen); /// <summary> /// 读取卡体管理号 /// </summary> /// <param name="iPort">端口号</param> /// <param name="pucIINSNDN">卡体管理号,28字节</param> /// <param name="iIfOpen"> /// 0:表示不在该函数内部打开和关闭端口 /// 非0:表示在函数内部包含了打开端口和关闭端口函数 /// </param> /// <returns> /// 0x90:成功 /// 其它:失败 /// </returns> [DllImport("sdtapi.dll")] public static extern int SDT_ReadIINSNDN(int iPort, byte[] pucIINSNDN, int iIfOpen); /// <summary> /// 读取证/卡固定信息并保存到指定文件 /// </summary> /// <param name="iPort">端口号</param> /// <param name="pcCHMsgFileName">用于保存文字信息的文件名</param> /// <param name="puiCHMsgFileLen">文字信息长度</param> /// <param name="pcPHMsgFileName">用于保存照片信息的文件名</param> /// <param name="puiPHMsgFileLen">照片信息长度</param> /// <param name="iIfOpen"> /// 0:表示不在该函数内部打开和关闭端口 /// 非0:表示在函数内部包含了打开端口和关闭端口函数 /// </param> /// <returns> /// 0x90:成功 /// 其它:失败 /// </returns> [DllImport("sdtapi.dll", CharSet = CharSet.Ansi)] public static extern int SDT_ReadBaseMsgToFile(int iPort, string pcCHMsgFileName, ref int puiCHMsgFileLen, string pcPHMsgFileName, ref int puiPHMsgFileLen, int iIfOpen); /// <summary> /// 解析照片 /// </summary> /// <param name="file_name">照片文件名</param> /// <param name="iPortType"> /// 设备接口类型: /// 1:设备为COM接口 /// 2:设备为USB接口 /// </param> /// <returns> /// 1:成功 /// 0:调用sdtapi.dll错误 /// -1:相片解码错误 /// -2:wlt文件后缀错误 /// -3:wlt文件打开错误 /// -4:wlt文件格式错误 /// -5:软件未授权 /// -6:设备连接错误 /// </returns> [DllImport("WltRS.dll")] public static extern int GetBmp(string file_name, int iPortType); #endregion } }