C#如何讀取IC卡,IC卡的操作代碼_第1頁
C#如何讀取IC卡,IC卡的操作代碼_第2頁
C#如何讀取IC卡,IC卡的操作代碼_第3頁
C#如何讀取IC卡,IC卡的操作代碼_第4頁
C#如何讀取IC卡,IC卡的操作代碼_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

-.zC*程序開發(fā)*例_IC卡讀寫C*程序開發(fā)*例寶典13.3IC卡應(yīng)用

/2007-9-716:37:00

圖書導(dǎo)讀當(dāng)前章節(jié):13.3IC卡應(yīng)用·1.14其他技術(shù)·13.1串口控制·13.2加密狗·13.4監(jiān)控·13.5語音卡控制·13.6手機(jī)程序開發(fā)加拿大·達(dá)內(nèi)專注高端it培訓(xùn)名企定向委培

為納斯達(dá)克上市公司定向委培高級軟件工程師國內(nèi)最強(qiáng)大專家團(tuán)隊(duì)組合授課,確保高薪就業(yè)

.tarena..

管理不可能管理的工程!

要減少失敗的風(fēng)險(xiǎn)組織必須轉(zhuǎn)向IT開發(fā)的治理模型

如何開發(fā)智能客戶端應(yīng)用

離線應(yīng)用模塊的合理利用

.intel./cd/ids...13.3

IC卡應(yīng)用

IC〔IntegratedCircuit〕卡,也被稱作智能卡〔SmartCard〕,具有寫入數(shù)據(jù)和存儲數(shù)據(jù)的功能,IC卡內(nèi)存儲器的內(nèi)容可以根據(jù)需要有條件地供外部讀取,完成信息處理和判定。由于其內(nèi)部具有集成電路,不但可以存儲大量信息,具有極強(qiáng)的**性能,并且還具有抗干擾、無磨損、壽命長等特性。因此在各個(gè)領(lǐng)域中得到廣泛應(yīng)用。下面通過兩個(gè)實(shí)例介紹IC卡的簡單應(yīng)用。實(shí)例422向IC卡中寫入數(shù)據(jù)實(shí)例說明

IC卡是攜帶應(yīng)用信息和數(shù)據(jù)的媒體,空白IC卡是不能立即使用的,必須對IC卡應(yīng)用系統(tǒng)進(jìn)展初始化,寫入系統(tǒng)IC卡和個(gè)人密碼,個(gè)人專用信息和應(yīng)用數(shù)據(jù)。下面介紹如何向IC卡中寫入數(shù)據(jù)。運(yùn)行本例,在“數(shù)據(jù)〞文本框中輸入要存入IC卡中的數(shù)據(jù),單擊“寫數(shù)據(jù)〞按鈕,即可將輸入的數(shù)據(jù)寫入IC卡中。如圖13.6所示。技術(shù)要點(diǎn)

本例使用的是**明華生產(chǎn)的明華IC卡讀寫器,用戶在使用時(shí)將驅(qū)動(dòng)程序安裝完畢后,即可正常使用本系統(tǒng)。本例通過調(diào)用Mwic_32.dll庫,進(jìn)展IC卡的讀寫工作。下面介紹與IC卡寫操作相關(guān)的幾個(gè)函數(shù)?!?〕auto_init函數(shù)該函數(shù)用于初始化IC卡讀卡器。語法如下:publicstatice*ternintauto_init(intport,intbaud);參數(shù)說明如下。l

port:標(biāo)識端口號,1對應(yīng)的端口號為0;2對應(yīng)的端口號為1,依此類推。l

baud:標(biāo)識波特率。l

返回值:如果初始化成功,返回值是IC卡設(shè)備句柄;如果初始化失敗,返回值小于零?!?〕setsc_md函數(shù)該函數(shù)用于設(shè)置設(shè)備密碼模式。語法如下:publicstatice*ternintsetsc_md(inticdev,intmode);參數(shù)說明如下。l

icdev:標(biāo)識設(shè)備句柄,通常是auto_init函數(shù)的返回值。l

mode:標(biāo)識設(shè)備密碼模式,如果為0,設(shè)備密碼有效,設(shè)備在加電時(shí)必須驗(yàn)證設(shè)備密碼才能對設(shè)備進(jìn)展操作。如果為1,設(shè)備密碼無效。l

返回值:如果函數(shù)執(zhí)行成功返回值為零,否則小于零。〔3〕get_status函數(shù)該函數(shù)用于獲取設(shè)備的當(dāng)前狀態(tài)。語法如下:publicstatice*ternInt16get_status(inticdev,Int16*state);參數(shù)說明如下。l

icdev:標(biāo)識設(shè)備句柄,通常是auto_init函數(shù)的返回值。l

state:用于接收函數(shù)返回的結(jié)果。如果為0表示讀卡器中無卡,為1表示讀卡器中有卡。l

返回值:如果函數(shù)執(zhí)行成功返回值為零,否則小于零?!?〕csc_4442函數(shù)該函數(shù)用于核對IC卡密碼。語法如下:publicstatice*ternInt16Csc_4442(inticdev,intlen,[MarshalAs(UnmanagedType.LPArray)]byte[]p_string);參數(shù)說明如下。l

icdev:標(biāo)識設(shè)備句柄,通常是auto_init函數(shù)的返回值。l

len:標(biāo)識密碼長度,其值為3。l

p_string:標(biāo)識設(shè)置的密碼。l

返回值:如果函數(shù)執(zhí)行成功返回值為零,否則小于零?!?〕swr_4442函數(shù)該函數(shù)用于向IC卡中寫入數(shù)據(jù)。語法如下:publicstatice*ternintswr_4442(inticdev,intoffset,intlen,char*w_string);參數(shù)說明如下。l

icdev:標(biāo)識設(shè)備句柄,通常是auto_init函數(shù)的返回值。l

offset:標(biāo)識地址的偏移量,*圍是0~255。l

len:標(biāo)識字符串長度。l

w_string:標(biāo)識寫入的數(shù)據(jù)?!?〕ic_e*it函數(shù)該函數(shù)用于關(guān)閉設(shè)備端口。語法如下:publicstatice*ternintic_e*it(inticdev);參數(shù)說明如下。l

icdev:標(biāo)識設(shè)備句柄,通常是auto_init函數(shù)的返回值?!?〕dv_beep函數(shù)該函數(shù)使讀卡器嗡鳴。語法如下:publicstatice*ternintdv_beep(inticdev,inttime);參數(shù)說明如下。l

icdev:標(biāo)識設(shè)備句柄,通常是auto_init函數(shù)的返回值。l

time:標(biāo)識嗡鳴持續(xù)的時(shí)間,單位是10毫秒。實(shí)現(xiàn)過程

〔1〕新建一個(gè)工程,命名為E*13_05,默認(rèn)窗體為Form1?!?〕在Form1窗體中,主要添加兩個(gè)Button控件,用于執(zhí)行向卡中寫入數(shù)據(jù)和退出程序的操作,添加一個(gè)Te*tBo*控件,將Te*tBo*中數(shù)據(jù)寫入IC卡中?!?〕主要程序代碼。將程序所使用的操作IC卡的函數(shù),封裝在類IC中。代碼如下:[StructLayout(LayoutKind.Sequential)]publicunsafeclassIC{

//對設(shè)備進(jìn)展初始化

[DllImport("Mwic_32.dll",EntryPoint="auto_init",SetLastError=true,CharSet=CharSet.Ansi,E*actSpelling=true,CallingConvention=CallingConvention.StdCall)]

publicstatice*ternintauto_init(intport,intbaud);

//設(shè)備密碼格式

[DllImport("Mwic_32.dll",EntryPoint="setsc_md",SetLastError=true,CharSet=CharSet.Ansi,E*actSpelling=true,CallingConvention=CallingConvention.StdCall)]

publicstatice*ternintsetsc_md(inticdev,intmode);

//獲取設(shè)備當(dāng)前狀態(tài)

[DllImport("Mwic_32.dll",EntryPoint="get_status",SetLastError=true,CharSet=CharSet.Ansi,E*actSpelling=true,CallingConvention=CallingConvention.StdCall)]

publicstatice*ternInt16get_status(inticdev,Int16*state);

//關(guān)閉設(shè)備通訊接口

[DllImport("Mwic_32.dll",EntryPoint="ic_e*it",SetLastError=true,CharSet=CharSet.Ansi,E*actSpelling=true,CallingConvention=CallingConvention.StdCall)]

publicstatice*ternintic_e*it(inticdev);

//使設(shè)備發(fā)出蜂鳴聲

[DllImport("Mwic_32.dll",EntryPoint="dv_beep",SetLastError=true,CharSet=CharSet.Ansi,E*actSpelling=true,CallingConvention=CallingConvention.StdCall)]

publicstatice*ternintdv_beep(inticdev,inttime);

//向IC卡中寫數(shù)據(jù)

[DllImport("Mwic_32.dll",EntryPoint="swr_4442",SetLastError=true,CharSet=CharSet.Ansi,E*actSpelling=true,CallingConvention=CallingConvention.StdCall)]

publicstatice*ternintswr_4442(inticdev,intoffset,intlen,char*w_string);

//核對卡密碼

[DllImport("Mwic_32.dll",EntryPoint="csc_4442",SetLastError=true,CharSet=CharSet.Auto,E*actSpelling=true,CallingConvention=CallingConvention.Winapi)]

publicstatice*ternInt16Csc_4442(inticdev,intlen,[MarshalAs(UnmanagedType.LPArray)]byte[]p_string);}下面代碼主要用于將Te*tBo*中數(shù)據(jù)寫入到IC卡中。代碼如下:

privatevoidbutton1_Click(objectsender,EventArgse)

{

//初始化

inticdev=IC.auto_init(0,9600);

if(icdev<0)

MessageBo*.Show("端口初始化失敗,請檢查接口線是否連接正確。","錯(cuò)誤提示",MessageBo*Buttons.OK,MessageBo*Icon.Information);

intmd=IC.setsc_md(icdev,1);//設(shè)備密碼格式

unsafe

{

Int16status=0;

Int16result=0;

result=IC.get_status(icdev,&status);

if(result!=0)

{

MessageBo*.Show("設(shè)備當(dāng)前狀態(tài)錯(cuò)誤!");

intd1=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

return;

}

if(status!=1)

{

MessageBo*.Show("請插入IC卡");

intd2=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

return;

}

}

unsafe

{

//卡的密碼默認(rèn)為6個(gè)f〔密碼為:ffffff〕,1個(gè)f的16進(jìn)制是15,兩個(gè)f的16進(jìn)制是255

byte[]pwd=newbyte[3]{255,255,255};

//byte[]pwd=newbyte[3]{0*ff,0*ff,0*ff};

//char[]pass=newch{0*ff,0*ff,0*ff};

Int16checkIC_pwd=IC.Csc_4442(icdev,3,pwd);

if(checkIC_pwd<0)

{

MessageBo*.Show("IC卡密碼錯(cuò)誤!");

return;

}

charstr='a';

intwrite=-1;

for(intj=0;j<te*tBo*1.Te*t.Length;j++)

{

str=Convert.ToChar(te*tBo*1.Te*t.Substring(j,1));

write=IC.swr_4442(icdev,33+j,te*tBo*1.Te*t.Length,&str);

}

if(write==0)

{

intbeep=IC.dv_beep(icdev,20);

//發(fā)出蜂鳴聲

MessageBo*.Show("數(shù)據(jù)已成功寫入IC卡中!");

}

else

MessageBo*.Show("數(shù)據(jù)寫入IC卡失敗!");

}

intd=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

}舉一反三

根據(jù)本實(shí)例,讀者可以實(shí)現(xiàn)以下功能。

在圖書借閱中使用IC卡。

利用IC卡控制上網(wǎng)。實(shí)例423讀取IC卡中的數(shù)據(jù)實(shí)例說明

向IC卡寫入數(shù)據(jù)后,就可以進(jìn)展讀卡操作了。運(yùn)行本例,將寫入數(shù)據(jù)的IC卡插入讀卡器,單擊【讀卡】按鈕,IC卡中的數(shù)據(jù)將顯示在文本框中。如圖13.7所示。技術(shù)要點(diǎn)

本例中主要調(diào)用srd_4442函數(shù)讀取IC卡中的數(shù)據(jù),相關(guān)函數(shù)介紹請參考實(shí)例“向IC卡中寫入數(shù)據(jù)〞中的“技術(shù)要點(diǎn)〞局部。這里只介紹讀卡函數(shù)。qsrd_4442函數(shù)該函數(shù)用于讀取IC卡中的數(shù)據(jù)。語法如下:publicstatice*ternintsrd_4442(inticdev,intoffset,intlen,char*r_string);參數(shù)說明如下。l

icdev:標(biāo)識設(shè)備句柄,通常是auto_init函數(shù)的返回值。l

offset:標(biāo)識地址的偏移量,*圍是0~255。l

len:標(biāo)識字符串長度。l

r_string:用于存儲返回的數(shù)據(jù)。實(shí)現(xiàn)過程

〔1〕新建一個(gè)工程,命名為E*13_06,默認(rèn)窗體為Form1。〔2〕在Form1窗體中,主要添加兩個(gè)Button控件,用于讀取卡中的數(shù)據(jù)和退出程序,添加一個(gè)Te*tBo*控件,顯示卡中的數(shù)據(jù)。〔3〕主要程序代碼。

privatevoidbutton1_Click(objectsender,EventArgse)

{

//初始化

inticdev=IC.auto_init(0,9600);

if(icdev<0)

MessageBo*.Show("端口初始化失敗,請檢查接口線是否連接正確。","錯(cuò)誤提示",MessageBo*Buttons.OK,MessageBo*Icon.Information);

intmd=IC.setsc_md(icdev,1);//設(shè)備密碼格式

inti=IC.dv_beep(icdev,10);

//發(fā)出蜂鳴聲

unsafe

{

Int16status=0;

Int16result=0;

result=IC.get_status(icdev,&status);

if(result!=0)

{

MessageBo*.Show("設(shè)備當(dāng)前狀態(tài)錯(cuò)誤!");

intd1=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

return;

}

if(status!=1)

{

MessageBo*.Show("請插入IC卡");

intd2=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

return;

}

}

unsafe

{

charstr='a';

intread=-1;

for(intj=0;j<6;j++)

{

read=IC.srd_4442(icdev,33+j,1,&str);

te*tBo*1.Te*t=te*tBo*1.Te*t+Convert.ToString(str);

}

if(read==0)

MessageBo*.Show("IC卡中數(shù)據(jù)讀取成功!");

}

intd=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

}舉一反三

根據(jù)本實(shí)例,讀者可以開發(fā)以下程序。

讀取IC卡系統(tǒng)。

公交車刷卡系統(tǒng)。實(shí)例424利用IC卡制作考勤程序?qū)嵗f明

IC卡廣泛應(yīng)用于各行業(yè),包括銀行卡、公交車刷卡系統(tǒng)、讀書卡等。下面介紹使用IC卡制作簡單的公司考勤系統(tǒng)。運(yùn)行本例,單擊【刷卡】按鈕,即可對員工進(jìn)展考勤。實(shí)現(xiàn)效果如圖13.8所示。技術(shù)要點(diǎn)

有關(guān)IC卡的操作函數(shù)請參考實(shí)例“向IC卡中寫入數(shù)據(jù)〞和“讀取IC卡中的數(shù)據(jù)〞中的“技術(shù)要點(diǎn)〞局部。下面主要介紹通過IC卡如何實(shí)現(xiàn)員工考勤。主要將寫入IC卡中的卡號讀取出來,然后從數(shù)據(jù)表中查詢員工信息。具體代碼請參考實(shí)現(xiàn)過程。實(shí)現(xiàn)過程

〔1〕新建一個(gè)工程,命名為E*13_07,默認(rèn)窗體為Form1。〔2〕在Form1窗體中,主要添加5個(gè)Te*tBo*控件和6個(gè)Label控件,用途如圖13.7所示,添加一個(gè)Button控件,執(zhí)行刷IC卡命令。〔3〕主要程序代碼。

privatevoidbutton1_Click(objectsender,EventArgse)

{

//初始化

inticdev=IC.auto_init(0,9600);

if(icdev<0)

label6.Te*t="端口初始化失敗,請檢查接口線是否連接正確。";

unsafe

{

Int16status=-1;

Int16result=IC.get_status(icdev,&status);

intmd=IC.setsc_md(icdev,1);

//設(shè)備密碼格式

if(result<0)

{

intd1=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

return;

}

elseif((result==0)&&(status==0))

{

intd2=IC.ic_e*it(icdev);

//關(guān)閉設(shè)備

label6.Te*t="請插入IC卡";

return;

}

}

unsafe

{

charstr='a';

intread=-1;

stringic=";

for(intj=0;j<6;j++)

{

read=IC.srd_4442(icdev,33+j,1,&str);

ic=ic+Convert.ToString(str);

}

te*tB

溫馨提示

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

評論

0/150

提交評論