• 【ALB学习笔记】基于.NET环境的高频RFID卡读写设备的基本操作案例


    基于.NET环境的高频RFID卡读写设备的基本操作案例

    广东职业技术学院  欧浩源

    1、引言

            RFID高频卡在我们的日常生活中随处可见,是物联网应用中不可或缺的一个重要部分,也是全国职业院校技能大赛“物联网技术应用”赛项中重要的考查环节。从应用的层面来看,高频卡的操作没有太大难度,你需要做的是,老老实实的把基本的操作都做一遍,接着反复多做几遍,熟能生巧,然后你就可以灵活的应用了。本文通过一个具体的范例,让你轻松的彻底掌握在.NET环境下,利用C#语言对RFID高频卡进行基本操作的技术细节...

    2、本案例采用的读写设备

            市面上高频卡的读写设备五花百门,不同设备的开发方法有所不同,但大同小异,掌握一个便可举一反三。在本范例中选用的是北京新大陆时代教育科技有限公司的“M2-U010”高频读写器,也就是“物联网技术应用”国赛系统里面的设备。使用这个读写器,不用安装驱动程序,只需要把USB线连到电脑即可。但是,要进行程序开发就需要阅读《动态链接库使用说明》,以及使用“MWRDemoDll.dll”和“mwrf32.dll”这两个库文件。

    3、需要知道的高频卡知识

            高频卡的技术细节是复杂的,对于应用也帮助不大,但并不代表我们一点儿也不需要了解它。有一个部分,开发者是必须知道的,那就是高频卡的内存结构,因为你读数据的时候,要知道从那里读,写数据的时候,也要知道往哪里写。
            高频卡就是频段为13.56MHz的射频卡。该卡最早来自飞利浦公司的Mifare技术,后来这个技术成为了ISO/IDE 14443 TYPEA国际标准。
    你需要知道的是:高频卡内部有1K字节的内存,划分为可由用户单独使用的16个扇区,每个扇区有4个数据块,每块有16个字节。每个扇区都可以设置独立的密码,扇区之间互不干涉。每个扇区的块3称做尾块,包含了该扇区的密码控制信息,其余三个块一般都是数据块。扇区0的块0是个特殊块,包含了厂商的信息代码和4个字节全球唯一的卡片序列号
            另外,高频卡的操作流程也需要知道:首先通过寻卡选定一张卡片,并获得其序列号,然后就可以对指定扇区的数据块进行读写操作。在进行任何内存读写操作之前,必须通过该扇区的密钥认证。对了,读卡号是不需要密钥认证的。

    4、动态库说明的内容要点

            在“MWRDemoDll.dll”动态库中有两个类和一个枚举:
            1、MifareRFEYE类:封装了用于高频卡基本操作的方法:
            2、ResultMessage类:封装了返回值的一些信息。
            3、CardDataKind类:封装了16个扇区的枚举。
            实际上,对于高频卡的基本操作是很少的。而且设备供应商已经将这些操作的过程写好封装成库了,你在程序设计过程中需要做的就是,仔细阅读动态链接库中对应操作的方法使用说明,特别是参数和返回值,详细参阅说明文档。
            在读数据的时候需要注意:Read()方法的返回值是ResultMessage对象,读取的数据存放在该对象的Modle成员中,该成员是object类型的,所以在取出数据的时候,要将Modle成员进行显式转换为byte[ ]类型,具体的可以看后面相关的实现代码。

    5、基本操作案例的功能设计

            这是一个标准的Windows窗体应用程序,其界面设计如下:

             在窗体装载的过程中,将设备打开,右上角的读写器状态为“打开”;对控件进行初始化,“读字符串”和“读字节数据”的文本框为只读属性;四个读写按钮均为不可操作状态。。扇区和数据块的下拉列表也相应设置值好。在窗体的关闭过程中,要将设备关闭。

             如果寻卡成功,将卡号显示出来,读写按钮可以操作。

            在读数据的时候,可以看到字符串所对应的十六进制数。

    6、工程项目的源代码

    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 MWRDemoDll;
    
    namespace 高频卡基本操作
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                MifareRFEYE.Instance.ConnDevice();      //打开读写设备
                label1.ForeColor = Color.Green;
                label1.Text = "读卡器状态:打开";
    
                int[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
                foreach (int i in nums)
                {
                    comboBox1.Items.Add(i.ToString());
                }
                comboBox1.SelectedIndex = 1;
    
                for (int j = 0; j < 4; j++)
                {
                    comboBox2.Items.Add(j.ToString());
                }
                comboBox2.SelectedIndex = 0;
    
                label3.Text = "";
                textBox1.Text = "物联网技术应用";
                textBox2.ReadOnly = true;
                textBox3.ReadOnly = true;
                button2.Enabled = false;
                button3.Enabled = false;
                button4.Enabled = false;
                button5.Enabled = false;
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                MifareRFEYE.Instance.CloseDevice();     //关闭读写设备
                label1.Text = "读卡器状态:关闭";
            }
    
            //根据界面中的下拉列表选择对应的扇区
            private CardDataKind SelectCardData()
            {
                CardDataKind cdk = CardDataKind.CardID;
                switch (int.Parse(comboBox1.Text))
                { 
                    case 0:
                        cdk = CardDataKind.CardID;
                        break;
                    case 1:
                        cdk = CardDataKind.Data1;
                        break;
                    case 2:
                        cdk = CardDataKind.Data2;
                        break;
                    case 3:
                        cdk = CardDataKind.Data3;
                        break;
                    case 4:
                        cdk = CardDataKind.Data4;
                        break;
                    case 5:
                        cdk = CardDataKind.Data5;
                        break;
                    case 6:
                        cdk = CardDataKind.Data6;
                        break;
                    case 7:
                        cdk = CardDataKind.Data7;
                        break;
                    case 8:
                        cdk = CardDataKind.Data8;
                        break;
                    case 9:
                        cdk = CardDataKind.Data9;
                        break;
                    case 10:
                        cdk = CardDataKind.Data10;
                        break;
                    case 11:
                        cdk = CardDataKind.Data11;
                        break;
                    case 12:
                        cdk = CardDataKind.Data12;
                        break;
                    case 13:
                        cdk = CardDataKind.Data13;
                        break;
                    case 14:
                        cdk = CardDataKind.Data14;
                        break;
                    case 15:
                        cdk = CardDataKind.Data15;
                        break;
                }
                return cdk;
            }
    
            string strRead;
            string strWrite;
            private void button1_Click(object sender, EventArgs e)
            {
                //进行寻卡操作。
                ResultMessage resMsg = MifareRFEYE.Instance.Search();
                if (resMsg.Result == Result.Success)
                {
                    MessageBox.Show("寻卡成功!", "操作提示");
                    label3.ForeColor = Color.Blue;
                    label3.Text = resMsg.Model.ToString();      //显示卡号
                    button2.Enabled = true;
                    button3.Enabled = true;
                    button4.Enabled = true;
                    button5.Enabled = true;
                }
                else
                {
                    MessageBox.Show("寻卡失败或寻卡错误!", "操作提示");
                    label3.Text = "";
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                //首先要进行密钥验证
                if (MifareRFEYE.Instance.AuthCardPwd(null, SelectCardData()).Result == Result.Success)
                {
                    strWrite = textBox1.Text;
                    if (MifareRFEYE.Instance.WriteString(   //写入字符串
                        SelectCardData(),                   //目标扇区
                        strWrite,                           //要写入的字符串
                        int.Parse(comboBox2.Text),          //目标数据块
                        null) == 0)
                    {
                        MessageBox.Show("写入字符串成功!", "操作提示");
                        textBox1.Clear();
                    }
                    else
                    {
                        MessageBox.Show("写入字符串失败!", "操作提示");
                    }
                }
                else
                {
                    MessageBox.Show("密钥验证失败!", "操作提示");
                }
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                if (MifareRFEYE.Instance.AuthCardPwd(null, SelectCardData()).Result == Result.Success)
                {
                    strRead = MifareRFEYE.Instance.ReadString(  //读出字符串
                        SelectCardData(),                       //目标扇区
                        int.Parse(comboBox2.Text),              //目标数据块
                        null);
                    textBox2.Text = strRead;
                }
                else
                {
                    MessageBox.Show("密钥验证失败!", "操作提示");
                }
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                byte[] datWrite = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
                if (MifareRFEYE.Instance.AuthCardPwd(null, SelectCardData()).Result == Result.Success)
                {
                    if (MifareRFEYE.Instance.Write(                 //写入字节数据
                        SelectCardData(),                           //目标扇区
                        datWrite,                                   //写入的数组
                        int.Parse(comboBox2.Text)).Result == 0)     //目标数据块
                    {
                        MessageBox.Show("写入数据成功!", "操作提示");
                    }
                    else 
                    {
                        MessageBox.Show("写入数据失败!", "操作提示");
                    }
                }
                else
                {
                    MessageBox.Show("密钥验证失败!", "操作提示");
                }
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
                byte[] datRead = new  byte[16];
                ResultMessage resMsg;
                if (MifareRFEYE.Instance.AuthCardPwd(null, SelectCardData()).Result == Result.Success)
                {
                    resMsg = MifareRFEYE.Instance.Read(         //读取字节数据
                        SelectCardData(),                       //目标扇区
                        int.Parse(comboBox2.Text));             //目标数据块
                    datRead = (byte[])resMsg.Model;
                    string str = "";
                    for (int i = 0; i < 16; i++)
                    {
                        str += datRead[i].ToString("X2") + " ";
                    }
                    textBox3.Text = str;
                }
                else
                {
                    MessageBox.Show("密钥验证失败!", "操作提示");
                }
            } 
        }
    }
  • 相关阅读:
    oracle ebs应用产品安全性-交叉验证规则
    ORA-04021 timeout occurred while waiting to lock object
    ORA-04021:timeout occurred while waiting to lock object
    ebs双节点webservice部署问题
    ebs如何将客户化的PL/SQL程序发布到webservice
    adcfgclone.pl appsTier报错Unable to locate 'linkxlC' utility in path
    CS231n 作业1 SVM+softmax+两层神经网络
    ReVision: Automated Classification, Analysisand Redesign of Chart Images
    No.1 Extracting and Retargeting Color Mappings from Bitmap Images of Visualizations
    HankerRank刷题第四天(排序类型)Quicksort In-Place
  • 原文地址:https://www.cnblogs.com/ALittleBee/p/7163335.html
Copyright © 2020-2023  润新知