版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#读取二代身份证信息源码
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Runtime.InteropServices;
usingSystem.Reflection;
usingSystem.IO;
namespaceICCard
(
publicclassclsICCard
(
〃首先,声明通用接口
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_OpenPort(intiPortID);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_ClosePort(intiPortID);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_PowerManagerBegin(intiPortID,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_AddSAMUser(intiPortID,stringpclIserName,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_SAMLogin(intiPortID,stringpcUserName,stringpcPasswd,intilfOpen);
[Dlllmport(*sdtapi.dir)]
publicstaticexternintSDT_SAMLogout(intiPortID,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_UserManagerOK(intiPortID,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_ChangeOwnPwd(intiPortID,stringpcOldPasswd,stringpcNewPasswd,int
ilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_ChangeOtherPwd(intiPortID,stringpcUserName,stringpcNewPasswd,int
ilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_DeleteSAMUser(intiPortID,stringpcUserName,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_StartFindIDCard(intiPortID,refintpucllN,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_SelectlDCard(intiPortID,refintpucSN,intilfOpen);
[Dlllmport('sdtapi.dir)]
publicstaticexternintSDT_ReadBaseMsg(intiPortID,stringpucCHMsg,refintpuiCHMsgLen,string
pucPHMsg,refintpuiPHMsgLen,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_ReadBaseMsgToFile(intiPortID,stringfileNamel,refintpuiCHMsgLen,
stringfileName2,refintpuiPHMsgLen,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_WriteAppMsg(intiPortID,refbytepucSendData,intuiSendLen,refbyte
pucRecvData,refintpuiRecvLen,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_WriteAppMsgOK(intiPortID,refbytepucData,intuiLen,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_CancelWriteAppMsg(intiPortID,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_ReadNewAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,int
ilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_ReadAIIAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,int
ilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_UsableAppMsg(intiPortID,refbyteucByte,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_GetUnlockMsg(intiPortID,refbytestrMsg,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_GetSAMID(intiPortID,refbyteStrSAMID,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_SetMaxRFByte(intiPortID,byteucByte,intilfOpen);
[DlllmportCsdtapi.dir)]
publicstaticexternintSDT_ResetSAM(intiPortID,intiIfOpen);
<Ahref="/">PDA</A>
[Dlllmport(,WltRS.dll,)]
publicstaticexternintGetBmp(stringfile_name,intintf);
publicdelegatevoidDe_ReadlCCardComplete(clsEDZobjEDZ);
publiceventDe_ReadlCCardCompleteReadICCardComplete;
privatecIsEDZobjEDZ=newclsEDZ();
privateintEdzilfOpen=1;〃自动开关串口
intEdziPortID;
publicclslCCard()
(
)
publicboolReadlCCard()
(
boolbUsbPort=false;
intintOpenPortRtn=0;
intrtnTemp=0;
intpucllN=0;
intpucSN=0;
intpuiCHMsgLen=0;
intpuiPHMsgLen=0;
objEDZ=newclsEDZ();
〃检测usb口的机具连接,必须先检测usb
for(intiPort=1001;iPort<=1016;iPort++)
intOpenPortRtn=SDT_OpenPort(iPort);
if(intOpenPortRtn==144)
EdziPortID=iPort;
bUsbPort=true;
break;
)
)
〃检测串口的机具连接
if(IbUsbPort)
(
for(intiPort=1;iPort<=2;iPort++)
(
intOpenPortRtn=SDT_OpenPort(iPort);
if(intOpenPortRtn==144)
(
EdziPortID=iPort;
bUsbPort=false;
break;
)
)
)
if(intOpenPortRtn!=144)
MessageBox.ShowC端口打开失败,请检测相应的端口或者重新连接读卡器!‘,‘提示
MessageBoxButtons.OK,MessageBoxIcon.Error);
returnfalse;
)
〃在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID保存下来,可以
保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,
〃您要考虑机具连接端口被用户改变的情况哦
〃下面找卡
rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);
if(rtnTemp!=159)
(
rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);〃再找卡
if(rtnTemp!=159)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.Show。未放卡或者卡未放好,请重新放卡!',,提示‘,MessageBoxButtons.OK,
MessageBoxIcon.Error);
returnfalse;
)
)
〃选卡
rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);
if(rtnTemp!=144)
rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);〃再选卡
if(rtnTemp!=144)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.Show('读卡失败!‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);
returnfalse;
)
)
〃注意,在这里,用户必须有应用程序当前目录的读写权限〃检测串口的机具连接
if(IbUsbPort)
(
for(intiPort=1;iPort<=2;iPort++)
(
intOpenPortRtn=SDT_OpenPort(iPort);
if(intOpenPortRtn==144)
(
EdziPortID=iPort;
bllsbPort=false;
break;
)
)
)
if(intOpenPortRtn!=144)
(
MessageBox.Show。端口打开失败,请检测相应的端口或者重新连接读卡器!提示
MessageBoxButtons.OK,MessageBoxIcon.Error);
returnfalse;
)
〃在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID保存下来,可以
保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,
〃您要考虑机具连接端口被用户改变的情况哦
〃下面找卡
rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);
<Ahref="http:〃/">身份证读卡器v/A>
if(rtnTemp!=159)
(
rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);〃再找卡
if(rtnTemp!=159)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.ShowC未放卡或者卡未放好,请重新放卡!提示‘,MessageBoxButtons.OK,
MessageBoxIcon.Error);
returnfalse;
)
)
〃选卡
rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);
if(rtnTemp!=144)
(
rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);〃再选k
if(rtnTemp!=144)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.Show(,读卡失败!‘,‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);
returnfalse;
)
)
〃注意,在这里,用户必须有应用程序当前目录的读写权限
FileinfoobjFile=newFilelnfo(4wz.txtl);
if(objFile.Exists)
(
objFile.Attributes=FileAttributes.Normal;
objFile.Delete();
)
objFile=newFilelnfo(*zp.bmp,);
if(objFile.Exists)
objFile.Attributes=FileAttributes.Normal;
objFile.Delete();
)
objFile=newFilelnfo(*zp.wlt);
if(objFile.Exists)
(
objFile.Attributes=FileAttributes.Normal;
objFile.Delete();
)
rtnTemp=SDT_ReadBaseMsgToFile(EdziPortlD,,wz.txt*,refpuiCHMsgLen,,zp.wlt4,refpuiPHMsgLen,
EdzilfOpen);
if(rtnTemp!=144)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.Show('读卡失败!’提示',MessageBoxButtons.OK,MessageBoxIcon.Error);
returnfalse;
)
〃下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,照片解析将会失败
if(bUsbPort)
rtnTemp=GetBmp(*zp.wlt,2);
else
rtnTemp=GetBmp(lzp.wlt',1);
switch(rtnTemp)
case0:
MessageBox.ShowC调用sdtapi.dll错误!','提示',MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
case1:〃正常
break;
case-1:
MessageBox.ShowC相片解码错误!',‘提示',MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
case-2:
MessageBox.Show('wlt文件后缀错误!'提示',MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
case-3:
MessageBox.Show('wlt文件打开错误!‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
case-4:
MessageBox.Show('wlt文件格式错误!‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
case-5:
MessageBox.Show('软件未授权!‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
case-6:
MessageBox.Show,设备连接错•误!」提示l,MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
)
rtnTemp=SDT_ClosePort(EdziPortlD);
FileInfof=newFilelnfo(*wz.txt);
FileStreamfs=f.OpenRead();
byte[]bt=newbyte[fs.Length];
fs.Read(bt,0,(int)fs.Length);
fs.Close();
stringstr=System.Text.UnicodeEncoding.Unicode.GetString(bt);
objEDZ.Name=System.Text.UnicodeEncoding.Unicode.GetString(bt,0,30).Trim();
objEDZ.Sex_Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,30,2).Trim();
objEDZ.NATION_Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,32,4).Trim();
stringstrBird=System.Text.UnicodeEncoding.Unicode.GetString(bt,36,16).Trim();
objEDZ.BIRTH=Convert.ToDateTime(strBird.Substring(0,4)+'年'+strBird.Substring(4,2)+'月'+
strBird.Substring(6)+旧');
objEDZ.ADDRESS=System.Text.UnicodeEncoding.Unicode.GetString(bt,52,70).Trim();
objEDZ.IDC=System.Text.UnicodeEncoding.Unicode.GetString(bt,122,36).Trim();
objEDZ.REGORG=System.Text.UnicodeEncoding.Unicode.GetString(bt,158,30).Trim();
stringstrTem=System.Text.UnicodeEncoding.Unicode.GetString(bt,188,bt.GetLength(O)-
188).Trim();
objEDZ.STARTDATE=Convert.ToDateTime(strTem.Substring(0,4)+'年'+strTem.Substring(4,2)+
'月,+strTem.Substring(6,2)+'曰');
strTem=strTem.Substring(8);
if(strTem.Trim()!='长期')
objEDZ.ENDDATE=Convert.ToDateTime(strTem.Substring(014)+'年'+strTem.Substring(4,2)+'月
,+strTem.Substring(6,2)+'曰');
)
else
(
objEDZ.ENDDATE=DateTime.MaxValue;
)
objFile=newFilelnfo('zp.bmp');
if(objFile.Exists)
(
Imageimg=Image.FromFile('zp.bmp4);
objEDZ.PIC_lmage=(lmage)img.Clone();
System.10.Memorystreamm=newMemoryStream();
img.Save(m,System.Drawing.Imaging.ImageFormat.Jpeg);
objEDZ.PIC_Byte=m.ToArray();
img.Dispose();
img=null;
)
ReadlCCardComplete(objEDZ);
returntrue;
)
publicclasscIsEDZ
(
privateSystem.Collections.SortedListIstMZ=newSortedList();
privatestring_Name;〃姓名
privatestring_Sex_Code;〃性别代码
privatestring_Sex_CName;〃性别
privatestring_IDC;〃身份证号码
privatestring_NATION_Code;〃民族代码
privatestring_NATION_CName;〃民族
privateDateTime_BIRTH;〃出生日期
privatestring_ADDRESS;〃住址
privatestring_REGORG;〃签发机关
privateDateTime_STARTDATE;〃身份证有效起始日期
privateDateTime_ENDDATE;〃身份证有效截至日期
privatestring_Period_Of_Validity_Code;〃有效期限代码,许多原来系统上面为了一代证考虑,常常
存在这样的字段,二代证中已经没有了
privatestring_Period_Of_Validity_CName;〃有效期限
privatebyte[]_PIC_Byte;〃照片二进制
privateImage_PIC_lmage;〃照片
publicclsEDZ()
lstMZ.Add('O1','汉族');
lstMZ.Add(g'蒙古族》
IstMZ.Addg'回族》
lstMZ.Add(,04「藏族力
lstMZ.Add(g'维吾尔族);
lstMZ.Add(P6「苗族);
lstMZ.AddC07*,
lstMZ.Add(087壮族');
lstMZ.Add('O9','布依族');
lstMZ.Add(10」朝鲜族》
lstMZ.Add(T1','满族');
lstMZ.Add(T2「侗族
lstMZ.Add('13‘,’瑶族’);
lstMZ.Add(14\1白族力
lstMZ.Add(,15「土家族);
lstMZ.Add('16',
lstMZ.Add(17「哈萨克族”
lstMZ.Add('18」傣族);
lstMZ.Add('19‘,’黎族’);
lstMZ.Add(20「M族);
lstMZ.Add('21','值族');
lstMZ.Add(22「畲族);
lstMZ.Add(,23「高山族);
lstMZ.Add('24「拉祜族);
lstMZ.Add('25」水族);
lstMZ.Add(,26「东乡族,);
lstMZ.Add(,27「纳西族,);
lstMZ.Add(’28',’景颇族’);
lstMZ.Add(,29「柯尔克孜族);
lstMZ.AddC3(T,'土族);
lstMZ.Add('31','达翰尔族');
lstMZ.Add(32「侬佬族”
lstMZ.Add(,331'羌族');
lstMZ.Add(34「布朗族,);
lstMZ.Add('35‘,’撒拉族');
lstMZ.Add(36「毛南族);
lstMZ.Add('37',彳乞佬族’);
lstMZ.Add('38',锡伯族’);
lstMZ.Add('39',河昌族’);
lstMZ.Add(401'普米族
lstMZ.Add('417塔吉克族);
lstMZ.Add('42「怒族);
lstMZ.Add('43','乌孜别克族');
lstMZ.Add('44‘,’俄罗斯族');
lstMZ.Add('45「鄂温克族');
lstMZ.Add(,46「德昂族》
lstMZ.Add('47','保安族');
lstMZ.Add(,4&,,裕固族,);
lstMZ.Add(,49「京族);
lstMZ.Add('5O',‘塔塔尔族');
lstMZ.Add('51','独龙族
lstMZ.Add(’52「鄂伦春族);
lstMZ.Add('53','赫哲族');
lstMZ.Add(",'门巴族》
lstMZ.Add('55','珞巴族');
lstMZ.Add('56\'基诺族');
lstMZ.Add(,57「其它);
lstMZ.Add('98','外国人入籍');
}
publicstringName
(
get{return_Name;}
set{_Name=value;}
)
publicstringSex_Code
get{return_Sex_Code;}
set
_Sex_Code=value;
switch(value)
(
caseT:
Sex_CName='男';
break;
case2:
Sex_CName='女';
break;
)
)
)
publicstringSex_CName
(
get{return_Sex_CName;}
set{_Sex_CName=value;}
)
publicstringIDC
get{return_IDC;}
set<_IDC=value;}
)
publicstringNATION_Code
(
get{return_NATION_Code;}
set
(
_NATION_Code=value;
if(IstM乙Contains(value))
NATION_CName=lstMZ[value].ToString();
)
)
publicstringNATION_CName
(
get{return_NATION_CName;}
set{_NATION_CName=value;}
)
publicDateTimeBIRTH
(
get{return_BIRTH;}
set{_BIRTH=value;}
)
publicstringADDRESS
get{return_ADDRESS;}
set<_ADDRESS=value;}
)
publicstringREGORG
(
get{return_REGORG;}
set{_REGORG=value;}
)
publicDateTimeSTARTDATE
(
get{return_STARTDATE;}
set{_STARTDATE=value;}
)
publicDateTimeENDDATE
(
get{return_ENDDATE;}
set
(
_ENDDATE=value;
if(_ENDDATE==DateTime.MaxValue)
_Period_Of_Validity_Code=3;
_Period_Of_Validity_CName='长期,;
)
else
(
if(_STARTDATE!=DateTime.MinValue)
(
switch(value.AddDays(l).Year-_STARTDATE.Year)
(
case5:
_Period_Of_Validity_Code=4;
_Period_Of_Validity_CName='5年';
break;
case10:
_Period_Of_Validity_Code=T;
_Period_Of_Validity_CName=,10年';
break;
case20:
_Period_Of_Validity_Code=2;
_Period_Of_Validity_CName=,20年';
break;
)
}
)
)
}
publicstringPeriod_Of_Validity_Code
(
get{return_Period_Of_Validity_Code;}
set{_Period_Of_Validity_Code=value;}
}
publicstringPeriod_Of_Validity_CName
(
get{return_Period_Of_Validity_CName;}
set{_Period_Of_Validity_CName=value;}
}
publicbyte[]PIC_Byte
(
get{return_PIC_Byte;}
set{_PIC_Byte=value;}
}
publicImagePIC_lmage
get{return_PIC_lmage;}
set{_PIC_lmage=value;}
)
)
[转载]二代身份证读卡器接口函数DeIphi声明
(2010-06-3022:09:33)
转载原文
标签:
转载
原文地址:二代身份证读卡器接口函数Delphi声明作者:虚伪人生
前段时间做项目时用的,拿来一看全是C++的dll,就对应写了一下Delphi的声明
查看串口当前波特率
functionSDT_GetCOMBaud(iPort:integer;puiBaudRate:Pinteger):
integer;stdcall;External"SDTAPI.DLL";
{iPort[in]表示端口,puiBaudRate[out]无符号指针,指向普通串口当前波特率,返回值
0X90-成功,0x1-端口打开失败/端口号不合法,0x5无法获得SAM_V的波特率,串口不可用。}
设置SAMV的串口的波特率
functionSDT_StetCOMBaud(iPort:integer;uiCurrBaud:integer;uiSetBaud:integer):
integer;stdcalllExternal'SDTAPI.DLL';<Ahref="http:〃/">手持终端
</A>
{iPort[in]表示端口,uiCurrBaud[in]调用改API前已设置的业务终端与SAM_V通信的波特
率(出厂默认为115200)
uiCurrBaud只能为115200,57600,378400,19200,9600。如果uiCurrBaud数值不是这些值之
一,函数返回0x21,如果和已设置的不一样,
函数返回0x02表示不能设置调用API不成功。uiSetBaud[in]将要设置的SAM_V波特率,只
能为(同上)那些值,如果不是这些数值,返回也同上
函数返回0x90-成功,0x1-端口打开失败/端口号不合法,0x2-超时,设置不成功,
0x21-uiCurrBaud>uiSetBaud输入参数数值错误}
打开串口/USB
functionSDTOpenPort(iPort:integer):integer;stdcal1;External'SDTAPI.DLL';
{iPort[in]表示端口号,1-16(十进制)为串口,1001-1016(十进制)为USB口,缺省的一个
USB设备端口是1001c
函数返回0x90-打开端口成功,1-打开端口失败/端口号不合法}
关闭串口/USB
functionSDTClosePort(iPort:integer):integer;stdcal1;External'SDTAPI.DLL);
{iPort[in]表示端口号,返回值0x90-关闭串口成功,0x01-端口号不合法}
对SAM_V复位
functionSDTResetSAM(iPort:integer;i1fOpen:integer):
integer;stdcal1;External'SDTAPI.DLL);
{iPort[in]表示端口号,目前串口和USB只支持16个,串口:0001-0016,USB:1001-1016.
ilf0pen[in]表示不在该函数内部打开和关闭串口,非0表示在API函数内部包含了打开串
口和关闭串口函数,之前不需要调用
SDT_0penPort和SDT_ClosePort
返回值0x90-成功,其他失败}
设置射频适配器最大通信字节数
functionSDTSetMaxRFByte(iPort:integerjucByte:CharjblfOpen:
integer):integer;stdcal1;External'SDTAPI.DLL";
{iPort[in]表示端口号,ucByte[in]无符号字符,24-255,表示射频适配器最大通信字节数,
ilf0pen[in]参见SDT_ResetSAM
返回值0x90-成功,其他-失败}
对SAMV进行状态检测
functionSDTGetSAMStatus(iPort:integer;ilfOpen:
integer):integer;stdcal1;External'SDTAPI.DLL";
{iPort[in]表示端口号,ilfOpen参见SDT_ResetSAM
返回值0x90-SAM_V正常,0x60-自检失败,不能接收命令,其他-命令失败}
读取SAMV的编号
functionSDTGetSAMID(iPort:integer;pusSAMID:Pbyte;ilfOpen:
integer):integer;stdcal1;External,SDTAPI.DLL';
{iPort[in]表示端口号,pusSAMID[out]无符号字符串指针SAM_V编号,16字节,
返回值0x90-成功,其他-失败}
读取SAMV的编号
functionSDTGetSAMIDToStr(iPort:integer;pcSAMID:Pbyte;ilfOpen:
integer):integer;stdcal1;External,SDTAPI.DLL";
{iport[in]表示端口号,pusSAMID[out]SAM_V编号,ilfOpen[in]整数,参见SDT_ResetSAM
返回值0x90-成功,其他-失败}
开始找卡
functionSDT_StartFindIDCard(iPort:integer;pucManalnfo:Pbyte;ilfOpen:
integer):integer;stdcal1;External'SDTAPI.DLL,;
{iport[in]表示端口号,pucManalnfo[out]无符号指针,证/卡芯片管理号,4个字节,
ilfOpen[in]参见SDT_ResetSAM
返回值0x9f-找卡成功,0x80-找卡失败}
选卡
functionSDT_SelectIDCard(iPort:integer;pucManaMsg:Pbyte;ilfOpen:
integer):integer;stdcal1;External'SDTAPI.DLL';
{iPort[in]表示端口号,pucManaMsg[out]无符号指针,证/卡芯片序列号,8个字节,
ilfOpen[in]参见SDT_ResetSAM
返回值0x90-选卡成功,0x81-选卡失败}
读取卡体管理号
functionSDTReadMnglnfo(iPort:integer;pucManageMsg:Pbyte;ilfOpen:
integer):integer;stdcall;ExternarSDTAPI.DLLJ;
{iPort[in]表示端口号,pucManageMsg[out]无符号字符指针,卡体管理号,28字节,
ilfOpen[in]
返回值0x90-成功,其他一读失败}
读取证/卡固定信息
functionSDTReadBaseMsg(iPort:integer;pucCHMsg:Pbyte;puiCHMsgLen:
Pinteger;pucPHMsg:Pbyte;puiPIIMsgLen:Pinteger;ilfOpen:
integer):integer;stdcal1;ExternarSDTAPI.DLL,;
{iPort[in]表示端口号,pucCHMsg[out]指向读到的文字信息,puiCHMsgLen[out]指向读到
的文字信息长度
pucPHMsg[out]指向读到的照片信息,puiPHMsgLen[out]指向读到的照片信息长度,
ilfOpen[in]参见SDT_ResetSAM
返回值0x90-读固定信息成功,其他读固定信息失败}
读取追加信息
functionSDTReadNewAppMsg(iPort:integer;pucAppMsg:Pbyte;puiAppMsgLen:
Pinteger;ilfOpen:integer):integer;;stdcal1jExternaVSDTAPI.DLL';
{iPort[in]表示端口号,pucAppMsg[out]指向读到的追加信息,puiAppMsgL6n[out]指向读
到的追加信息长度,ilfOp6n[in]参见SDT_ResetSAM
返回值0x90-读取追加信息成功,其他一读取追加信息失败}
照片解码函数
functionGetBmp(Wlt_File:PChar,intf:
integer):integer;stdcal1;ExternalJW1tRS.dll';
{Wlt_File-wlt文件名,intf阅读设备通讯接口类型(『RS-232C,2-USB)
返回值:生成*.bmp和以下返回信息:1-相片解码正确,0-调用sdtapi.dll错误,--相片解
码错误,-2-wlt文件后缀错误,
-3-wlt文件打开错误,-4-wlt文件格式错误,-5-软件未授权,-6-设备连接错误}
不同机具的通用的第二代居民身份证读写
C#2008-06-0615:19:47阅读46评论13号:幺中小订阅
公安部已经大规模在全国范围内推广第二代居民身份证的换发工作,目前,许多地区
二代证换发工作己经进行了很久。但是,相对应于二代证的推广,社会上许许多多的应用系
统都还没有对二代证读卡开发相应的接口,为此,我写了一个通用的二代证机具读卡类,希
望能对各位在各自的系统中开发这样的接口提供帮助。
本类仅仅提供读卡的用法,写卡的方式我并没有写在里面,但是,相应的写调用我
已经声明在里面,希望各位大侠能独自研究应用。驾
该类接口具有如下特点:
1、通用于目前市场上各个机具厂商的二代证读(写)机具。(想想,为不同厂商
开发不同的接口确实令人头疼的,且由于接口不兼容,容易被客户骂死!.)
2、自动适应串口、USB口的各种机具
3,能读文字信息,但是,要想正确读照片,必须需要机具厂商的授权文件Termb.Lic,
且授权文件必须放在C盘根目录下。(我总不能不照顾机具厂商的利益吧和)
4、除了上面第三条之外,您甚至不用安装机具的驱动程序,接上二代证机具即可
使用。
废话少说,下面看实现方法:
类如下:
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Runtime.InteropServices;
usingSystem.Reflection;
usingSystem.IO;
namespaceICCard
(
publicclassclsICCard
(
//首先,声明通用接口
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_OpenPort(intiPortID);
[Dlllmport("sdtapi.dll'^)]
publicstaticexternintSDT_ClosePort(intiPortID);
[Dlllmport("sdtapi.dH")]
publicstaticexternintSDT_PowerManagerBegin(intiPortID,intilfOpen);
[Dlllmport(',sdtapi.dir,)]
publicstaticexternintSDT_AddSAMUser(intiPortID,stringpclIserName,int
ilfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_SAMLogin(intiPortID,stringpcUserName,string
pcPasswd,intiIfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_SAMLogout(intiPortID,intilfOpen);
[Dlllmport(',sdtapi.dir,)]
publicstaticexternintSDT_UserManagerOK(intiPortID,intilfOpen);
[Dlllmport("sdtapi.dll'^)]
publicstaticexternintSDT_ChangeOwnPwd(intiPortID,stringpcOldPasswd,string
pcNewPasswd,intilfOpen);
[Dlllmport(',sdtapi.dir,)]
publicstaticexternintSDT_ChangeOtherPwd(intiPortID,stringpclIserName,string
pcNewPasswd,intilfOpen);
[Dlllmport(',sdtapi.dir,)]
publicstaticexternintSDT_DeleteSAMUser(intiPortID,stringpclIserName,int
ilfOpen);
[Dlllmport("sdtapi.dlln)]
publicstaticexternintSDT_StartFindlDCard(intiPortID,refintpucllN,intilfOpen);
[Dlllmport("sdtapi.dH")]
publicstaticexternintSDT_SelectlDCard(intiPortID,refintpucSN,intilfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_ReadBaseMsg(intiPortID,stringpucCHMsg,refint
puiCHMsgLen,stringpucPHMsg,refintpuiPHMsgLen,intilfOpen);
[Dillmport(Msdtapi.dll")]
publicstaticexternintSDT_ReadBaseMsgToFile(intiPortID,stringfileNamel,refint
puiCHMsgLen,stringfileName2,refintpuiPHMsgLen,intilfOpen);
[Dlllmport("sdtapi.dll'^)]
publicstaticexternintSDT_WriteAppMsg(intiPortID,refbytepucSendData,int
uiSendLen,refbytepucRecvData,refintpuiRecvLen,intilfOpen);
[Dlllmport(',sdtapi.dir,)]
publicstaticexternintSDT_WriteAppMsgOK(intiPortID,refbytepucData,intuiLen,
intilfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_CancelWriteAppMsg(intiPortID,intilfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_ReadNewAppMsg(intiPortID,refbytepucAppMsg,ref
intpuiAppMsgLen,intilfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_ReadAIIAppMsg(intiPortID,refbytepucAppMsg,refint
puiAppMsgLen,intilfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_UsableAppMsg(intiPortID,refbyteucByte,intilfOpen);
[Dlllmport("sdtapi.dlln)]
publicstaticexternintSDT_GetUnlockMsg(intiPortID,refbytestrMsg,intilfOpen);
[Dlllmport("sdtapi.dll'^)]
publicstaticexternintSDT_GetSAMID(intiPortID,refbyteStrSAMID,intilfOpen);
[Dlllmport("sdtapi.dir,)]
publicstaticexternintSDT_SetMaxRFByte(intiPortID,byteucByte,intilfOpen);
[Dlllmport("sdtapi.dll'^)]
publicstaticexternintSDT_ResetSAM(intiPortID,intilfOpen);
[Dlllmport("WltRS.dllM)]
publicstaticexternintGetBmp(stringfile_name,intintf);
publicdelegatevoidDe_ReadlCCardComplete(clsEDZobjEDZ);
publiceventDe_ReadlCCardCompleteReadICCardComplete;
privatecIsEDZobjEDZ=newclsEDZ();
privateintEdzilfOpen=1;〃自动开关串口
intEdziPortID;
publicclslCCard()
(
)
publicboolReadlCCard()
(
boolbUsbPort=false;
intintOpenPortRtn=0;
intrtnTemp=0;
intpucllN=0;
intpucSN=0;
intpuiCHMsgLen=0;
intpuiPHMsgLen=0;
objEDZ=newclsEDZ();
〃检测usb□的机具连接,必须先检测usb
for(intiPort=1001;iPort<=1016;iPort++)
(
intOpenPortRtn=SDT_OpenPort(iPort);
if(intOpenPortRtn==144)
(
EdziPortID=iPort;
bUsbPort=true;
break;
)
)
〃检测串口的机具连接
if(IbllsbPort)
(
for(intiPort=1;iPort<=2;iPort++)
(
intOpenPortRtn=SDT_OpenPort(iPort);
if(intOpenPortRtn==144)
(
EdziPortID=iPort;
bUsbPort=false;
break;
)
)
)
if(intOpenPortRtn!=144)
(
MessageBox.Show("端口打开失败,请检测相应的端口或者重新连接读卡器!,“
提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
returnfalse;
)
〃在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID
保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,
〃您要考虑机具连接端口被用户改变的情况哦
〃下面找卡
rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);
if(rtnTemp!=159)
(
rtnTemp=SDT_StartFindlDCard(EdziPortlD,refpucllN,EdzilfOpen);〃再找
卡
if(rtnTemp!=159)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.Show("未放卡或者卡未放好,请重新放卡!丁'提示”,
MessageBoxButtons.OK,MessageBoxIcon.Error);
returnfalse;
}
}
〃选卡
rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);
if(rtnTemp!=144)
(
rtnTemp=SDT_SelectlDCard(EdziPortlD,refpucSN,EdzilfOpen);〃再选卡
if(rtnTemp!=144)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.Show("读卡失败!:,提示”,MessageBoxButtons.OK,
MessageBoxIcon.Error);
returnfalse;
)
}
〃注意,在这里,用户必须有应用程序当前目录的读写权限
FileinfoobjFile=newFilelnfo("wz.txt");
if(objFile.Exists)
(
objFile.Attributes=FileAttributes.Normal;
objFile.Delete();
)
objFile=newFilelnfo(Hzp.bmp");
if(objFile.Exists)
(
objFile.Attributes=FileAttributes.Normal;
objFile.Delete();
)
objFile=newFilelnfo(Hzp.wltH);
if(objFile.Exists)
objFile.Attributes=FileAttributes.Normal;
objFile.Delete();
)
rtnTemp=SDT_ReadBaseMsgToFile(EdziPortlD,"wz.txt",refpuiCHMsgLen,
"zp.wlt",refpuiPHMsgLen,EdzilfOpen);
if(rtnTemp!=144)
(
rtnTemp=SDT_ClosePort(EdziPortlD);
MessageBox.Show("读卡失败!“,“提示”,MessageBoxButtons.OK,
MessageBoxIcon.Error);
returnfalse;
)
〃下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,
照片解析将会失败
if(bUsbPort)
rtnTemp=GetBmp("zp.wltn,2);
else
rtnTemp=GetBmp("zp.wlt",1);
switch(rtnTemp)
(
case0:
MessageBox.Show("调用sdtapi.dll错误!“,“提示",MessageBoxButtons.OK,
MessageBoxIcon.Error);
break;
case1:〃正常
break;
case-1:
MessageBox.Show("相片解码错误!"提示",MessageBoxButtons.OK,
MessageBoxIc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2022年大学轻工纺织食品专业大学物理下册开学考试试题C卷-附解析
- 石河子大学《云计算概论》2023-2024学年期末试卷
- 大学生举办母亲节策划书集合10篇
- 学校配套设施施工组织设计
- 石河子大学《体操》2021-2022学年第一学期期末试卷
- 石河子大学《农村社会学》2022-2023学年第一学期期末试卷
- 石河子大学《畜产品加工工艺学》2022-2023学年第一学期期末试卷
- 沈阳理工大学《模拟电子技术基础》2021-2022学年期末试卷
- 沈阳理工大学《机械制造基础》2023-2024学年第一学期期末试卷
- 收费站收费班安全培训
- GB/T 30680-2014氟橡胶板通用技术条件
- GB/T 16830-2008商品条码储运包装商品编码与条码表示
- GB 5226.1-2008机械电气安全机械电气设备第1部分:通用技术条件
- GA/T 850-2021城市道路路内停车位设置规范
- 双代号网络计划图习题
- 第2课 新航路开辟后的食物物种交流 课件-高中历史统编版(2019)选择性必修二经济与社会生活
- 钣金冲压件质量要求
- 背景调查管理规定(9篇)
- 船舶电气设备及系统船舶照明系统管理-课件
- 高效管理沟通新课件
- 2022年中国铁路武汉局集团有限公司校园招聘笔试试题及答案解析
评论
0/150
提交评论