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

下載本文檔

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

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論