版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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;〃簽發(fā)機關
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「東鄉(xiāng)族,);
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前已設置的業(yè)務終端與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-成功,其他失敗}
設置射頻適配器最大通信字節(jié)數
functionSDTSetMaxRFByte(iPort:integerjucByte:CharjblfOpen:
integer):integer;stdcal1;External'SDTAPI.DLL";
{iPort[in]表示端口號,ucByte[in]無符號字符,24-255,表示射頻適配器最大通信字節(jié)數,
ilf0pen[in]參見SDT_ResetSAM
返回值0x90-成功,其他-失敗}
對SAMV進行狀態(tài)檢測
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字節(jié),
返回值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個字節(jié),
ilfOpen[in]參見SDT_ResetSAM
返回值0x9f-找卡成功,0x80-找卡失敗}
選卡
functionSDT_SelectIDCard(iPort:integer;pucManaMsg:Pbyte;ilfOpen:
integer):integer;stdcal1;External'SDTAPI.DLL';
{iPort[in]表示端口號,pucManaMsg[out]無符號指針,證/卡芯片序列號,8個字節(jié),
ilfOpen[in]參見SDT_ResetSAM
返回值0x90-選卡成功,0x81-選卡失敗}
讀取卡體管理號
functionSDTReadMnglnfo(iPort:integer;pucManageMsg:Pbyte;ilfOpen:
integer):integer;stdcall;ExternarSDTAPI.DLLJ;
{iPort[in]表示端口號,pucManageMsg[out]無符號字符指針,卡體管理號,28字節(jié),
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號:幺中小訂閱
公安部已經大規(guī)模在全國范圍內推廣第二代居民身份證的換發(fā)工作,目前,許多地區(qū)
二代證換發(fā)工作己經進行了很久。但是,相對應于二代證的推廣,社會上許許多多的應用系
統都還沒有對二代證讀卡開發(fā)相應的接口,為此,我寫了一個通用的二代證機具讀卡類,希
望能對各位在各自的系統中開發(fā)這樣的接口提供幫助。
本類僅僅提供讀卡的用法,寫卡的方式我并沒有寫在里面,但是,相應的寫調用我
已經聲明在里面,希望各位大俠能獨自研究應用。駕
該類接口具有如下特點:
1、通用于目前市場上各個機具廠商的二代證讀(寫)機具。(想想,為不同廠商
開發(fā)不同的接口確實令人頭疼的,且由于接口不兼容,容易被客戶罵死!.)
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. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 開展雙重預防機制建設的方法
- 2024年內蒙古自治區(qū)通遼市中考英語試題卷(含答案)+2023年中考英語試卷及答案
- DB3305∕T 311-2024 數字化法律服務規(guī)范 勞動糾紛
- 有關新學期計劃集錦5篇
- 有關父愛的演講稿(8篇)
- 第十三章 內能、第十四章 內能的利用 -2024-2025學年物理人教版九年級上冊
- 2024中考語文作文押題《成長經歷類》寫作指導
- 新學期計劃合集6篇范文
- 2021-2022學年物理高一下期末檢測模擬試題含解析
- 第二單元試卷-2024-2025學年語文三年級上冊統編版
- 生涯彩虹圖理論及空白活動用紙
- 土與火的藝術陶藝課件
- 數學磨課記錄全國一等獎教學設計
- 九年級道德與法治下教學工作總結(共5篇)
- 汽車進化史(小學生家長進課堂)課件
- 鋼筋平法識圖課件
- (新版)乳品品嘗師理論考試核心題庫(含答案)
- 《爵士鼓演奏技巧研究理論文獻綜述》
- 教科版科學三年級上冊學生活動手冊答案
- 政府采購法律法規(guī)及操作實務課件
- 現場改善(今井正明)課件
評論
0/150
提交評論