C#讀取二代身份證信息源碼_第1頁
C#讀取二代身份證信息源碼_第2頁
C#讀取二代身份證信息源碼_第3頁
C#讀取二代身份證信息源碼_第4頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

C#讀取二代身份證信息源碼usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.Reflection;usingSystem.IO;namespaceICCard(publicclasscisICCard(〃首先,聲明通用接口[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_OpenPort(intiPortID);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_ClosePort(intiPortlD);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_PowerManagerBegin(intiPortID,intilfOpen);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_AddSAMUser(intiPortID,stringpclIserName,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_SAMLogout(intiPortID,intilfOpen);[DlllmportCsdt叩i.dll')]publicstaticexternintSDT_UserManagerOK(intiPortID,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_ChangeOwnPwd(intiPortID,stringpcOldPasswd,stringpcNewPasswd,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_ChangeOtherPwd(intiPortID,stringpcUserName,stringpcNewPasswd,intilfOpen);[Dlllmport(*sdtapi.dir)]publicstaticexternintSDT_DeleteSAMUser(intiPortID,stringpclIserName,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_StartFindIDCard(intiPortID,refintpucllN,intilfOpen);[DlllmportCsdt叩i.dlり]publicstaticexternintSDT_SelectlDCard(intiPortID,refintpucSN,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_ReadBaseMsg(intiPortID,stringpucCHMsg,refintpuiCHMsgLen,stringpucPHMsg,refintpuiPHMsgLen,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_ReadBaseMsgToFile(intiPortID,stringfileNamel,refintpuiCHMsgLen,stringfileName2,refintpuiPHMsgLen,intilfOpen);publicstaticexternintSDT_WriteAppMsg(intiPortID,refbytepucSendData,intuiSendLen,refbytepucRecvData,refintpuiRecvLen,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_WriteAppMsgOK(intiPortID,refbytepucData,intuiLen,intilfOpen);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_CancelWriteAppMsg(intiPortID,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_ReadNewAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport(,sdtapi.dll,)]publicstaticexternintSDT_ReadAIIAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_UsableAppMsg(intiPortID,refbyteucByte,intilfOpen);[DlllmportCsdtapi.dir)]publicstaticexternintSDT_GetUnlockMsg(intiPortID,refbytestrMsg,intilfOpen);[Dlllmport('sdtapi.dir)]publicstaticexternintSDT_GetSAMID(intiPortID,refbyteStrSAMID,intilfOpen);[DlllmportCsdtapi.dll1)]publicstaticexternintSDT_SetMaxRFByte(intiPortID,byteucByte,intilfOpen);[DlllmportCsdtapi.dll')]publicstaticexternintSDT_ResetSAM(intiPortID,intiIfOpen);<Ahref="/M>PDA</A>[DIIImportCWItRS.dir)]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ロ的機具連接,必須先檢測usbfor(intiPort=1001;iPort<=1016;iPort++)if(intOpenPortRtn==144)EdziPortID=iPort;bllsbPort=true;break;)}〃檢測串口的機具連接if(IbUsbPort)(for(intiPort=1;iPort<=2;iPort++)(intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn==144){EdziPortID=iPort;bllsbPort=false;break;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.ShowC未放卡或者卡未放好,請重新放卡!’,,提示‘,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保存下來,可以保存在注冊表中,也可以保存在配置文件中,我就不多寫了,但是,〃您要考慮機具連接端n被用戶改變的情況哦〃下面找卡rtnTemp=SDT_StartFindIDCard(EdziPortID,refpucllN,EdzilfOpen);<Ahref="http:〃/”>身份證讀卡器v/A>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)i〃再選kif(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('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.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.wlt,2);elsertnTemp=GetBmp('zp.wlt',1);switch(rtnTemp)case0:MessageBox.Show('調(diào)用sdtapi.dl!錯誤!‘,‘提示‘,MessageBoxButtons.OK,MessageBoxIcon.Error);break;〃正常break;case-1:MessageBox.Showぐ相片解碼錯誤!‘,‘提示‘,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。設備連接錯誤!二’提示,,MessageBoxButtons.OK,MessageBoxIcon.Error);break;)rtnTemp=SDT_ClosePort(EdziPortID);Fileinfof=newFilelnfo('wz.txt');FileStreamfs=f.OpenRead();byte[]bt=newbyteffs.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.lDC=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(0,4)+,年‘+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);objED乙PIC_lmage=(lmage)img.Clone();System.lO.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_NameI〃姓名privatestring_Sex_Code; 〃性別代碼privatestring_Sex_CName;〃性別privatestring_IDC;〃身份證號碼privatestring_NATION_Code;〃民族代碼privatestring_NATION_CNameJ〃民族privateDateTime_BIRTHJ〃出生日期privatestring_ADDRESS;〃住址privatestring_REGORGJ 〃簽發(fā)機關privateDateTime.STARTDATE; 〃身份證有效起始日期privateDateTime_ENDDATE; 〃身份證有效截至日期privatestring_Period_Of_Validity=Code; 〃有效期限代碼,許多原來系統(tǒng)上面為了一代證考慮,常常存在這樣的字段,二代證中已經(jīng)沒有了privatestring_Period_Of_Validity_CName; 〃有效期限privatebyte[]_PIC_Byte; 〃照片二進制privateImage_PIC_lmage;〃照片publicclsEDZ()lstMZ.Add('O2「蒙占族’);IstMZ.Addg‘回族');lstMZ.Add(X)4',‘藏族');IstMZ.Addg‘維吾爾族');lstMZ.Add('O6','苗族');lstMZ.Add(l07','彝族');lstMZ.Add('O8',‘壯族’);lstMZ.Add('O9','布依族');IstMZ.Add"。','朝鮮族');lstMZ.Add('11‘,’滿族');lstMZ.Add"2',‘侗族');lstMZ.Add('13','瑤族');lstMZ.Add('14「白族');lstMZ.Add(l15','土家族');lstMZ.Add(*16','哈尼族');IstMZ.Add“ア,‘哈薩克族');lstMZ.Add('18','傣族');lstMZ.Add”9','黎族');lstMZ.Add('2O','傑傑族');lstMZ.AddC21''仮族');lstMZ.Add(23「高山族);lstMZ.Add(24「拉祜族);lstMZ.Add(25「水族);IstMZ.Add(26「東鄉(xiāng)族);lstMZ.Add(27「納西族);IstM乙Add(,28「景頗族);lstMZ.Add(29「柯爾克孜族);lstMZ.Add('3O「土族);lstMZ.Add('31「達翰爾族);lstMZ.Add('32「イ么佬族);lstMZ.Add(33「羌族);lstMZ.Add('34「布朗族);lstMZ.Add('35「撒拉族);lstMZ.Add(36「毛南族,);lstMZ.Add('37「化佬族);lstMZ.Add(38「錫伯族);lstMZ.Add('39「阿昌族);lstMZ.Add(40「普米族);lstMZ.Add(41「塔吉克族);lstMZ.Add(42「怒族);lstMZ.Add('43「烏孜別克族);IstMZ.Add('44「俄羅斯族);lstMZ.Add('46',‘德昂族’);lstMZ.Add('47',‘保安族');lstMZ.Add('48','裕固族');lstMZ.Add('49',‘京族');lstMZ.Add('5O','塔塔爾族');lstMZ.Add('51','獨龍族’);lstMZ.Add('52',‘鄂倫春族');lstMZ.Add('53','赫哲族');lstMZ.Add('54',?門巴族');lstMZ.Add('55','珞巴族');lstMZ.Add('56','基諾族');lstMZ.Add('57','其它');lstMZ.Add('98','タト國人入籍');)publicstringName(get{return_Name;}set{_Name=value;})publicstringSex_Codeset_Sex_Code=value;switch(value)(case*1*:Sex_CName=身;break;Sex_CName='女’;break;)))publicstringSex_CName(get{return_Sex_CName;}set{_Sex_CName=value;})publicstringIDCget{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;}publicstringADDRESSget{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_OLValidity_Code=3;_Period_Of_Validity_CName='長期’;)else(if(_STARTDATE!=DateTime.MinValue)(switch(value.AddDays(1).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="。年,;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_lmageget{return_PIC_lmage;}set{_PIC_lmage=value;}))[轉(zhuǎn)載]二代身份證讀卡器接口函數(shù)Delphi聲明(2010-06-3022:09:33)轉(zhuǎn)載原文標簽:轉(zhuǎn)載原文地址:二代身份證讀卡器接n函數(shù)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;stdcall;External'SDTAPI.DLL';<Ahref=*/">手持終端</A>{iPort[in]表示端口,uiCurrBaud[in]調(diào)用改API前已設置的業(yè)務終端與SAMV通信的波特率(出廠默認為115200)uiCurrBaud只能為11520〇,57600,378400,19200,9600。如果uiCurrBaud數(shù)值不是這些值之一,函數(shù)返回0x21,如果和已設置的不一樣,函數(shù)返回0x02表示不能設置調(diào)用AP!不成功。uiSetBaud[in]將要設置的SAM_V波特率,只能為(同上)那些值,如果不是這些數(shù)值,返回也同上函數(shù)返回0x90一成功,0x1一端口打開失敗/端口號不合法,0x2-超時,設置不成功,0x21-uiCurrBaud,uiSetBaud輸入?yún)?shù)數(shù)值錯誤}打開串口/USBfunctionSDTOpenPort(iPort:integer):integer;stdcall;External1SDTAPLDLL,;{iPort[in]表示端口號,1-16(十進制)為串口,1001-1016(十進制)為USBロ,缺省的ー個USB設備端口是1001o函數(shù)返回0x90一打開端口成功,1ー打開端口失敗/端口號不合法}關閉串口/USBfunctionSDTClosePort(iPort:integer):integer;stdcall;External'SDTAPLDLL';{iPort[in]表示端口號,返回值0x90ー關閉串口成功,0x01一端口號不合法}對SAM_V復位functionSDT_ResetSAM(iPort:integer;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口號,目前串口和USB只支持16個,串口:0001-0016,USB:1001-1016。ilfOpen[in]表示不在該函數(shù)內(nèi)部打開和關閉串口,非〇表示在API函數(shù)內(nèi)部包含了打開串口和關閉串口函數(shù),之前不需要調(diào)用SDT_OpenPort和SDT_ClosePort返回值0x90ー成功,其他失敗}設置射頻適配器最大通信字節(jié)數(shù)functionSDTSetMaxRFByte(iPort:integer;ucByte:Char;blf0pen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口號,ucByte[in]無符號字符,24-255,表示射頻適配器最大通信字節(jié)數(shù),ilf0pen[in]參見SDT_ResetSAM返回值0x90ー成功,其他一失敗}對SAMV進行狀態(tài)檢測functionSDT_GetSAMStatus(iPort:integer;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口號,ilfOpen參見SDT_ResetSAM返回值0x90-SAMV正常,0x60一自檢失敗,不能接收命令,其他-命令失敗}讀取SAMV的編號functionSDT_GetSAMID(iPort:integer;pusSAMID:Pbyte;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iPort[in]表示端口號,pusSAMID[out]無符號字符串指針SAM_V編號,16字節(jié),返回值0x90ー成功,其他一失敗}讀取SAM_V的編號functionSDT_GetSAMIDToStr(iPort:integer;pcSAMID:Pbyte;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iport[in]表示端口號,pusSAMID[out]SAM_V編號,ilf0pen[in]整數(shù),參見SDT_ResetSAM返回值0x90ー成功,其他一失敗}開始找卡functionSDT_StartFindIDCard(iPort:integer;pucManalnfo:Pbyte;ilfOpen:integer):integer;stdcal1;External'SDTAPLDLL';{iport[in]表示端口號,pucManalnfo[out]無符號指針,證/卡芯片管理號,4個字節(jié),ilf0pen[in]參見SDT_ResetSAM返回值0x9fー找卡成功,0x80ー找卡失敗}選卡functionSDTSelectIDCard(iPort:integer;pucManaMsg:Pbyte;iIfOpen:integer):integer;stdcall;External,SDTAPLDLL,;{iPort[in]表示端口號,pucManaMsg[out]無符號指針,證/卡芯片序列號,8個字節(jié),ilfOpen[in]參見SDT_ResetSAM返回值0x90ー選卡成功,0x81ー選卡失敗}讀取卡體管理號functionSDTReadMnglnfo(iPort:integer;pucManageMsg:Pbyte;ilfOpen:integer):integer;stdcal1;External,SDTAPLDLL,;{iPort[in]表示端口號,pucManageMsg[out]無符號字符指針,卡體管理號,28字節(jié),ilfOpen[in]返回值0x90ー成功,其他ー讀失敗}讀取證/卡固定信息functionSDTReadBaseMsg(iPort:integerjpucCHMsg:Pbyte;puiCHMsgLen:Pinteger;pucPHMsg:Pbyte;puiPHMsgLen:Pinteger;ilfOpen:integer):integer;stdcal1;External,SDTAPLDLL,;{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;;stdcal1;External,SDTAPLDLL,;{iPort[in]表示端口號,pucAppMsg[out]指向讀到的追加信息,puiAppMsgLen[out]指向讀到的追加信息長度,ilfOpen[in]參見SDT_ResetSAM返回值0x90ー讀取追加信息成功,其他ー讀取追加信息失敗}照片解碼函數(shù)functionGetBmp(Wlt_File:PChar,intf:integer):integer;stdcal1;External*WltRS.dll,;{Wlt_File-wlt文件名,intf閱讀設備通訊接口類型(1-RS-232C,2-USB)返回值:生成?.bmp和以下返回信息:廠相片解碼正確,〇ー調(diào)用sdtapi.dll錯誤「1ー相片解碼錯誤,-2-wlt文件后綴錯誤,-3-wlt文件打開錯誤,-4-wit文件格式錯誤,-5ー軟件未授權,-6ー設備連接錯誤}不同機具的通用的第二代居民身份證讀寫C#2008-06-0615:19:47閱讀46評論1'?號:厶中小訂閱公安部已經(jīng)大規(guī)模在全國范圍內(nèi)推廣第二代居民身份證的換發(fā)工作,目前,許多地區(qū)二代證換發(fā)工作已經(jīng)進行了很久。但是,相對應于二代證的推廣,社會上許許多多的應用系統(tǒng)都還沒有對二代證讀卡開發(fā)相應的接口,為此,我寫了一個通用的二代證機具讀卡類,希望能對各位在各自的系統(tǒng)中開發(fā)這樣的接口提供幫助。本類僅僅提供讀卡的用法,寫卡的方式我并沒有寫在里面,但是,相應的寫調(diào)用我已經(jīng)聲明在里面,希望各位大俠能獨自研究應用。芻該類接口具有如下特點:1、通用于目前市場上各個機具廠商的二代證讀(寫)機具。(想想,為不同廠商開發(fā)不同的接口確實令人頭疼的,且由于接口不兼容,容易被客戶罵死!#)2、自動適應串口、USB口的各種機具3、能讀文字信息,但是,要想正確讀照片,必須需要機具廠商的授權文件Termb.Lic,且授權文件必須放在C盤根目錄下。(我總不能不照顧機具廠商的利益吧和)4、除了上面第三條之外,您甚至不用安裝機具的驅(qū)動程序,接上二代證機具即可使用。廢話少說,下面看實現(xiàn)方法:類如下:usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.Reflection;usingSystem.IO;namespaceICCard(publicclassclsICCard(〃首先,聲明通用接口[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_OpenPort(intiPortID);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ClosePort(intiPortID);[Dlllmport(,,sdtapi.dll,^)]publicstaticexternintSDT_PowerManagerBegin(intiPortID,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_AddSAMUser(intiPortID,stringpcUserName,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_SAMLogin(intiPortID,stringpcUserName,stringpcPasswd,intiIfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_SAMLogout(intiPortID,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_UserManagerOK(intiPortID,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ChangeOwnPwd(intiPortID,stringpcOldPasswd,stringpcNewPasswd,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_ChangeOtherPwd(intiPortID,stringpcUserName,stringpcNewPasswd,intilfOpen);[Dlllmportdsdtapi.dll")]publicstaticexternintSDT_DeleteSAMUser(intiPortID,stringpcUserName,intilfOpen);[DlllmportC'sdtapi.dll")]publicstaticexternintSDT_StartFindlDCard(intiPortID,refintpucllN,intilfOpen);[Dlllmport(,,sdtapi.dll,^)]publicstaticexternintSDT_SelectlDCard(intiPortID,refintpucSN,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ReadBaseMsg(intiPortID,stringpucCHMsg,refintpuiCHMsgLen,stringpucPHMsg,refintpuiPHMsgLen,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ReadBaseMsgToFile(intiPortID,stringfileNamel,refintpuiCHMsgLen,stringfileName2,refintpuiPHMsgLen,intilfOpen);[Dlllmport(Msdtapi.dll")]publicstaticexternintSDT_WriteAppMsg(intiPortID,refbytepucSendData,intuiSendLen,refbytepucRecvData,refintpuiRecvLen,intilfOpen);[DlllmportC^dtapi.dir')]publicstaticexternintSDT_WriteAppMsgOK(intiPortID,refbytepucData,intuiLen,intilfOpen);[DlllmportC^dtapi.dll")]publicstaticexternintSDT_CancelWriteAppMsg(intiPortID,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ReadNewAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport(',sdtapi.dll,^)]publicstaticexternintSDT_ReadAIIAppMsg(intiPortID,refbytepucAppMsg,refintpuiAppMsgLen,intilfOpen);[Dlllmport(,,sdtapi.dll,^)]publicstaticexternintSDT_UsableAppMsg(intiPortID,refbyteucByte,intilfOpen);[Dlllmport(Msdtapi.dll")]publicstaticexternintSDT_GetUnlockMsg(intiPortID,refbytestrMsg,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_GetSAMID(intiPortID,refbyteStrSAMID,intilfOpen);[DlllmportCsdtapi.dll")]publicstaticexternintSDT_SetMaxRFByte(intiPortID,byteucByte,intilfOpen);[Dlllmport(nsdtapi.dll")]publicstaticexternintSDT_ResetSAM(intiPortID,intilfOpen);[DIIImportCWItRS.dir')]publicstaticexternintGetBmp(stringfile_name,intintf);publicdelegatevoidDe_ReadlCCardComplete(clsEDZobjEDZ);publiceventDe_ReadlCCardCompleteReadICCardComplete;privatecIsEDZobjEDZ=newclsEDZ();privateintEdzilfOpen=1; 〃自動開關串口intEdziPortID;publicclslCCard()()publicboolReadlCCard(){boolbllsbPort=false;intintOpenPortRtn=0;intrtnTemp=0;intpucllN=0;intpucSN=0;intpuiCHMsgLen=0;intpuiPHMsgLen=0;objEDZ=newclsEDZ();〃檢測usbロ的機具連接,必須先檢測usbfor(intiPort=1001;iPort<=1016;iPort++)(intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn==144)(EdziPortID=iPort;bllsbPort=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.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(”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,Mzp.wlt",refpuiPHMsgLen,EdzilfOpen);if(rtnTemp!=144)(rtnTemp=SDTCIosePort(EdziPortlD);MessageBox.Show("讀卡失敗!",“提示“,MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;)〃下面解析照片,注意,如果在C盤根目錄下沒有機具廠商的授權文件Termb丄ic,照片解析將會失敗if(bUsbPort)rtnTemp=GetBmp(Mzp.wltM,2);elsertnTemp=GetBmp("zp.wltH,1);switch(rtnTemp){case0:MessageBox.Show("調(diào)用sdtapi.dl!錯誤!",“提示",MessageBoxButtons.OK,MessageBoxIcon.Error);break;case1:〃正常break;case-1:MessageBox.Show("相片解碼錯誤!","提示",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("設備連接錯誤!",“提示“,MessageBoxButtons.OK,MessageBoxIcon.Error);break;)rtnTemp=SDT_ClosePort(EdziPortlD);Fileinfof=newFilelnfo(Hwz.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.lDC=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^,4)+”年”+strTem.Substring(4,2)+”月”+strTem.Substring(6,2)+”日”);strTem=strTem.Substring(8);if(strTem.Trim()!=”長期”)(objEDZ.ENDDATE=Convert.ToDateTime(strTem.Substring(0,4)+“年"+strTem.Substring(4,2)+”月”+strTem.Substring(6,2)+”日”);)elseobjEDZ.ENDDATE=DateTime.MaxValue;}objFile=newFilelnfo(wzp.bmpM);if(objFile.Exists)(Imageimg=Image.FromFile("zp.bmp");objEDZ.PICJmage=(lmage)img.Clone();System.IO.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;〃有效期限代碼,許多原來系統(tǒng)上面為了一代證考慮,常常存在這樣的字段,二代證中已經(jīng)沒有了privatestring_Period_Of_Validity_CName;〃有效期限privatebyte[]_PIC_Byte;〃照片二進制privateImage_PIC_lmage;〃照片publiccIsEDZQlstMZ.Add(“01"IstM乙Add(“02”IstM乙Add(“03"IstM乙Add(“04”lstMZ.Add("05"lstMZ.Add(“06"lstMZ.Add(“07”lstMZ.Add(“08”lstMZ.Add(009MIstM乙Add(“1O”lstMZ.Add(Hir,lstMZ.Add(h12MIstM乙Add(“13”IstM乙Add(“14"lstMZ.Add(M15nlstMZ.Add(M16"lstMZ.Ad

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論