RFID门禁系统

目录

一、系统概述

二、系统组成

三、C#窗体应用程序设计

四、系统工作流程

五、注意事项

六、代码如下


一、系统概述

基于C#窗体的RFID门禁系统是一种利用RFID技术进行身份验证和门禁控制的系统。它结合了C#编程语言的强大功能和RFID技术的非接触式识别能力,为用户提供了一种高效、安全的门禁管理方式。

二、系统组成

  1. RFID标签:每个授权用户都配备有一个RFID标签,该标签内置有芯片和天线,用于存储用户的身份信息和授权数据。
  2. RFID读卡器:安装在门禁系统的入口或出口处,用于读取RFID标签中的信息,并将其传输给门禁控制器。
  3. 门禁控制器:接收RFID读卡器传输的信息,并与数据库中的授权信息进行比对。如果信息匹配,则控制门禁设备(如电磁锁)的开关。
  4. C#窗体应用程序:作为系统的用户界面,用于显示系统状态、处理用户输入(如密码输入)、以及与门禁控制器进行通信。

三、C#窗体应用程序设计

  1. 界面设计
    • 使用Visual Studio等开发工具创建C#窗体应用程序。
    • 设计用户界面,包括登录窗口、状态显示窗口、设置窗口等。
    • 在界面上添加必要的控件,如文本框、按钮、标签等。
  2. 功能实现
    • 登录功能:用户通过RFID标签或输入密码进行登录。系统读取RFID标签信息或接收用户输入的密码,并与数据库中的授权信息进行比对。
    • 状态显示:实时显示门禁系统的状态,如门是否打开、是否有非法入侵等。
    • 设置功能:允许管理员对系统进行设置,如添加或删除授权用户、修改密码等。
  3. 通信实现
    • 使用串口通信(SerialPort类)或网络通信(如TCP/IP)等方式与门禁控制器进行通信。
    • 发送控制指令给门禁控制器,如开门、关门等。
    • 接收门禁控制器返回的状态信息,并在界面上进行显示。
  4. 数据库操作
    • 使用ADO.NET等数据库访问技术,与数据库进行交互。
    • 实现数据的增删改查操作,如查询授权用户信息、添加新用户等。

四、系统工作流程

  1. 用户靠近门禁系统的RFID读卡器。
  2. RFID读卡器读取用户RFID标签中的信息,并将其传输给门禁控制器。
  3. 门禁控制器将接收到的信息与数据库中的授权信息进行比对。
  4. 如果信息匹配,门禁控制器控制门禁设备打开门禁;否则,拒绝开门,并可能触发警报。
  5. C#窗体应用程序实时显示门禁系统的状态,并处理用户的登录和设置请求。

五、注意事项

  • 在设计系统时,需要充分考虑系统的安全性和稳定性。
  • 对RFID标签和读卡器的选择应根据实际需求进行,以确保系统的识别精度和读取速度。
  • 在实现数据库操作时,需要注意数据的完整性和一致性。
  • 在部署系统时,需要进行充分的测试和调试,以确保系统的正常运行。

六、代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace 高频
{    
    public partial class Form1 : Form
    {
        public delegate void showReceiveDelegate(string text); //当采用响应模式,应申明一个委托,实现不同线程的控件实验
        SerialPort com = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
        int com_num = 0;
        int timer_num, flag = 0;
        string Da,Pa = "D:\\Date.txt";
        /*-------------------------------------------------------------
         * status_num状态字
         * 1,表示读取信息
         
         --------------------------------------------------------------*/
        int status_num=0;//状态字

        public Form1()
        {
            InitializeComponent();
        }
        //窗体加载
        private void Form1_Load(object sender, EventArgs e)
        {
            //串口初始化
            cmbPort.SelectedIndex = 2;
            cmbBaudRate.SelectedIndex = 4;
            cmbDataBits.SelectedIndex = 0;
            cmbStopBits.SelectedIndex = 0;
            cmbParity.SelectedIndex = 0;
            //定时器初始化
            System.Timers.Timer t = new System.Timers.Timer(50);//实例化Timer类,设置间隔时间为1000毫秒 就是1秒;
            t.Elapsed += new System.Timers.ElapsedEventHandler(theout);  //到达时间的时候执行事件;
            t.AutoReset = true;  //设置是执行一次(false)还是一直执行(true);
            t.Enabled = true;    //是否执行System.Timers.Timer.Elapsed事件;
            timer_num = 0;
        }
        //串口打开与关闭
        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (btnOpen.Text == "打开串口")
            {
                try
                {
                    if (!com.IsOpen)
                    {
                        com.PortName = cmbPort.Text;
                        com.BaudRate = int.Parse(cmbBaudRate.Text);
                        com.DataBits = int.Parse(cmbDataBits.Text);
                        switch (cmbStopBits.SelectedIndex)
                        {
                            case 0:
                                com.StopBits = StopBits.One; break;
                            case 1:
                                com.StopBits = StopBits.Two; break;
                            case 2:
                                com.StopBits = StopBits.OnePointFive; break;
                            case 3:
                                com.StopBits = StopBits.None; break;
                        }
                        switch (cmbParity.SelectedIndex)
                        {
                            case 0: com.Parity = Parity.None; break;
                            case 1: com.Parity = Parity.Odd; break;
                            case 2: com.Parity = Parity.Even; break;
                        }

                        com.Open();//打开串口
                    }
                    btnOpen.Text = "关闭串口";
                    txtStatus.Text = "串口已打开!";
                    btnInformation.Enabled = true;
                    btnClear.Enabled = true;
                    button1.Enabled = true;
                    //button2.Enabled = true;
                    // 数据接收模式变化时,设置串口的数据接收侦听事件
                    try
                    {
                        com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);  //加载接收事件
                    }
                    catch (Exception err)
                    {
                        txtStatus.Text = err.ToString();
                    } 
                }
                catch
                { txtStatus.Text = "串口打开错误或串口不存在!"; }
            }
            else //关闭串口
                try
                {
                    if (com.IsOpen)
                        com.Close(); //关闭串口
                    btnOpen.Text = "打开串口";
                    txtStatus.Text = "串口已关闭!";
                    btnInformation.Enabled = false;
                    btnClear.Enabled = false;
                    button1.Enabled = false;
                    //button2.Enabled = false;
                }
                catch
                {
                    txtStatus.Text = "串口关闭错误或串口不存在!";
                }
        }
        //--------------------------------------------------------------------------------
        //定时器相关设置
        public void theout(object source, System.Timers.ElapsedEventArgs e)
        {
            timer_num++;
            this.BeginInvoke(new TextOption(function1));//invok 委托实现跨线程的调用            
        }
        delegate void TextOption();//定义一个委托

        void function1()
        {
            if ((timer_num > 10)&&(com_num>5))
            {
                com_num = 0;
                try
                {
                    int count = com.BytesToRead;
                    byte[] readBuffer = new byte[count];
                    com.Read(readBuffer, 0, count);
                    //String strReceive = Encoding.Default.GetString(readBuffer);  //字母、数字、汉字转换为字符串                
                    String strReceive = getStringFromBytes(readBuffer);  //转十六进制                
                    this.Invoke(new showReceiveDelegate(doShowReceive), strReceive);
                }
                catch (Exception err)
                {
                    txtStatus.Text = err.ToString();
                }                
            }
        }
        //--------------------------------------------------------------------------------
        // 响应模式时,串口接收数据事件        
        private void com_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            com_num = com.BytesToRead;
            timer_num = 0;
        }
        //异步线程处理接受的字符,显示在接收的文本框中
        public void doShowReceive(string str)
        {
            txtReceive.Text = str;
            //-----------------------------------------------------
            //----------1---------2---------3---------4---------
            //01234567890123456789012345678901234567890123456789
            //FF 55 00 00 81 01 08 07 08 50 2A 82 D5 E5 5F 58 C2
            //低频卡信息读取
            if (status_num == 1)
            {
                status_num = 0;
                int i;
                for (i = 0; i < 10; i++)
                {
                    if (str.Substring(i, 20).Equals("FF 55 00 00 81 01 08"))
                    {
                        txtInformation.Text = str.Substring(i + 21, 11);//截取4个字节

                        txtStatus.Text = "低频卡信息读取成功!";
                        break;
                    }
                }
                if (i >= 10)
                {
                    txtStatus.Text = "无法获取低频卡信息!";
                }
            }
            //-----------------------------------------------------
            //----------1---------2---------3---------4---------
            //01234567890123456789012345678901234567890123456789
            //FF 55 00 00 82 04 01 00 EE 33
            //低频卡初始化操作
            if (status_num == 2)
            {
                status_num = 0;
                int i;
                for (i = 0; i < 5; i++)
                {
                    if (str.Substring(i, 23).Equals("FF 55 00 00 82 04 01 00"))
                    {
                        txtStatus.Text = "低频卡初始化操作成功!";
                        break;
                    }
                }
                if (i >= 5)
                {
                    txtStatus.Text = "无法进行低频卡初始化操作!";
                }
            }

            //------------------------------------------------------------
            //发送命令,常规写块操作
            //----0---------1---------2---------3---------4---------5---------
            //----012345678901234567890123456789012345678901234567890123456789
            //发送FF 55 00 00 03 04 05 01 00 00 00 00 47 48
            //接收FF 55 00 00 83 04 01 00 23 8E
            if (status_num == 3)
            {
                status_num = 0;
                int i;
                for (i = 0; i < 5; i++)
                {
                    if (str.Substring(i, 20).Equals("FF 55 00 00 83 03 04"))
                    {
                        txtStatus.Text = "常规读块操作操作成功!";
                        textBox2.Text = str.Substring(i + 21, 11);//截取4个字节
                        break;
                    }
                }
                if (i >= 5)
                {
                    txtStatus.Text = "常规读块操作未成功!";
                    textBox1.Text = "";
                }
            }
            if (status_num == 4)
            {
                status_num = 0;
                int i;
                for (i = 0; i < 5; i++)
                {
                    if (str.Substring(i, 23).Equals("FF 55 00 00 83 04 01 00"))
                    {
                        txtStatus.Text = "常规写块操作成功!";
                        break;
                    }
                }
                if (i >= 5)
                {
                    txtStatus.Text = "常规写块操作未成功!";
                    textBox1.Text = "";
                }
            }
            if(status_num == 5)
            {
                status_num = 0;
                FileStream F = new FileStream(Pa,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
                StreamWriter W = new StreamWriter(F);
                W.WriteLine(textBox3.Text);
                W.WriteLine(textBox4.Text);
                W.Close();
            }

            if (status_num == 6)
            {
                status_num = 0;
                string[] a = new string[2];
                StreamReader sa = new StreamReader(Pa);

                for (int k = 0; k < 2; k++)
                {
                    a[k] = sa.ReadLine();
                }

                int i;
                for (i = 0; i < 5; i++)
                {
                    if (str.Substring(i, 20).Equals("FF 55 00 00 83 03 04"))
                    {
                        txtStatus.Text = "常规读块操作操作成功!";
                        Da = str.Substring(i + 21, 11);//截取4个字节

                        break;
                    }
                }
                if (i >= 5)
                {
                    txtStatus.Text = "常规读块操作操作未成功!";
                }

                for (int j = 1; j >= 0; j--)
                {
                    if (Da == a[j])
                    {
                        flag = 1;
                        break;
                    }
                    else
                    {
                        flag = 0;
                    }
                }

                if (flag == 1)
                {
                    flag = 0;
                    textBox8.Text = a[0];
                    textBox7.Text = a[1];
                    textBox9.Text = "比对成功,正在开门";
                }
                else
                {
                    textBox8.Text = "";
                    textBox7.Text = "";
                    textBox9.Text = "该卡无效!";
                }
            }
        }
        // 把字节数组转换为十六进制格式的字符串。
        // <param name="pByte">要转换的字节数组。</param>
        // <returns>返回十六进制格式的字符串。</returns>
        public static string getStringFromBytes(byte[] pByte)
        {
            string str = "";     //定义字符串类型临时变量。
            //遍历字节数组,把每个字节转换成十六进制字符串,不足两位前面添“0”,以空格分隔累加到字符串变量里。
            for (int i = 0; i < pByte.Length; i++)
                str += (pByte[i].ToString("X").PadLeft(2, '0') + " ");
            str = str.TrimEnd(' ');     //去掉字符串末尾的空格。
            return str;     //返回字符串临时变量。
        }
        //<summary>
        //把十六进制格式的字符串转换成字节数组。
        //</summary>
        //<param name="pString">要转换的十六进制格式的字符串</param>
        //<returns>返回字节数组。</returns>
        public static byte[] getBytesFromString(string pString)
        {
            string[] str = pString.Split(' ');     //把十六进制格式的字符串按空格转换为字符串数组。
            byte[] bytes = new byte[str.Length];     //定义字节数组并初始化,长度为字符串数组的长度。
            for (int i = 0; i < str.Length; i++)     //遍历字符串数组,把每个字符串转换成字节类型赋值给每个字节变量。
            { bytes[i] = Convert.ToByte(Convert.ToInt32(str[i], 16)); }
            return bytes;     //返回字节数组。
        }
        //------------------------------------------------------------
        //清空接收框内容
        private void btnClear_Click(object sender, EventArgs e)
        {
            txtSend.Text = "";
            txtReceive.Text = "";
            txtInformation.Text = "";
            txtStatus.Text = "数据已经清除!";
        }
        //------------------------------------------------------------
        //发送命令,获取低频卡信息
        //0---------1---------2---------3---------4---------5---------
        //012345678901234567890123456789012345678901234567890123456789
        //FF 55 00 00 01 01 00 50 74
        private void btnInformation_Click(object sender, EventArgs e)
        {
            txtSend.Text = "";
            txtReceive.Text = "";
            status_num = 1;

            String str1 = "FF 55 00 00 01 01 00 50 74";
            byte[] data = getBytesFromString(str1);
            com.Write(data, 0, data.Length);
            txtSend.Text = str1;
        }
        //------------------------------------------------------------
        //发送命令,低频卡初始化操作
        //0---------1---------2---------3---------4---------5---------
        //012345678901234567890123456789012345678901234567890123456789
        //FF 55 00 00 02 04 00 00 87
        //FF 55 00 00 82 04 01 00 EE 33
        private void button1_Click(object sender, EventArgs e)
        {
            txtSend.Text = "";
            txtReceive.Text = "";  
            status_num = 2;

            String str1 = "FF 55 00 00 02 04 00 00 87";
            byte[] data = getBytesFromString(str1);
            com.Write(data, 0, data.Length);
            txtSend.Text = str1;
        }

        public static byte[] crc16(byte[] data, int len)
        {
            byte[] temdata = new byte[2];
            int xda, xdapoly;
            byte i, j, xdabit;
            xda = 0xFFFF;
            xdapoly = 0xA001;
            for (i = 0; i < data.Length; i++)
            {
                xda ^= data[i];
                for (j = 0; j < 8; j++)
                {
                    xdabit = (byte)(xda & 0x01);
                    xda >>= 1;
                    if (xdabit == 1)
                        xda ^= xdapoly;
                }
            }
            temdata[0] = (byte)(xda & 0xFF);
            temdata[1] = (byte)(xda >> 8);
            return temdata;
        }



        private void button2_Click(object sender, EventArgs e)
        {
            txtSend.Text = "";
            txtReceive.Text = "";
            status_num = 3;
            //-------------0---------1---------2---------3--
            //-------------012345678901234567890123456789
            String str1 = "FF 55 00 00 03 03 01 00 CF F1";
            str1 = str1.Remove(21, 2);
            str1 = str1.Insert(21, comboBox1.Text); //获取块地址
            byte[] temdata1 = getBytesFromString(str1);//转换字节,准备CRC16校验
            //-----------------------------------------------
            int num_len1 = 6;//前2个字节FF 55不加入CRC校验
            int num_len2 = 6;//后2个字节50 74是校验位
            String str2 = str1.Substring(num_len1, str1.Length - num_len1 - num_len2);
            byte[] temdata2 = getBytesFromString(str2);
            byte[] temdata3 = crc16(temdata2, temdata2.Length);//CRC校验
            temdata1[temdata1.Length - 2] = temdata3[1];//填充校验位
            temdata1[temdata1.Length - 1] = temdata3[0];
            //-----------------------------------------------
            com.Write(temdata1, 0, temdata1.Length); //发到串口
            txtSend.Text = getStringFromBytes(temdata1);//显示
        }

        private void button3_Click(object sender, EventArgs e)
        {
            txtSend.Text = "";
            txtReceive.Text = "";
            status_num = 4;
            String str1 = "FF 55 00 00 03 04 05 01 00 00 00 00 47 48";
            str1 = str1.Remove(21, 2);
            str1 = str1.Insert(21, comboBox2.Text); //获取块地址
            str1 = str1.Remove(24, 11);
            str1 = str1.Insert(24, textBox1.Text); //获取写入的数据内容
            byte[] temdata1 = getBytesFromString(str1);//转换字节,准备CRC16校验
            //-----------------------------------------------
            int num_len1 = 6;//前2个字节FF 55不加入CRC校验
            int num_len2 = 6;//后2个字节50 74是校验位
            String str2 = str1.Substring(num_len1, str1.Length - num_len1 - num_len2);
            byte[] temdata2 = getBytesFromString(str2);
            byte[] temdata3 = crc16(temdata2, temdata2.Length);//CRC校验
            temdata1[temdata1.Length - 2] = temdata3[1];//填充校验位
            temdata1[temdata1.Length - 1] = temdata3[0];
            //-----------------------------------------------
            com.Write(temdata1, 0, temdata1.Length); //发到串口
            txtSend.Text = getStringFromBytes(temdata1);//显示
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
           
        }

        private void button4_Click(object sender, EventArgs e)
        {
            
            txtSend.Text = "";
            txtReceive.Text = "";
            status_num = 5;
            String str1 = "FF 55 00 00 03 04 05 01 00 00 00 00 47 48";
            str1 = str1.Remove(21, 2);
            str1 = str1.Insert(21, comboBox3.Text); //获取块地址
            str1 = str1.Remove(24, 11);
            str1 = str1.Insert(24, textBox4.Text); //获取写入的数据内容
            byte[] temdata1 = getBytesFromString(str1);//转换字节,准备CRC16校验
            //-----------------------------------------------
            int num_len1 = 6;//前2个字节FF 55不加入CRC校验
            int num_len2 = 6;//后2个字节50 74是校验位
            String str2 = str1.Substring(num_len1, str1.Length - num_len1 - num_len2);
            byte[] temdata2 = getBytesFromString(str2);
            byte[] temdata3 = crc16(temdata2, temdata2.Length);//CRC校验
            temdata1[temdata1.Length - 2] = temdata3[1];//填充校验位
            temdata1[temdata1.Length - 1] = temdata3[0];
            //-----------------------------------------------
            com.Write(temdata1, 0, temdata1.Length); //发到串口
            txtSend.Text = getStringFromBytes(temdata1);//显示
        }

        private void button5_Click(object sender, EventArgs e)
        {
            txtSend.Text = "";
            txtReceive.Text = "";
            status_num = 2;

            String str1 = "FF 55 00 00 02 04 00 00 87";
            byte[] data = getBytesFromString(str1);
            com.Write(data, 0, data.Length);
            txtSend.Text = str1;
            textBox5.Text = str1;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {

        }

        private void txtReceive_TextChanged(object sender, EventArgs e)
        {

        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void button6_Click(object sender, EventArgs e)
        {
            txtSend.Text = "";
            txtReceive.Text = "";
            status_num = 6;
            //-------------0---------1---------2---------3--
            //-------------012345678901234567890123456789
            String str1 = "FF 55 00 00 03 03 01 00 CF F1";
            str1 = str1.Remove(21, 2);
            str1 = str1.Insert(21, comboBox1.Text); //获取块地址
            byte[] temdata1 = getBytesFromString(str1);//转换字节,准备CRC16校验
            //-----------------------------------------------
            int num_len1 = 6;//前2个字节FF 55不加入CRC校验
            int num_len2 = 6;//后2个字节50 74是校验位
            String str2 = str1.Substring(num_len1, str1.Length - num_len1 - num_len2);
            byte[] temdata2 = getBytesFromString(str2);
            byte[] temdata3 = crc16(temdata2, temdata2.Length);//CRC校验
            temdata1[temdata1.Length - 2] = temdata3[1];//填充校验位
            temdata1[temdata1.Length - 1] = temdata3[0];
            //-----------------------------------------------
            com.Write(temdata1, 0, temdata1.Length); //发到串口
            txtSend.Text = getStringFromBytes(temdata1);//显示
        }
    }
}

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: RFID门禁系统源代码是一段程序代码,用于实现RFID门禁系统的功能。通常,这些代码会包括读取RFID标签、比对标签信息的代码、处理用户权限等。 RFID门禁系统是一种高效且安全的门禁管理方式。通过使用非接触式RFID卡片,门禁系统可以快速检验和识别用户信息。因此,RFID门禁系统在企业和学校等大型组织中广泛应用。 RFID门禁系统的源代码包括主程序和库文件。主程序通常使用C语言或C++语言编写,实现系统与RFID读卡器之间的通信。库文件包括一些通用的功能模块,如读取卡片信息、存储用户权限信息和用户验证等。 在实际应用中,开发人员需要根据具体需求进行修改和调整RFID门禁系统源代码。例如,当需要添加新的功能或修改旧功能时,需要在源代码中进行相应的调整。 总之,RFID门禁系统源代码是实现门禁系统功能的重要工具。这些代码由专业的开发人员编写,旨在提供高效、安全和可靠的门禁管理。 ### 回答2: RFID门禁系统源代码是一种被广泛应用于门禁系统中的技术,它采用射频识别技术来管理门禁。该系统使用一种称为RFID标签的特殊设备来存储门禁数据,这种标签可以被电子读卡器读取并与门禁系统配对。如果识别标签的信息与门禁系统的存储数据匹配,那么门禁就会自动解锁。 RFID门禁系统源代码的编写过程需要具备较高的技术能力,因为该系统需要多方面知识的结合。首先需要了解RFID技术原理、门禁应用场景和开发环境等方面的知识,其次需要深入了解程序设计和编程技能。在进行系统设计时,需要考虑识别器和标签之间的初始配对方式、数据传输和算法设计等方面的问题。 该门禁系统常用的编程语言包括C/C++、Java和Python等,开源的门禁通常使用Arduino或树莓派等嵌入式系统。此外,需要选择合适的编程工具来实现源代码的编写,如Eclipse、IDEA、Visual Studio等。 在实现门禁系统时,要注意相关安全问题,如系统数据的加密和防盗等技术措施。此外,还要确保门禁系统源代码的稳定性和可靠性,以免对使用者造成不必要的困扰。 总之,RFID门禁系统源代码编写需要学习一定的知识和技能,同时还需要注意系统的安全性、稳定性和可靠性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡剑烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值