WPF—激活Mifare S50/S70卡(射频识别)
项目分析:所谓的激活“卡”就是往卡内的指定扇区写入指定的数据,该指定的数据能够与射频模块对接,达到射频识别的效果。
硬件配置:一张未激活的S50卡 一个USB接口的读卡器(无需安装驱动)
开发环境:win10专业版 + VS2013
提供的需求文档:Winform的Demo(有源码)、USB Reader的开发文档 、第三方动态库(读卡写卡)
第一步:写了一个简单的WPF界面,因为必须要输入两遍学号,所以还写了一个跳转界面。效果如下:
以上左图为界面一,单击确认键跳转到右图的界面二,同时将界面二中第二次输入的学号同界面一输入的学号进行比较,如若不同,提示重输。
这里涉及到两个界面的如何传值问题,方法如下:
首先在界面二的后台代码中定义一个可读可写的共有属性,
public string tranTxt { get; set; } //定义一个可读可写的共有属性
接着在界面一的后台中将输入框输入的文本传给这个具有共有属性的字符串,以下这段代码写在“确认”按钮的处理事件中,
string q = txtBox1.Text; InputAgain inputagain = new InputAgain(); inputagain.tranTxt = q; //inputagain为窗口二的一个实例化对象 this.Close(); inputagain.ShowDialog();
最后在界面二的后台的“写入”按钮的处理事件中 比较两个值的大小即可,
else if (tranTxt != txtBox2.Text) { MessageBox.Show("两次输入的学号不同!"); }
至此,界面的基本逻辑基本完成。(还有一个判断输入框的文本内容是否为纯数字的逻辑,在此不再赘述。)
第二步:实现激活S50卡的逻辑
首先导入第三方的动态库,鼠标右键解决方案,选择添加“引用”,选择文件夹中的两个动态库,一直提示错误。如下:
刚开始以为第三方的动态库是由32位的编译器编译的,而我的电脑是64位的,所以行不通,后来将目标平台改成32位的还是行不通。
最后解决方法是鼠标右键解决方案,选择添加“现有项”,就可以正确导入了。
接着添加一个类,用来导入动态库中的方法。
Reader类的代码如下:
class Reader { [DllImport("function.dll")] public static extern int MF_Read(byte mode, byte blk_add, byte num_blk, [In]byte[] snr, [In]byte[] buffer);//在指定位置读取指定长度 [DllImport("function.dll")] public static extern int MF_Write(byte mode, byte blk_add, byte num_blk, [In]byte[] snr, [In]byte[] buffer);//在指定位置写入数据 }
注意,每个方法导入前都要导入一遍动态库,否则会报错。即[DllImport("function.dll")]需导入多次。。。。。。。
接着在界面二的后台代码中就可以调用动态库中的方法了,由于是Reader.cs 是静态类,所以可以直接调用。
读卡如下:
///<summary> ///读取卡内信息 ///</summary>int nRet3 = Reader.MF_Read(mode1, blk_add, num_blk, snr1, buffer1);
写卡如下:
///<summary> ///写卡 ///</summary> int nRet4 = Reader.MF_Write(mode2, blk_add2, num_blk2, snr2, buffer2);
由于写卡方法 int nRet4 = Reader.MF_Write(mode2, blk_add2, num_blk2, snr2, buffer2); 中 有个参数buffer2要求的数据类型是字节数组,而输入框输入的内容是文本字符串,需要转换成字节数组,
我的方法是,先将文本字符串转换成十进制字符串,再转换成十六进制字符串,最后转换成字节数组。
最终效果图:
至此,已经激活了这张S50的卡。(版权问题,不提供主要代码,不提供源码,如有技术问题,可以私信交流)