• 本站域名:OceanCoder.cn 若您喜欢本站,请添加至收藏夹!
  • 网站少部分资源来源自网络,如有侵犯您的权益,请联系站长删除!
  • 本站所有文章,除特殊标明外,皆为本人原创,转载请注明出处,谢谢合作!
  • 本站所下载的资源,若无特殊说明,使用统一解压密码:oceancoder.cn
  • 本站已实现布局自适应,支持手机端、pad端访问,欢迎体验
  • 本站部分资源可通过微信公众号留言获取,欢迎体验

刷卡[IC卡]登录方法介绍#可用于考勤系统

工控相关 OceanCoder 2017-12-02 6754 次浏览 0个评论

一、需求

通过刷卡实现系统的登录

二、硬件介绍

1、IC卡读写器使用明华科技KRF-35系列(该系列读写器使用Com口通讯,作者使用笔记本电脑,所以又购买了RS232转USB数据线)

2、IC卡型号mifare Std 1k;符合ISO14443 /1/2/3/4 T=CL 协议

三、编程语言

C#

四、代码实现

读写器提供有mwrf32.dll,并且提供了通用函数\设备操作函数\M1卡专用函数等专用库函数。

1、引用通用库函数

            [DllImport("mwrf32.dll", EntryPoint = "rf_init", SetLastError = true,
         CharSet = CharSet.Auto, ExactSpelling = false,
         CallingConvention = CallingConvention.StdCall)]
        //说明:初始化串口通讯接口
        public static extern int rf_init(Int16 port, int baud);
        [DllImport("mwrf32.dll", EntryPoint = "rf_exit", SetLastError = true,
         CharSet = CharSet.Auto, ExactSpelling = false,
         CallingConvention = CallingConvention.StdCall)]
        //说明:    关闭通讯口
        public static extern Int16 rf_exit(int icdev);
        [DllImport("mwrf32.dll", EntryPoint = "rf_get_status", SetLastError = true,
             CharSet = CharSet.Auto, ExactSpelling = false,
             CallingConvention = CallingConvention.StdCall)]
        //说明:     返回设备当前状态
        public static extern Int16 rf_get_status(int icdev, [MarshalAs(UnmanagedType.LPArray)]byte[] state);

2、引用M1卡专用函数

[DllImport("mwrf32.dll", EntryPoint="rf_reset",  SetLastError=true,
 CharSet=CharSet.Auto, ExactSpelling=false,
 CallingConvention=CallingConvention.StdCall)]
//说明:     返回设备当前状态
public static extern Int16 rf_reset(int icdev,int msec);
[DllImport("mwrf32.dll", EntryPoint="rf_request",  SetLastError=true,
 CharSet=CharSet.Auto, ExactSpelling=false,
 CallingConvention=CallingConvention.StdCall)]
//说明:     返回设备当前状态
public static extern Int16 rf_request(int icdev, int mode, out UInt16 tagtype);
[DllImport("mwrf32.dll", EntryPoint="rf_request_std",  SetLastError=true,
 CharSet=CharSet.Auto, ExactSpelling=false,
 CallingConvention=CallingConvention.StdCall)]
//说明:     返回设备当前状态
public static extern Int16 rf_request_std(int icdev, int mode, out UInt16 tagtype);
[DllImport("mwrf32.dll", EntryPoint="rf_anticoll",  SetLastError=true,
 CharSet=CharSet.Auto, ExactSpelling=false,
 CallingConvention=CallingConvention.StdCall)]
//说明:     返回设备当前状态
public static extern Int16 rf_anticoll(int icdev, int bcnt,out uint snr);
[DllImport("mwrf32.dll", EntryPoint="rf_select",  SetLastError=true,
 CharSet=CharSet.Auto, ExactSpelling=false,
 CallingConvention=CallingConvention.StdCall)]
//说明:     返回设备当前状态
public static extern Int16 rf_select(int icdev, uint snr,out byte size);

3、编写C#卡片专用操作类

    public class CardHelper
    {
        public static int IC_DEV_HANDLER;
        public static string IC_HARD_VER;//硬件版本号
        public static string IC_SOFT_VER;//软件版本号
        public static bool TestConn(short _port, int _baudRate)
        {
            IC_DEV_HANDLER = CardCommon.rf_init(_port, _baudRate);
            bool rlt = false;
            if (IC_DEV_HANDLER > 0)
            {
                byte[] str = new byte[30];
                CardCommon.rf_get_status(IC_DEV_HANDLER, str);
                //IC_HARD_VER = System.Text.Encoding.ASCII.GetString(str);
                IC_HARD_VER = System.Text.Encoding.Default.GetString(str);
                //蜂鸣提示连接成功
                CardCommon.rf_beep(IC_DEV_HANDLER, 30);
                rlt = true;
            }
            else
                rlt = false;
            return rlt;
        }
        public static bool SeekCard(out string snCode)
        {
            UInt16 TagType=0;
            Int16 rlt; 
            uint snr=0;
            byte size;
            snCode = string.Empty;
            if (IC_DEV_HANDLER <= 0) return false;
            CardMifareOne.rf_reset(IC_DEV_HANDLER, 3);
            rlt = CardMifareOne.rf_request(IC_DEV_HANDLER, 1, out TagType);
            if (rlt != 0) return false;
            rlt = CardMifareOne.rf_anticoll(IC_DEV_HANDLER, 0,out snr);
            if (rlt != 0) return false;
            rlt = CardMifareOne.rf_select(IC_DEV_HANDLER, snr, out size);
            if (rlt != 0) return false;
            snCode = CommonF.GetNewCardStrByOld(snr.ToString());
            //CardCommon.rf_beep(IC_DEV_HANDLER, 10);
            return true;
        }
    }

4、添加时钟控件,时钟更新频率为1000毫秒,时钟事件中添加寻卡代码

//定义程序集变量
bool m_isLoginSuccess=false;
//时钟事件添加如下代码
if (!m_isLoginSuccess)
{
    string cardNum;
    if (CardHelper.SeekCard(out cardNum))
    {
     //卡片操作代码
     }
}


已有 6754 位网友参与,快来吐槽:

发表评论