91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 0.01M
    文件類型: .txt
    金幣: 1
    下載: 0 次
    發布日期: 2020-12-14
  • 語言: C#
  • 標簽: IC卡??C#??c??開發??

資源簡介

http://www.cnblogs.com/lxchco95/articles/1235804.html

C#程序開發范例_IC卡讀寫

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 = "不存在該用戶!";

            }

        }

資源截圖

代碼片段和文件信息

評論

共有 條評論