实验介绍
RFID中,读写区域标签间数据通信为保证通信的准确性,常采用奇偶校验、CRC冗余校验、海明码校验。本实验在学生掌握上述编码原理的基础上,设计软件模拟通信过程,实现数据监督码的计算,统计数据传输的结果。
实验目标
- 掌握RFID通信中常采用的数据差错及纠错方法;
- 通过编程实现数据监督码的计算及对接收的数据进行检验。
实验环境
- 操作系统:Windows XP或Win7
- 软件环境:IntelliJ IDEA 2023.1.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
}
}