C#:二代身份证阅读机具接口封装(五)银安科技

同系列文章:

源代码:
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
    }
}

Comments are closed.