【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("密鑰驗證失敗!", "操作提示");
            }
        } 
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM