You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
6.8 KiB
C#

2 years ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace demo.ExternalDevices
{
class IDCard2
{
#region "dll声明"
/// <summary>
/// 打开串口/USB。
/// </summary>
/// <param name="iPort">[in] 整数, 表示端口号。 1-16十进制为串口,1001-1016十进制为USB口,缺省的一个USB 设备端口号是 1001。</param>
/// <returns>0x90 打开端口成功;1 打开端口失败/端口号不合法</returns>
[DllImport(@"card2_dll\sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SDT_OpenPort(int iPort);
/// <summary>
/// 关闭串口/USB。
/// </summary>
/// <param name="iPort">[in] 整数,表示端口号。</param>
/// <returns>0x90 关闭端口成功。 0x01 端口号不合法</returns>
[DllImport(@"card2_dll\sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SDT_ClosePort(int iPort);
/// <summary>
/// 读卡
/// </summary>
/// <param name="iPort"></param>
/// <param name="pucManaInfo">证/卡芯片管理号, 4 个字节。</param>
/// <param name="iIfOpen"></param>
/// <returns>0x9f 找卡成功0x80 找卡失败</returns>
[DllImport(@"card2_dll\sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SDT_StartFindIDCard(int iPort, byte[] pucManaInfo, int iIfOpen);
/// <summary>
/// 选择卡
/// </summary>
/// <param name="iPort"></param>
/// <param name="pucManaMsg">卡体管理号,28 字节。</param>
/// <param name="iIfOpen"></param>
/// <returns>0x90 读成功;其他 读失败(具体含义参见返回码表</returns>
[DllImport(@"card2_dll\sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SDT_SelectIDCard(int iPort, byte[] pucManaMsg, int iIfOpen);
/// <summary>
/// 读取基本数据
/// </summary>
/// <param name="iPort"></param>
/// <param name="pucCHMsg">读到的文字信息>=256</param>
/// <param name="puiCHMsgLen">文字信息长度<=256</param>
/// <param name="pucPHMsg">读到的相片信息</param>
/// <param name="puiPHMsgLen">相片信息长度</param>
/// <param name="iIfOpen">0表示 不在该函数内部打开和关闭串口,此时 不在该函数内部打开和关闭串口,此时 不在该函数内部打开和关闭串口,此时 不在该函数内部打开和关闭串口,此时 不在该函数内部打开和关闭串口,此时 不在该函数内部打开和关闭串口,此时 不在该函数内部打开和关闭串口,此时 应确保之前调用了 确保之前调用了 确保之前调用了 确保之前调用了 SDT_OpenPort 打开端口,并且 打开端口,并且 应在不需要与端口通信时,调用 在不需要与端口通信时,调用 SDT_ClosePort DT_ClosePort 关闭端口;非 关闭端口;非 0表示在 API 函数内部包含了打开端口和关闭,之前不 函数内部包含了打开端口和关闭,之前不 函数内部包含了打开端口和关闭,之前不 需要调用 SDT_OpenPort ,也不用 再调,也不用 再调SDT_ClosePort 。</param>
/// <returns></returns>
[DllImport(@"card2_dll\sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SDT_ReadBaseMsg(int iPort, byte[] pucCHMsg, ref UInt32 puiCHMsgLen, byte[] pucPHMsg, ref UInt32 puiPHMsgLen, int iIfOpen);
/// <summary>
/// 读取图片;
/// </summary>
/// <param name="file_name">wlt文件名后缀是.wlt</param>
/// <param name="Port">阅读设备通讯接口类型1串口 2USB</param>
/// <returns>1正确 0调用stdapi.dll错误-1相片解码错误-2wlt文件后最错误-3wlt文件打开错误-4wlt文件格式错误-5软件未授权,-6设备连接错误</returns>
[DllImport("WltRS.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int GetBmp(String file_name, int Port);
[DllImport(@"card2_dll\sdtapi.dll")]
public static extern int SDT_ReadBaseMsgToFile(int iPortID, string fileName1, ref UInt32 puiCHMsgLen, string fileName2, ref UInt32 puiPHMsgLen, int iIfOpen);
#endregion
public static bool ReadMsg(int portNo, ref string name, ref string IDNo)
{
bool flag = false;
flag = OpenPort(portNo);
flag = ReadIDNameAndNo(portNo, ref name, ref IDNo);
ClosePort(portNo);
return flag;
}
public static bool OpenPort(int portNo)
{
bool flag = false;
int ret = 0x90;
try
{
ret = SDT_OpenPort(portNo);
if (ret == 144)
{
flag = true;
}
}
catch { }
return flag;
}
public static void ClosePort(int portNo)
{
SDT_ClosePort(portNo);
}
public static bool ReadIDNameAndNo(int portNo, ref string name, ref string IDNo)
{
bool flag = false;
int iRet = 0x90; //返回码
int iIfOpen = 0; //是否需要打开端口
byte[] pubManaInfo = new byte[255]; //身份证管理号信息
byte[] pubManaMsg = new byte[255]; //
byte[] pubCHMsg = new byte[512]; //文字信息
byte[] pubPHMsg = new byte[3024]; //照片信息
UInt32 puiCHMsgLen = 0; //文字信息的长度
UInt32 puiPHMsgLen = 0; //照片信息的长度
iRet = SDT_StartFindIDCard(portNo, pubManaInfo, iIfOpen);
if (iRet != 159)
{
return flag;
}
iRet = SDT_SelectIDCard(portNo, pubManaMsg, iIfOpen);
if (iRet != 144)
{
return flag;
}
iRet = SDT_ReadBaseMsg(portNo, pubCHMsg, ref puiCHMsgLen, pubPHMsg, ref puiPHMsgLen, iIfOpen);
if (iRet != 144)
{
return flag;
}
iRet = SDT_ClosePort(portNo);
if (iRet != 144)
{
return flag;
}
else
{
flag = true;
string cardMsg = System.Text.ASCIIEncoding.Unicode.GetString(pubCHMsg);
name = System.Text.ASCIIEncoding.Unicode.GetString(pubCHMsg, 0, 30).Trim();
IDNo = System.Text.ASCIIEncoding.Unicode.GetString(pubCHMsg, 122, 36).Trim();
}
return flag;
}
}
}