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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
}
}
}