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