RFID数据传输安全性校验:Java实现奇偶校验、循环冗余校验、海明校验可视化

实验介绍

RFID中,读写区域标签间数据通信为保证通信的准确性,常采用奇偶校验、CRC冗余校验、海明码校验。本实验在学生掌握上述编码原理的基础上,设计软件模拟通信过程,实现数据监督码的计算,统计数据传输的结果。

实验目标

  1. 掌握RFID通信中常采用的数据差错及纠错方法;
  2. 通过编程实现数据监督码的计算及对接收的数据进行检验。

实验环境

  1. 操作系统:Windows XP或Win7
  2. 软件环境:IntelliJ IDEA 2023.1.3

实验流程

  1. 设计系统工作流程
  2. 编程实现
  3. 观察实验结果,给出实验结论

实验内容

软件要求实现下面功能:

1)软件随机生成100个数据,每个数据含有8个二进制位,并且显示。

2)计算100个数据对应的监督码(分别实现奇偶校验、CRC冗余校验、海明校验),并显示。

3)模拟数据传输中的干扰(对100个数据的若干二进制位随机干扰),显示干扰后的结果。

4)模拟接收方对接收的数据进行校验,显示计算得到的监督码。

5)判断哪些数据接收有误,哪些数据虽然验证无误但实际有误,统计传输正确率,并以适当的方式加以显示。

参考页面

1)奇偶校验

红色:检测出错误的数据

绿色:校验位正确但数据错误

2) 海明校验

实验代码


import javax.management.StringValueExp;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLOutput;
import java.util.Arrays;
import java.util.Random;
import javax.swing.table.TableCellRenderer;
import javax.xml.stream.events.Characters;

public class exp {
    public static void main(String[] args) {
        // 创建 JFrame 实例
        JFrame frame = new JFrame("校验");
        // 设置关闭窗口时的默认操作
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 创建 JPanel 实例
        JPanel panel = new JPanel();
        // 创建 JButton 实例
        JButton button1 = new JButton("奇偶校验");
        JButton button2 = new JButton("CRC校验");
        JButton button3 = new JButton("海明校验");
        // 将按钮添加到面板
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        // 将面板添加到窗体
        frame.getContentPane().add(panel);
        // 设置窗体的大小
        frame.setBounds(0,0,800, 700);
        // 设置窗体可见
        frame.setVisible(true);
        button1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                JFrame frame = new JFrame("奇偶校验");
                //取消布局管理器
                frame.setLayout(null);
                //绝对定位窗体的位置和大小
                frame.setBounds(0,0,800,700);
                //创建两个按钮
                JButton button1 = new JButton("奇校验");
                JButton button2 = new JButton("偶校验");
                JButton button3 = new JButton("产生随机数");
                JButton button4 = new JButton("发送数据");
                JButton button5 = new JButton("数据校验");
                JLabel label1 = new JLabel("发送数据");
                JLabel label2 = new JLabel("接收数据");
                JLabel label3 = new JLabel("校验位");
                JLabel label4 = new JLabel("校验位");

                JTextArea textArea = new JTextArea();//结果文字框
                textArea.setBounds(75,500,700,100);

                button1.setBounds(50, 50,85, 30);//按钮位置和大小
                button2.setBounds(145,50,85, 30);
                button3.setBounds(240,50,125,30);
                button4.setBounds(375,50,125,30);
                button5.setBounds(510,50,85, 30);

                label1.setBounds(75, 100, 50, 50);
                label2.setBounds(425, 100, 50, 50);
                label3.setBounds(250, 100, 50, 50);
                label4.setBounds(600, 100, 50, 50);

                //添加到容器中
                frame.add(button1);
                frame.add(button2);
                frame.add(button3);
                frame.add(button4);
                frame.add(button5);
                frame.add(label1);
                frame.add(label2);
                frame.add(label3);
                frame.add(label4);
                frame.add(textArea);
                frame.setLayout(null);


                //设置窗体大小
                frame.setSize(800,700);
                //设置窗体可见
                frame.setVisible(true);
                //数据和校验位的储存
                final int[] flag = {1};
                final String[] binaryData = new String[100];//生成的随机数
                final String[] errdata = new String[100];//干扰后发送的数据
                final String[] a = new String[100];//随机数奇校验校验码
                final String[] b = new String[100];//随机数偶校验校验码
                final String[] c = new String[100];//接收数据奇校验校验码
                final String[] d = new String[100];//接收数据偶校验校验码

                String[] columnname = new String[]{"序号","数据"};

                String[][] BinaryData1= new String[100][2];//随机数据进入table1
                for (int i = 0; i < 100; i++) {
                    BinaryData1[i][0] = Integer.toString(i);
                    BinaryData1[i][1] = binaryData[i];
                }
                JTable table1 = new JTable(BinaryData1,columnname);//随机数
                JScrollPane scrollPane1 = new JScrollPane(table1,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scrollPane1.setAutoscrolls(true);
                scrollPane1.setBounds(75,150,150,300);
                frame.add(scrollPane1);

                String[][] A1 = new String[100][2];//奇偶校验校验码进入table2
                for (int i = 0; i < 100; i++) {
                    A1[i][0] = Integer.toString(i);
                    A1[i][1] = a[i];
                }
                JTable table2 = new JTable(A1,columnname);//发送数据校验码
                JScrollPane scrollPane2 = new JScrollPane(table2,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scrollPane2.setAutoscrolls(true);
                scrollPane2.setBounds(250,150,150,300);
                frame.add(scrollPane2);

                String[][] Errdata1 = new String[100][2];//接收数据入table3
                for (int i = 0; i < 100; i++) {
                    Errdata1[i][0] = Integer.toString(i);
                    Errdata1[i][1] = errdata[i];
                }
                JTable table3 = new JTable(Errdata1,columnname);
                JScrollPane scrollPane3 = new JScrollPane(table3,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scrollPane3.setAutoscrolls(true);
                scrollPane3.setBounds(425,150,150,300);
                frame.add(scrollPane3);

                String[][] C1 = new String[100][2];//接收数据校验码入table4
                for (int i = 0; i < 100; i++) {
                    C1[i][0] = Integer.toString(i);
                    C1[i][1] = c[i];
                }
                JTable table4 = new JTable(C1,columnname);
                JScrollPane scrollPane4 = new JScrollPane(table4,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scrollPane4.setAutoscrolls(true);
                scrollPane4.setBounds(600,150,150,300);
                frame.add(scrollPane4);
                class Buttonlis1 implements ActionListener {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String[] BinaryData = generateRandomData();//生成随机数
                        for (int i = 0; i < 100; i++) {//将生成的随机数传递出
                            binaryData[i] = BinaryData[i];
                        }
                        for (int i = 0; i < 100; i++) {
                            table1.setValueAt(binaryData[i],i,1);//将随机数加入到table1
                        }
                    }
                }
                button3.addActionListener(new Buttonlis1());

                class Buttonlis2 implements ActionListener{

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        flag[0] =1;//建立一个final数组flag, 当奇校验时为一
                        String[] A = new String[100];
                        for (int i = 0; i <100; i++) {
                            A[i] = Check_j(binaryData[i]);//生成奇校验的校验码
                        }
                        for (int i = 0; i < 100; i++) {//将奇校验的校验码传递出
                            a[i] = A[i];
                        }
                        for (int i = 0; i < 100; i++) {
                            table2.setValueAt(A[i],i,1);//将校验码打印到table2
                        }
                    }
                }
                button1.addActionListener(new Buttonlis2());

                class Buttonlis3 implements ActionListener{

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String[] B = new String[100];//生成偶校验校验码
                        for (int i = 0; i < 100; i++) {
                            B[i] = Check_o(binaryData[i]);
                        }
                        for (int i = 0; i < 100; i++) {//将偶校验校验码传递出
                            b[i] = B[i];
                        }
                        for (int i = 0; i < 100; i++) {
                            table2.setValueAt(b[i],i,1);
                        }
                        flag[0]=0;//偶校验时flag为0
                    }
                }
                button2.addActionListener(new Buttonlis3());

                class Buttonlis4 implements ActionListener{

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String[] Errdata = new String[100];//将随机数据记录到errdata中
                        for (int i = 0; i < 100; i++) {
                            Errdata[i] = binaryData[i];
                        }
                        Ail(Errdata);//对errdata数据进行干扰
                        for (int i = 0; i < 100; i++) {
                            errdata[i]=Errdata[i];//将干扰过的数据传递出
                        }
                        for (int i = 0; i < 100; i++) {
                            table3.setValueAt(Errdata[i],i,1);//将干扰过的数据打印到table3
                        }

                        String[] C = new String[100];//生成奇校验校验码
                        for (int i = 0; i < 100; i++) {
                            C[i]=Check_j(errdata[i]);
                        }
                        for (int i = 0; i < 100; i++) {//将奇校验码传出
                            c[i] = C[i];
                        }
                        String[] D = new String[100];//生成偶校验校验码
                        for (int i = 0; i < 100; i++) {
                            D[i]=Check_o(errdata[i]);
                        }
                        for (int i = 0; i < 100; i++) {//将偶校验码传出
                            d[i] = D[i];
                        }
                        if(flag[0]==1){//当flag值为1时是奇校验
                            for (int i = 0; i < 100; i++) {
                                table4.setValueAt(C[i],i,1);//奇校验码进入table4
                            }

                        }
              
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值