操作IC卡

public partial class ReadCard : Form
    {
        // 操作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);
        }

        public ReadCard()
        {
            InitializeComponent();
        }

        // 下面主要是 将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,2个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);  //关闭设备

            //根据卡号,查找相应数据

            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
            {
                MessageBox.Show("不存在该用户!");
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();

        }
    }
}
时间: 2024-08-10 21:30:42

操作IC卡的相关文章

PLC与IC卡读卡器

由于IC卡的便利性,IC卡的应用越来越广泛,在PLC上嵌入IC卡读卡器的案例越来越多.为了将PLC与IC卡读卡器 连接变得简单和稳定,友我科技推出了两款专门针对PLC的IC卡读卡器,使用Modbus-rtu通信协议,与PLC的标准 外部设备完全兼容.友我科技的这两款读卡器型号分别为YW-630和YW-631. 工业级PLC专用IC卡读卡器YW-631的特点:工业级Modbus接口的IC卡读卡器支持卡: ISO14443A卡,S50,S70等采用稳定可靠的隔离技术将RS485总线的干扰冲击全部与系

IC卡的传输协议(2)-块传输协议T=1续【转】

转自:http://bbs.ednchina.com/BLOG_ARTICLE_172025.HTM (3)容错操作 先来看一下容错的规则定义. * 复位应答后,第一个数据块是由终端发往IC卡的,而且只能是一个I块或S块.      * 若终端不希望使用长度为32Byte的IFSD初始值,则应向IC卡发送一个S块(IFS请求),S块(IFS请求)的PCB应具有值CI以表明是一个改变IFSD的请求.INF域包含一个字节,其值表示在所要求的IFSD的字节数,取值为0x20-0xFE.IC卡应向终端回

IC卡解密从零开始学2 版本更新! 解密工具PN532-mfoc-mfcuk-GUI V2.1 By:lookyour

程序更新 更新内容最下面 2017/5/3 V2.1====================================== 最简要介绍下M1卡数据结构 目前能看到的有2种M1卡,分别为S50 S70,其实就是容量不一样, S50为1Kbyte  S70为4Kbyte主要介绍S50 即1K卡   4K卡很少见 S50容量1Kbyte,16个扇区(Sector),每个扇区4块(Block)(块0-3),共64块,按块号编址为0-63.每个扇区有独立的一组密码及访问控制.第0扇区的块0(即绝对地

IC卡文件系统的逻辑结构【转】

转自:http://bbs.ednchina.com/BLOG_ARTICLE_172028.HTM 文件系统是COS的重要模块之一,它负责组织.管理.维护IC卡内存储的所有数据.文件系统的设计和实现既是COS系统中最灵活.最有个性的部分,也是对系统整体结构影响最大的模块之一. 在IC卡内,数据的管理和维护一般通过文件系统来进行.和PC系统类似,COS的文件系统要实现的主要功能包括: * 空间的管理维护.   * 数据的有效存储.   * 数据的查找和定位.   * 数据的修改和维护. 在COS

IC卡的传输协议(1)-字符传输协议T=0【转】

转自:http://bbs.ednchina.com/BLOG_ARTICLE_172022.HTM 在异步半双工传输协议中,主要定义了终端为实现传输控制和特殊需要发出的命令及这些命令的处理过程. 在传输协议中定义了两种协议:字符传输协议(T=0)和块传输协议(T=1).IC卡可以选择支持T=0协议或者T=1协议,终端一般都支持这两种协议.在ATR中的TD1规定了后续传输中所采用的传输协议(T=0或T=1),如果TD1在ATR中不存在的话则假定采用T=0.如果在ATR之后卡片与终端之间没有参数协

IC卡的传输协议(2)-块传输协议T=1【转】

转自:http://bbs.ednchina.com/BLOG_ARTICLE_172024.HTM 2.4 块传输协议T=1 T=1协议中,在TAL和IC卡之间传送的命令.R-APDU和传输控制信息(例如确认信息)由块组成. 以下定义了数据链路层的块帧结构.协议的特殊选项和协议操作(包括错误处理). (1)块帧结构 字符帧的定义同前文的描述.T=1协议下,无须进行逐个字符的检验.块的结构如下所示,包括头域.数据域和尾域3个部分,都为可选项. ● 头域包括3个必选字节:        *用于标识

金融卡IC卡知识50问

1.什么是金融IC卡? 金融IC卡又称为芯片银行卡,是以芯片作为介质的银行卡.芯片卡容量大,可以存储密钥.数字证书.指纹等信息,其工作原理类似于微型计算机,能够同时处理多种功能,为持卡人提供一卡多用的便利.我行现阶段发行的是复合金融IC借记卡. 2.我行金融IC卡遵循什么标准? 我行金融IC卡遵循的标准是中国人民银行的PBOC2.0标准,即中国金融集成电路(IC)卡规范(2010年颁布). 3.金融IC卡使用是否安全? 金融IC卡遵循双重密钥动态验证,很难被复制,有效防止伪卡盗刷,安全性进一步加

智能IC卡中的文件系统

1.文件系统是COS的重要模块之一,它负责组织.管理.维护IC卡内存储的所有数据. 文件系统的设计和实现既是COS系统中最灵活.最有个性的部分,也是对系统整体结构影响最大的模块之一. 2.在IC卡内,数据的管理和维护一般通过文件系统来进行.和PC系统类似,COS的文件系统要实现的主要功能包括: * 空间的管理维护.   * 数据的有效存储.   * 数据的查找和定位.   * 数据的修改和维护. 3. 在COS系统中,文件系统是一个承上启下的模块,对底层来说实现了存储空间的管理维护,对上层完全透

比较IC卡、ID卡、M1卡、CPU卡它们之间有什么区别?

IC卡的定义 : IC(Integrated Circuit)卡是1970年由法国人Roland Moreno发明的,他第一次将可编程设置的IC芯片放于卡片中,使卡片具有更多功能.“IC卡”和“磁卡”都是从技术角度起的名字,不能将其和“信用卡”.“电话卡”等从应用角度命名的卡相混淆.自IC卡出现以后,国际上对它有多种叫法.英文名称有“Smart Card”.“IC Card”等:在亚洲特别是香港.台湾地区,多称为“聪明卡”.“智慧卡”.“智能卡”等:在我国,一般简称为“IC卡”. IC卡的分类: