티스토리 뷰

Problem#1
RFID Anti-collision, Query Tree Protocol
(RFID 충돌방지기법, 질문트리프로토콜)

#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<string>
#include<stack>
#include<fstream>

using namespace std;


int IDENTIFICATION = 0; //1개의 노드가 응답한 횟수

//스택
class Reader { // 질의 주머니

	int cycle; // 2개이상 노드가 응답한 횟수
	int IDLE; // 0개의 노드가 응답한 횟수
	int COLLISION;

	string temp; // 스택에서 꺼낸 수를 저장
	stack<string> g;

public:
	Reader();//기본생성자
	Reader(int); // 변환생성자
	Reader(Reader& R);//복사생성자

	void result();
	void creatQuery(int);  //태그들에게 보낼 질의 메세지를 만드는 함수
	string sendQuery();   //태그들에게 질의 메세지를 보내는 함수
	void responsQuery(int); //태그들로 부터 오는 응답메세지를 처리하는 함수
};
Reader::Reader() // 기본생성자
{
	cycle = 0;
	IDLE = 0;
	COLLISION = 0;
}

Reader::Reader(int n)//변환 생성자
{
	cout << "변환생성자" << endl;
}
Reader::Reader(Reader &R)//복사생성자
{
	cout << "복사생성자" << endl;
}

void Reader::creatQuery(int tagNum)//태그들에게 보낼 질의 메세지를 만드는 함수
{


	if (tagNum > 1)
	{
		g.push(temp + "1");
		g.push(temp + "0");
		temp = g.top();
		g.pop();
	}
	if (tagNum == 1 || tagNum == 0)
	{
		temp = g.top();
		g.pop();
	}

}

string Reader::sendQuery()//태그들에게 질의 메세지를 보내는 함수
{
	cout << "\n";
	cycle++;
	cout << "==== " << cycle << " cycle" << " ====" << endl;
	return temp;
}
void Reader::responsQuery(int tagNum)//태그들로 부터 오는 응답메세지를 처리하는 함수
{
	if (tagNum == 1)
	{
		IDENTIFICATION++;
	}
	else if (tagNum == 0)
	{
		IDLE++;
	}
	else
	{
		COLLISION++;
	}
}
void Reader::result()
{
	cout << "\n";
	cout << "Total " << cycle << " Cycle<s>" << endl;
	cout << IDLE << " IDLE Cycle<s>" << endl;
	cout << COLLISION << " COLLISON Cycles<s>" << endl;
	cout << IDENTIFICATION << " IDENTIFICATION Cycles<s>" << endl;
}











class Tag  // 태그 아이디를 담고 있는 변수
{
	string ID[10];
	int num; // 태그의 갯수
	int count;

public:
	Tag(); // 기본생성자
	Tag(int); // 변환생성자
	Tag(Tag& T); // 복사생성자

	void receiveQuery(string); //질의를 수신하고 처리하는 함수
	int sendReader(); //리더에게 메세지를 보내는 함수
	void tagprint(); // 태그의 정보(태그 이름과 아이디)를 출력하는 함수
	void creat_bin(int); // 태그의 아이디를 만드는 함수
};
Tag::Tag() // 기본 생성자
{
	char c;
	int i = 0;
	int n = 1;
	string buffer[6];

	ifstream is;

	is.open("qt.dat"); // 파일을 읽는다.
	cout << "\n";
	if (!is.fail()){
		cerr << "qt.dat 로부터 성공적으로 태그를 읽었습니다!" << endl;
	}

	is.get(c);
	while (!is.eof()) // 읽고 분리해서 배열에 넣는다.
	{
		if (c != 44)
		{
			buffer[i] += c;
			n++;
		}
		else
		{
			i++;
		}

		is.get(c);
	}

	num = (int)buffer[0].at(0)-'0'; // 첫번재 5를 개수에 넣는다.
	for (int i = 1; i < 6; i++) // 나머지는 태그에 넣는다
	{
		ID[i-1] = buffer[i];
		cout << "Tag"<<i-1<<": " <<ID[i - 1] << endl;
	}
	count = -1;

	is.close();

}
Tag::Tag(int n) // 변환 생성자
{
	num = n;
	creat_bin(n);
	count = -1;
}
Tag::Tag(Tag& T) // 복사생성자
{
	cout << "복사생성자" << endl;
}

void Tag::receiveQuery(string querybag) // 질의를 수신하고 처리하는 함수
{
	int i = 0;

	if (querybag.empty())
	{
		cout << "Query: e" << endl;
		for (int i = 0; i < num; i++)
		{
			cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
		}
		count = 4;
	}
	else
	{
		cout << "Query : " << querybag << endl;
		count = 0;
		for (int i = 0; i < num; i++)
		{
			if (querybag.length() == 4)
			{
				if (querybag.at(0) == ID[i].at(0) && querybag.at(1) == ID[i].at(1) && querybag.at(2) == ID[i].at(2) && querybag.at(3) == ID[i].at(3))//네번째 수
				{
					cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
					count++;
				}

			}
			else if (querybag.length() == 3)
			{
				if (querybag.at(0) == ID[i].at(0) && querybag.at(1) == ID[i].at(1) && querybag.at(2) == ID[i].at(2))//세번째 수
				{
					cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
					count++;
				}
			}
			else if (querybag.length() == 2)
			{
				if (querybag.at(0) == ID[i].at(0) && querybag.at(1) == ID[i].at(1))//두번째 수
				{
					cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
					count++;
				}
			}
			else if (querybag.length() == 1)
			{
				if (querybag.at(0) == ID[i].at(0))// 첫번째 수
				{
					cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
					count++;
				}
			}
			else
			{
				cout << "오류!!" << endl;
			}
		}
	}
}
int Tag::sendReader() // 리더에게 메시지를 보내는 함수
{
	return count;
}
void Tag::tagprint()  // 태그의 정보를 출력하는 함수
{
	for (int i = 0; i < num; i++)
	{
		cout << "Tag" << i << ": " << ID[i] << endl;
	}
}

void Tag::creat_bin(int n) // 십진수를 랜덤으로 뽑아서 2진수로 만든  
{
	int temp1[10]; //정수를 램덤으로 뽑아 저장하는 배열
	char temp2[5];

	for (int i = 0; i < n; i++)// 십진수를 0부터 15까지 태그의 개수만큼 랜덤으로 뽑는다.
	{
		temp1[i] = rand() % 15; //0~15까지 랜덤으로 뽑는다.

		for (int j = 0; j < i; j++)//중복검사
		{
			if (temp1[i] == temp1[j])
			{
				i--;
			}
		}
		_itoa_s(temp1[i], temp2, 2);

		ID[i] = temp2;

		//문자열에 4자리를 맞추기위해서 앞에 0을 넣는다.
		if (ID[i].length() == 1)
		{
			ID[i].insert(0, "000");
		}
		if (ID[i].length() == 2)
		{
			ID[i].insert(0, "00");
		}
		if (ID[i].length() == 3)
		{
			ID[i].insert(0, "0");
		}
	}
}

 전역변수 IDENTIFICATION
- 1개의 노드가 응답한 횟수를 0으로 초기화 한다.
 
 구현한 클래스 설명
 Reader 클래스는 질의주머니를 만드는 클래스 입니다.
1) 기본생성자를 실행시키고 cycle, IDLE, COLLISION 0으로 초기화.
2) void creatQuery(int tagNum)
- 태그들에게 보내는 질의를 만드는 함수입니다.
- 태그 ID가 응답한 수가 한번 초과되면 스택을 이용해서
string temp “1”,“0”을 쌓습니다.
- top temp에 넣습니다.
- 위에 쌓은 “0”을 뺍니다.
- 태그 ID 1이거나 0이면 top temp에 저장시키고
스택에서 뺍니다.
3) string sendQuery()
- 태그들에게 질의를 보내는 함수
- cycle를 출력하고 string temp를 반환한다.
4) void responsQuery(int tagNum)
- 태그들로부터 오는 응답메세지를 처리하는 함수
- 태그 ID가 응답한 횟수인 tagNum 1이면 IDENTIFICATION 1증가
- tagNum 0이면 IDLE 1증가
- tagNum 01이 아니라면 COLLISION 1증가한다.
5) void result()
- 마지막 결과를 출력해주는 함수이다.
 Tag 클래스는 태그 아이디를 담고 있는 변수입니다.
1) 기본생성자
- 파일을 실행시킬 때에는 기본생성자가 실행되어 파일을 읽고 ID
ID의 개수를 변수에 저장시킵니다.
2) 변환생성자
- ID의 개수를 입력받고 ID를 만들 함수를 호출하고 ID가 반응한 횟수를 -1
로 초기화한다. -1로 초기화하는 이유는 첫 번째로 Reader::creatQuery
호출할 때 조건에 안 들어가게 해야 하기 때문이다.
3) void receiveQuery(string querybag)
- querybag는 질의를 담고있습니다. 질의가 비어있으면 모두가 응답하고
2보다 큰 의미없는 숫자 4 ID의 응답한 횟수에 저장합니다.
- querybag가 비어있지 않으면 querybag를 출력하고 ID랑 비교해서 겹치면
몇 개인지 확인하고 저장합니다.
4) int sendReader()
- ID가 응답한 count를 반환합니다.
5) void tagprint()
- 태그의 정보를 출력하는 함수
6) void creat_bin(int n)
- 태그의 ID를 만들 개수를 입력받아 ID를 만드는 함수
- 십진수로 1~15  n개만큼 무작위로 뽑아서 이진수로 변환하여
문자열에 저장한다.
 Simulator 클래스는 프로젝트를 구현하는 클래스이다.
1) 기본생성자
- num 1번 파일 실행과 2번 사용자입력을 저장하는 변수로 0으로
초기화 시킨다.
2) void start()
- 프로그램을 시작하는 함수
- 1번을 num에 저장하면 파일실행을 구현한다.
- 2번을 num에 저장하면 사용자입력을 구현한다.
- 반복해서 IDENTIFICATION ID개수 보다 작으면 실행됩니다.
 
 구현한 메인한수 설명
- srand((unsigned int)time(NULL));// 시드값을 바꿔준다.
- Simulator를 선언하고 start()를 호출해서 프로그램을 시작한다.
 
 실행화면

'IT > Back-end' 카테고리의 다른 글

[C++] 체널 랑데부(Channel Rendezvous)  (0) 2022.03.28
[C++] Bingo game 빙고게임  (0) 2022.03.28
[C++] 무선 링크 및 개수 구하기  (0) 2022.03.28
JPA와 JDBC ?  (0) 2021.04.04
c++과 JAVA(자바) 차이점?  (0) 2021.03.27
댓글
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Total
Today
Yesterday
최근에 올라온 글
최근에 달린 댓글
공지사항
글 보관함