日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#读IC卡程序 Mwic_32.dll

發布時間:2023/12/8 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#读IC卡程序 Mwic_32.dll 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:歡迎轉載,但是請保留出處說明 https://blog.csdn.net/lanwilliam/article/details/6662291

C#程序開發范例寶典 13.3 IC卡應用?
http://book.csdn.net/ 2007-9-7 16:37:00
圖書導讀 當前章節:13.3 IC卡應用·1.14 其他技術·13.1 串口控制·13.2 加密狗·13.4 監控·13.5 語音卡控制·13.6 手機程序開發加拿大·達內專注高端it培訓名企定向委培
為納斯達克上市公司定向委培高級軟件工程師 國內最強大專家團隊組合授課,確保高薪就業
www.tarena.com.cn
管理不可能管理的項目!
要減少失敗的風險 組織必須轉向 IT 開發的治理模型
doc.csdn.net
如何開發智能客戶端應用
離線應用模塊的合理利用
www.intel.com/cd/ids...

13.3? IC卡應用
IC(Integrated Circuit)卡,也被稱作智能卡(Smart Card),具有寫入數據和存儲數據的功能,IC卡內存儲器的內容可以根據需要有條件地供外部讀取,完成信息處理和判定。由于其內部具有集成電路,不但可以存儲大量信息,具有極強的保密性能,并且還具有抗干擾、無磨損、壽命長等特性。因此在各個領域中得到廣泛應用。下面通過兩個實例介紹IC卡的簡單應用。

實例422 向IC卡中寫入數據

實例說明
IC卡是攜帶應用信息和數據的媒體,空白IC卡是不能立即使用的,必須對IC卡應用系統進行初始化,寫入系統IC卡和個人密碼,個人專用信息和應用數據。下面介紹如何向IC卡中寫入數據。運行本例,在“數據”文本框中輸入要存入IC卡中的數據,單擊“寫數據”按鈕,即可將輸入的數據寫入IC卡中。如圖13.6所示。

技術要點
本例使用的是深圳明華生產的明華IC卡讀寫器,用戶在使用時將驅動程序安裝完畢后,即可正常使用本系統。

本例通過調用Mwic_32.dll鏈接庫,進行IC卡的讀寫工作。下面介紹與IC卡寫操作相關的幾個函數。

(1)auto_init函數

該函數用于初始化IC卡讀卡器。語法如下:

public static extern int auto_init(int port, int baud);

參數說明如下。

l???? port:標識端口號,Com1對應的端口號為0;Com2對應的端口號為1,依此類推。

l???? baud:標識波特率。

l???? 返回值:如果初始化成功,返回值是IC卡設備句柄;如果初始化失敗,返回值小于零。

(2)setsc_md函數

該函數用于設置設備密碼模式。語法如下:

public static extern int setsc_md(int icdev, int mode);

參數說明如下。

l???? icdev:標識設備句柄,通常是auto_init函數的返回值。

l???? mode:標識設備密碼模式,如果為0,設備密碼有效,設備在加電時必須驗證設備密碼才能對設備進行操作。如果為1,設備密碼無效。

l???? 返回值:如果函數執行成功返回值為零,否則小于零。

(3)get_status函數

該函數用于獲取設備的當前狀態。語法如下:

public static extern Int16 get_status(int icdev, Int16* state);

參數說明如下。

l???? icdev:標識設備句柄,通常是auto_init函數的返回值。

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

l???? 返回值:如果函數執行成功返回值為零,否則小于零。

(4)csc_4442函數

該函數用于核對IC卡密碼。語法如下:

public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);

參數說明如下。

l???? icdev:標識設備句柄,通常是auto_init函數的返回值。

l???? len:標識密碼長度,其值為3。

l???? p_string:標識設置的密碼。

l???? 返回值:如果函數執行成功返回值為零,否則小于零。

(5)swr_4442函數

該函數用于向IC卡中寫入數據。語法如下:

public static extern int swr_4442(int icdev, int offset, int len, char* w_string);

參數說明如下。

l???? icdev:標識設備句柄,通常是auto_init函數的返回值。

l???? offset:標識地址的偏移量,范圍是0~255。

l???? len:標識字符串長度。

l???? w_string:標識寫入的數據。

(6)ic_exit函數

該函數用于關閉設備端口。語法如下:

public static extern int ic_exit(int icdev);

參數說明如下。

l???? icdev:標識設備句柄,通常是auto_init函數的返回值。

(7)dv_beep函數

該函數使讀卡器嗡鳴。語法如下:

public static extern int dv_beep(int icdev, int time);

參數說明如下。

l???? icdev:標識設備句柄,通常是auto_init函數的返回值。

l???? time:標識嗡鳴持續的時間,單位是10毫秒。

實現過程
(1)新建一個項目,命名為Ex13_05,默認窗體為Form1。

(2)在Form1窗體中,主要添加兩個Button控件,用于執行向卡中寫入數據和退出程序的操作,添加一個TextBox控件,將TextBox中數據寫入IC卡中。

(3)主要程序代碼。

將程序所使用的操作IC卡的函數,封裝在類IC中。代碼如下:

[StructLayout(LayoutKind.Sequential)]

public unsafe class IC

{

??? //對設備進行初始化

??? [DllImport("Mwic_32.dll", EntryPoint = "auto_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

??? public static extern int auto_init(int port, int baud);

??? //設備密碼格式

??? [DllImport("Mwic_32.dll", EntryPoint = "setsc_md", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

??? public static extern int setsc_md(int icdev, int mode);

??? //獲取設備當前狀態

??? [DllImport("Mwic_32.dll", EntryPoint = "get_status", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

??? public static extern Int16 get_status(int icdev, Int16* state);

??? //關閉設備通訊接口

??? [DllImport("Mwic_32.dll", EntryPoint = "ic_exit", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

??? public static extern int ic_exit(int icdev);

??? //使設備發出蜂鳴聲

??? [DllImport("Mwic_32.dll", EntryPoint = "dv_beep", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

??? public static extern int dv_beep(int icdev, int time);

??? //向IC卡中寫數據

??? [DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

??? public static extern int swr_4442(int icdev, int offset, int len, char* w_string);

??? //核對卡密碼?

??? [DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]

??? public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);

}

下面代碼主要用于將TextBox中數據寫入到IC卡中。代碼如下:

??????? private void button1_Click(object sender, EventArgs e)

??????? {

??????????? //初始化

??????????? int icdev = IC.auto_init(0, 9600);

??????????? if (icdev < 0)

??????????????? MessageBox.Show("端口初始化失敗,請檢查接口線是否連接正確。","錯誤提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

??????????? int md = IC.setsc_md(icdev, 1); //設備密碼格式

??????????? unsafe

??????????? {

??????????????? Int16 status = 0;

??????????????? Int16 result = 0;

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

??????????????? if (result != 0)

??????????????? {

??????????????????? MessageBox.Show("設備當前狀態錯誤!");

??????????????????? int d1 = IC.ic_exit(icdev);?? //關閉設備

??????????????????? return;

??????????????? }

??????????????? if (status != 1)

??????????????? {

??????????????????? MessageBox.Show("請插入IC卡");

??????????????????? int d2 = IC.ic_exit(icdev);?? //關閉設備

??????????????????? return;

??????????????? }

??????????? }

??????????? unsafe

??????????? {

??????????????? //卡的密碼默認為6個f(密碼為:ffffff),1個f的16進制是15,兩個f的16進制是255

??????????????? byte[] pwd = new byte[3] { 255, 255, 255 };

??????????????? //byte[] pwd = new byte[3] { 0xff, 0xff, 0xff };

??????????????? //char[] pass=new ch{0xff,0xff,0xff};

??????????????? Int16 checkIC_pwd = IC.Csc_4442(icdev, 3, pwd);

??????????????? if (checkIC_pwd < 0)

??????????????? {

??????????????????? MessageBox.Show("IC卡密碼錯誤!");

??????????????????? return;

??????????????? }

??????????????? char str = 'a';

??????????????? int write=-1;

??????????????? for (int j = 0; j < textBox1.Text.Length; j++)

??????????????? {

??????????????????? str = Convert.ToChar(textBox1.Text.Substring(j, 1));

??????????????????? write = IC.swr_4442(icdev, 33 + j, textBox1.Text.Length, &str);

??????????????? }

??????????????? if (write == 0)

??????????????? {

??????????????????? int beep = IC.dv_beep(icdev, 20);? //發出蜂鳴聲

??????????????????? MessageBox.Show("數據已成功寫入IC卡中!");

??????????????? }

??????????????? else

??????????????????? MessageBox.Show("數據寫入IC卡失敗!");

??????????? }

??????????? int d = IC.ic_exit(icdev);? //關閉設備

??????? }

舉一反三
根據本實例,讀者可以實現以下功能。

? 在圖書借閱中使用IC卡。

? 利用IC卡控制上網。

實例423 讀取IC卡中的數據

實例說明
向IC卡寫入數據后,就可以進行讀卡操作了。運行本例,將寫入數據的IC卡插入讀卡器,單擊【讀卡】按鈕,IC卡中的數據將顯示在文本框中。如圖13.7所示。

技術要點
本例中主要調用srd_4442函數讀取IC卡中的數據,相關函數介紹請參考實例“向IC卡中寫入數據”中的“技術要點”部分。這里只介紹讀卡函數。

q srd_4442函數

該函數用于讀取IC卡中的數據。語法如下:

public static extern int srd_4442(int icdev, int offset, int len, char* r_string);

參數說明如下。

l???? icdev:標識設備句柄,通常是auto_init函數的返回值。

l???? offset:標識地址的偏移量,范圍是0~255。

l???? len:標識字符串長度。

l???? r_string:用于存儲返回的數據。

實現過程
(1)新建一個項目,命名為Ex13_06,默認窗體為Form1。

(2)在Form1窗體中,主要添加兩個Button控件,用于讀取卡中的數據和退出程序,添加一個TextBox控件,顯示卡中的數據。

(3)主要程序代碼。

??????? private void button1_Click(object sender, EventArgs e)

??????? {

??????????? //初始化

??????????? int icdev = IC.auto_init(0, 9600);

??????????? if (icdev < 0)

??????????????? MessageBox.Show("端口初始化失敗,請檢查接口線是否連接正確。", "錯誤提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

??????????? int md = IC.setsc_md(icdev, 1); //設備密碼格式

??????????? int i = IC.dv_beep(icdev, 10);? //發出蜂鳴聲

??????????? unsafe

??????????? {

??????????????? Int16 status = 0;

??????????????? Int16 result = 0;

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

??????????????? if (result != 0)

??????????????? {

??????????????????? MessageBox.Show("設備當前狀態錯誤!");

??????????????????? int d1 = IC.ic_exit(icdev);?? //關閉設備

??????????????????? return;

??????????????? }

??????????????? if (status != 1)

??????????????? {

??????????????????? MessageBox.Show("請插入IC卡");

??????????????????? int d2 = IC.ic_exit(icdev);?? //關閉設備

??????????????????? return;

??????????????? }

??????????? }

??????????? unsafe

??????????? {

??????????????? char str = 'a';

??????????????? int read = -1;

??????????????? for (int j = 0; j < 6; j++)

??????????????? {

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

??????????????????? textBox1.Text = textBox1.Text + Convert.ToString(str);

??????????????? }

??????????????? if (read == 0)

??????????????????? MessageBox.Show("IC卡中數據讀取成功!");

??????????? }

??????????? int d = IC.ic_exit(icdev);? //關閉設備

??????? }

舉一反三
根據本實例,讀者可以開發以下程序。

? 讀取IC卡電話系統。

? 公交車刷卡系統。

實例424 利用IC卡制作考勤程序

實例說明
IC卡廣泛應用于各行業,包括銀行卡、公交車刷卡系統、讀書卡等。下面介紹使用IC卡制作簡單的公司考勤系統。運行本例,單擊【刷卡】按鈕,即可對員工進行考勤。實現效果如圖13.8所示。

技術要點
有關IC卡的操作函數請參考實例“向IC卡中寫入數據”和“讀取IC卡中的數據”中的“技術要點”部分。

下面主要介紹通過IC卡如何實現員工考勤。主要將寫入IC卡中的卡號讀取出來,然后從數據表中查詢員工信息。具體代碼請參考實現過程。

實現過程
(1)新建一個項目,命名為Ex13_07,默認窗體為Form1。

(2)在Form1窗體中,主要添加5個TextBox控件和6個Label控件,用途如圖13.7所示,添加一個Button控件,執行刷IC卡命令。

(3)主要程序代碼。

??????? private void button1_Click(object sender, EventArgs e)

??????? {

??????????? //初始化

??????????? int icdev = IC.auto_init(0, 9600);

??????????? if (icdev < 0)

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

??????????? unsafe

??????????? {

??????????????? Int16 status = -1;

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

??????????????? int md = IC.setsc_md(icdev, 1);?? //設備密碼格式

??????????????? if (result < 0)

??????????????? {

??????????????????? int d1 = IC.ic_exit(icdev);? //關閉設備

??????????????????? return;

??????????????? }

??????????????? else if ((result == 0) && (status == 0))

??????????????? {

??????????????????? int d2 = IC.ic_exit(icdev);? //關閉設備

??????????????????? label6.Text = "請插入IC卡";

??????????????????? return;

??????????????? }

??????????? }

??????????? unsafe

??????????? {

??????????????? char str = 'a';

??????????????? int read = -1;

??????????????? string ic = "";

??????????????? for (int j = 0; j < 6; j++)

??????????????? {

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

??????????????????? ic = ic + Convert.ToString(str);

??????????????? }

??????????????? textBox1.Text = ic;

??????????????? if (read == 0)

??????????????????? label6.Text = "刷卡成功!";

??????????????? int beep = IC.dv_beep(icdev, 20);? //發出蜂鳴聲

??????????????? int d3 = IC.ic_exit(icdev);?? //關閉設備

??????????? }

??????????? int d = IC.ic_exit(icdev);? //關閉設備

??????????? //根據卡號,查找相應數據

??????????? OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + "price.mdb" + ";Persist Security Info=False");

??????????? OleDbDataAdapter dap = new OleDbDataAdapter("select * from worker where ICID='"+textBox1.Text+"'", con);

??????????? DataSet ds = new DataSet();

??????????? dap.Fill(ds, "table");

??????????? if (ds.Tables.Count > 0)

??????????? {

??????????????? textBox2.Text = ds.Tables[0].Rows[0][0].ToString();

??????????????? textBox3.Text = ds.Tables[0].Rows[0][1].ToString();

??????????????? textBox4.Text = ds.Tables[0].Rows[0][2].ToString();

??????????????? textBox5.Text = ds.Tables[0].Rows[0][3].ToString();

??????????? }

??????????? else

??????????? {

??????????????? label6.Text = "不存在該用戶!";

??????????? }

??????? }

</div></div>

總結

以上是生活随笔為你收集整理的C#读IC卡程序 Mwic_32.dll的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。