首页 > 技术文章 > 实训五飞利浦S50卡数值操作编程实训

wxb293 2020-07-12 11:05 原文

实训五飞利浦S50卡数值操作编程实训

一、实训目的

1、掌握飞利浦S50卡数据值段初始化的编程方法。

2、掌握飞利浦S50卡数据值段增值、减值的编程方法。

3、掌握飞利浦S50卡读取数据值段数据的编程方法,并深刻理解数据值段的存储格式。

二、实训设备

1、笔记本电脑,Windows 7或Win10操作系统,Jdk+Eclipse+WindowBuilder软件开发环境。

2、BC750AS RFID读写器,飞利浦S50 空白卡。

三、实训内容和步骤

1、新建项目

进入Eclipse后,单击菜单“文件--新建--项目…”,或在起始页中单击“新建项目…”,打开新建项目窗口,选择“WindowBuilder—SWT Designer—SWT/JFace Java Project”,然后单击下一步,输入项目名称:MF1Card_PurseTest20160211XX,然后单击“确定”按钮。

2、新建应用程序窗口

选中新建项目中的“src”,单击菜单“文件—新建—其他…”,打开“新建”对话框,选择“SWT—Application Window”,单击“下一步”,打开“New SWT Application”对话框。

 

 

 

3、设计程序界面

从解决方案资源管理器窗口中双击“PurseTest.java”,选择Design视图,先修改窗口的标题为“MF1Card_PurseTest 16物联网1班 xxx 20160211xx”,然后从工具箱中添加控件: 6个标签(label),5个文本框(Text)和7个按钮(button),修改控件的名称(Name)和显示的文本(text),进行适当的布局调整,使各控件整齐美观。

 

 

 4、拷贝外部DLL文件和库文件夹(lib)

将外部DLL文件(BcHidDevice.dll和hfrdapi.dll)拷贝到项目文件夹中的“bin”目录下。

将库文件夹(lib)拷贝到实训项目的根文件夹中,将项目库文件的引用位置改为项目中lib文件夹中的库文件。

5、编写代码

(1)编写导入外部DLL和公用函数的代码,参照下图所示,将后面给出的源代码拷贝到正确的位置。

 

 

 

 

 

 

 ① 复制引用外部DLL的代码段:

   //Load DLL Library

    public interface ReaderLib extends StdCallLibrary

    {

       ReaderLib INSTANCE = (ReaderLib)Native.loadLibrary("hfrdapi",ReaderLib.class);

 

        int Sys_Open(int[] device, int index, short vid, short pid);

        int Sys_Close(int[] device);

        boolean Sys_IsOpen(int device);

        int Sys_SetLight(int device, byte color);

        int Sys_SetBuzzer(int device, byte msec);

        int Sys_SetAntenna(int device, byte mode);

        int Sys_InitType(int device, byte type);

       

        int TyA_Request(int device, byte mode , short[] pTagType);

        int TyA_Anticollision(int device, byte bcnt, byte[] pSnr, byte[] pLen);

        int TyA_Select(int device, byte[] pSnr, byte snrLen, byte[] pSak);

        int TyA_Halt(int device);

        int TyA_CS_Authentication2(int device, byte mode, byte block, byte[] pKey);

        int TyA_CS_Read(int device, byte block, byte[] pData, byte[] pLen);

        int TyA_CS_Write(int device, byte block, byte[] pData);

        int TyA_UID_Write(int device, byte[] pData);

      int TyA_CS_InitValue(int device,byte block,int nDecValue);

      int TyA_CS_Increment(int device, byte block,int nDecValue);

      int TyA_CS_Decrement(int device, byte block, int nDecValue);

      int TyA_CS_ReadValue(int device, byte block,int[] nDecValue);

    }

  ② 复制字节数组转十六进制字符串的函数   

// 单个字节转换为十六进制字符.

    // <param name="ib">字节</param>

    // <returns>转换好的字符.</returns>

    private static String byteHEX(Byte ib)

    {

        String _str = "";       

            char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',

          'B', 'C', 'D', 'E', 'F' };

            char[] ob = new char[2];

            ob[0] = Digit[(ib >> 4) & 0X0F];

            ob[1] = Digit[ib & 0X0F];

            _str = new String(ob);      

        return _str;

    }

   

    //字节数组转换为十六进制字符串

    private static String ToHexString(byte[] bytes)

    {

        String hexString = "";

        for (int i = 0; i < bytes.length; i++)

            hexString += byteHEX(bytes[i]);

        return hexString;

    }

            

(2)编写“连接”按钮单击事件监听程序。在界面设计窗口中,双击“连接”按钮,或单击右键,选择“Add Event Handler--WidgetSelected”,进入代码编辑界面,参照下图所示,将后面给出的源代码拷贝到正确的位置。

 

 

 

 

 

 

 

 

 

 

 复制“连接”按钮的单击事件程序

// 复制连接按钮的单击事件程序

            int status;

            boolean bStatus;

 

            // =================== Connect the reader ===================

            // Check whether the reader is connected or not

            // If the reader is already open , close it firstly

            bStatus = ReaderLib.INSTANCE.Sys_IsOpen(g_hDevice[0]); // 判断是否已打开?

            if (bStatus == true) {

                status = ReaderLib.INSTANCE.Sys_Close(g_hDevice); // 如果已打开,则先关闭

                if (status != 0) {

                   lblTips.setText("Sys_Close failed !"); // 如果关闭失败,则报错

                   return;

                }

            }

 

            // Connect

            status = ReaderLib.INSTANCE.Sys_Open(g_hDevice, 0,

                   (short) 0x0416, (short) 0x8020);

            if (status != 0) {

                lblTips.setText("Sys_Open failed !");

                return;

            }

 

            // ========== Init the reader before operating the card

            // Close antenna of the reader

            status = ReaderLib.INSTANCE.Sys_SetAntenna(g_hDevice[0],

                   (byte) 0);

            if (status != 0) {

                lblTips.setText("Sys_SetAntenna failed !");

                return;

            }

            // Appropriate delay after Sys_SetAntenna operating

            try {

                Thread.sleep(5);

            } catch (Exception e1) {

            }

 

            // Set the reader's working mode

            status = ReaderLib.INSTANCE.Sys_InitType(g_hDevice[0],

                   (byte) 'A');

            if (status != 0) {

                lblTips.setText("Sys_InitType failed !");

                return;

            }

            // Appropriate delay after Sys_SetAntenna operating

            try {

                Thread.sleep(5);

            } catch (Exception e2) {

            }

 

            // Open antenna of the reader

            status = ReaderLib.INSTANCE.Sys_SetAntenna(g_hDevice[0],

                   (byte) 1);

            if (status != 0) {

                lblTips.setText("Sys_SetAntenna failed !");

                return;

            }

            // Appropriate delay after Sys_SetAntenna operating

            try {

                Thread.sleep(5);

            } catch (Exception e3) {

            }

 

            // ==================== Success Tips ====================

            // Beep 200 ms

            status = ReaderLib.INSTANCE.Sys_SetBuzzer(g_hDevice[0],

                   (byte) 20);

            if (status != 0) {

                lblTips.setText("Sys_SetBuzzer failed !");

                return;

            }

            // Tips

            lblTips.setText("Connect reader succeed !");

(3)编写“读卡号”按钮单击事件监听程序。在界面设计窗口中,双击“读卡号”按钮,进入代码编辑界面,复制下图框线中的内容。

 

 

 

 

 复制“读卡号”按钮单击事件监听程序

// 复制寻卡按钮单击事件程序

            int status;

            byte mode = 0x52;

            short[] TagType = new short[1];

            byte bcnt = 0;

            byte snr[] = new byte[16];

            byte len[] = new byte[1];

            byte sak[] = new byte[1];

 

            // Check whether the reader is connected or not

            if (false == ReaderLib.INSTANCE.Sys_IsOpen(g_hDevice[0])) {

                lblTips.setText("Please connect the device firstly !");

                return;

            }

 

            txtCardNo.setText("");

            // Request card

            status = ReaderLib.INSTANCE.TyA_Request(g_hDevice[0], mode,

                   TagType);// search all card

            if (status != 0) {

                lblTips.setText("TyA_Request failed !");

                return;

            }

            // Anticollision

            status = ReaderLib.INSTANCE.TyA_Anticollision(g_hDevice[0],

                   bcnt, snr, len);// return serial number of card

            if (status != 0 || len[0] != 4) {

                lblTips.setText("TyA_Anticollision failed !");

                return;

            }

            String str = "";

            for (int i = 0; i < 4; i++) {

                str = str + String.format("%02X", snr[i]);

            }

            txtCardNo.setText(str);

 

            // Select card

            status = ReaderLib.INSTANCE.TyA_Select(g_hDevice[0], snr,

                   len[0], sak);// lock ISO14443-3 TYPE_A

            if (status != 0) {

                lblTips.setText("TyA_Select failed !");

                return;

            }

 

            // Tips

            lblTips.setText("Request card succeed !");

(4)编写“写初值”按钮单击事件监听程序。在界面设计窗口中,双击“写初值”按钮,进入代码编辑界面,输入下图框线中的内容。

 

 

 

 

 

 

 (5)编写“充值”按钮单击事件监听程序。在界面设计窗口中,双击“充值”按钮,进入代码编辑界面,输入下图框线中的内容。

 

 

 

 

 

 

 

(6)编写“扣款”按钮单击事件监听程序。在界面设计窗口中,双击“扣款”按钮,进入代码编辑界面,输入下图框线中的内容。

 

 

 

 

 

 

 (7)编写“读余额”按钮单击事件监听程序。在界面设计窗口中,双击“读余额”按钮,进入代码编辑界面,输入下图框线中的内容。

 

 

 

 

 

 

 (8)编写“读块数据”按钮单击事件监听程序。在界面设计窗口中,双击“读数据块”按钮,进入代码编辑界面,输入下图框线中的内容。

 

 

 

 

 

 

 

 

 5、运行调试

(1)将BC750AS RFID读写器接入电脑的USB接口,蜂鸣器响一声,说明USB连接正确。

(2)录入编辑完成后,单击工具栏中的“启动”按钮,测试各个按钮的功能,检查程序的运行情况。

 

 6、将编写、调试完成的源程序(项目文件夹)压缩为MF1Card_PurseTest20160211XX.rar,作为实训题的附件上传。

四、实训总结

1、一般数据块和值段数据块的存储格式有什么区别?

2、值段数据是否可以存储浮点数(包含小数部分)?如何解决?

3、简述本次实训的收获。

推荐阅读