【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 = { , , , , , , , , , , , , , , , };
foreach (int i in nums)
{
comboBox1.Items.Add(i.ToString());
}
comboBox1.SelectedIndex = ; for (int j = ; j < ; j++)
{
comboBox2.Items.Add(j.ToString());
}
comboBox2.SelectedIndex = ; 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 :
cdk = CardDataKind.CardID;
break;
case :
cdk = CardDataKind.Data1;
break;
case :
cdk = CardDataKind.Data2;
break;
case :
cdk = CardDataKind.Data3;
break;
case :
cdk = CardDataKind.Data4;
break;
case :
cdk = CardDataKind.Data5;
break;
case :
cdk = CardDataKind.Data6;
break;
case :
cdk = CardDataKind.Data7;
break;
case :
cdk = CardDataKind.Data8;
break;
case :
cdk = CardDataKind.Data9;
break;
case :
cdk = CardDataKind.Data10;
break;
case :
cdk = CardDataKind.Data11;
break;
case :
cdk = CardDataKind.Data12;
break;
case :
cdk = CardDataKind.Data13;
break;
case :
cdk = CardDataKind.Data14;
break;
case :
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) == )
{
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 = { , , , , , , , , , , , , , , , };
if (MifareRFEYE.Instance.AuthCardPwd(null, SelectCardData()).Result == Result.Success)
{
if (MifareRFEYE.Instance.Write( //写入字节数据
SelectCardData(), //目标扇区
datWrite, //写入的数组
int.Parse(comboBox2.Text)).Result == ) //目标数据块
{
MessageBox.Show("写入数据成功!", "操作提示");
}
else
{
MessageBox.Show("写入数据失败!", "操作提示");
}
}
else
{
MessageBox.Show("密钥验证失败!", "操作提示");
}
} private void button5_Click(object sender, EventArgs e)
{
byte[] datRead = new byte[];
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 = ; i < ; i++)
{
str += datRead[i].ToString("X2") + " ";
}
textBox3.Text = str;
}
else
{
MessageBox.Show("密钥验证失败!", "操作提示");
}
}
}
}
【ALB学习笔记】基于.NET环境的高频RFID卡读写设备的基本操作案例的更多相关文章
- Hadoop学习笔记(3)——分布式环境搭建
Hadoop学习笔记(3) ——分布式环境搭建 前面,我们已经在单机上把Hadoop运行起来了,但我们知道Hadoop支持分布式的,而它的优点就是在分布上突出的,所以我们得搭个环境模拟一下. 在这里, ...
- Nutch1.7学习笔记:基本环境搭建及使用
Nutch1.7学习笔记:基本环境搭建及使用 作者:雨水,时间:2013-10-31博客地址:http://blog.csdn.net/gobitan 说明:Nutch有两个主版本1.x和2.x,它们 ...
- Linux学习笔记——基于鸟哥的Linux私房菜
Linux学习笔记--基于鸟哥的Linux私房菜 ***** ARM与嵌入式linux的入门建议 (1) 学习基本的裸机编程:ARM7或ARM9,理解硬件架构和控制原理 (这一步是绝对的根基) (2) ...
- Django:学习笔记(1)——开发环境配置
Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...
- Qt学习虚拟机--基于MSYS2-MinGW环境并带有各种开源的软件库!
Qt学习虚拟机--基于MSYS2-MinGW环境并带有各种开源的软件库!虚拟机地址,VM10和以上:http://pan.baidu.com/s/1slcTA49包含两个分卷压缩包,加起来5GB多. ...
- ELK-6.5.3学习笔记–elk基础环境安装
本文预计阅读时间 13 分钟 文章目录[隐藏] 1,准备工作. 2,安装elasticsearch. 3,安装logstash. 4,安装kibana 以往都是纸上谈兵,毕竟事情也都由部门其他小伙伴承 ...
- Flink学习笔记:Flink开发环境搭建
本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...
- 【自动化学习笔记】_环境搭建Selenium2+Eclipse+Java+TestNG_(一)
目录 第一步 安装JDK 第二步 下载Eclipse 第三步 在Eclipse中安装TestNG 第四步 下载Selenium IDE.SeleniumRC.IEDriverServer 第五步 下 ...
- blfs(systemd版本)学习笔记-为桌面环境构建xorg服务
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs准备使用桌面环境,首先需要构建xorg服务 xorg服务项目地址:http://www.linuxfromscratch. ...
随机推荐
- Java ClassLoader 原理分析
一.ClassLoader(类加载器)的作用 如果一个程序包含不止一个class文件,那么当程序启动时,带有main方法的类的class文件作为程序入口先被JVM加载,然后根据程序调用的需要,再逐步进 ...
- 1.Java第一课:初识java
今天也算是正式地开始学习Java了,一天学的不是太多,旨在入门了解Java.还好现在学的都是基础,也能赶得上进度,希望以后能一直保持这种精神状态坚持学下去.下面就简单来说说今天所学的内容吧. 1计算机 ...
- VR全景,零售业冬天里的一把火——全景智慧城市
对今天的中国来说,寻找经济转型的突破口,寻找经济权力的新霸主,零售业应该当仁不让. 零售业正在经历一场脱胎换骨的改造.一方面零售额达到前所未有的水平,另一方面,传统零售商也面临诸多挑战,其中之一,便是 ...
- JVM-6.即时编译器
一.即时编译器 二.运行模式 三.基本原理 四.编译优化技术 五.Java与C/C++的编译器对比 六.参考 一.即时编译器 1.在部分虚拟机(如Hotspot.IBM J9)中,Java ...
- JavaWeb系列:Servlet
个人整理,欢迎转载与批评建议,转载请添加索引,谢谢. ---------------------------------------------------------------2017.06.10 ...
- javaCV开发详解之技术杂烩:javaCV能帮我们做什么?能实现什么功能?ffmpeg和openCV能实现功能,javaCV如何做到更快、更简单的实现相应的功能?等等一堆实用话题
前言: 该篇文章旨在帮助刚接触javaCV的盆友系统的认识音视频.javaCV.图像处理相关的体系知识和一些实用的知识. 序: javaCV早期因为内置了openCV库,所以常用来做图像识别应用,现在 ...
- spring-boot开发:使用内嵌容器进行快速开发及测试
一.简述一下spring-boot微框架 1.spring-boot微框架是什么? 大家都知道,在使用spring框架进行应用开发时需要很多*.xml的初始化配置文件,而springBoot就是用来简 ...
- centOS6.4安装python3.5,并且安装pip
前言: 如果你也是用的centos系统,打算装python3.0以上版本,再装python下载工具pip,那么恭喜你,你可能也会像我一样遇到各种各样的问题! 另外非常重要的一点:centos都会自带p ...
- Python----Windows环境下安装Flask
Flask是Python中web开发的一个轻框架,掌握起来比较简单,想体验一下,先从安装Flask开始. 我是在Widows环境下安装的Flask,在Linux环境下也一样,无非就是安装几个依赖和开发 ...
- 探索Windows命令行系列(2):命令行工具入门
1.理论基础 1.1.命令行的前世今生 1.2.命令执行规则 1.3.使用命令历史 2.使用入门 2.1.启动和关闭命令行 2.2.执行简单的命令 2.3.命令行执行程序使用技巧 3.总结 1.理论基 ...